簡介
go-discovery 是bilibili開源的服務註冊與發現中心,參考Eureka設計。
項目地址:https://github.com/bilibili/discovery
集羣部署
env
go1.12.x (and later)
build
cd $GOPATH/src
git clone https://github.com/bilibili/discovery.git
cd discovery/cmd/discovery
go build
run
在本機開啓了三個進程,進行集羣部署
discovery01.toml
# 同一discovery集羣的所有node節點地址,包含本node
nodes = ["192.168.1.88:7171","192.168.1.88:7172","192.168.1.88:7173"]
enableprotect=false
# 本可用區zone(一般指機房)標識
[env]
region = "sh"
zone = "sh001"
host = "test1" # discovery02.toml 將這裏改爲test2 ;discovery03.toml 將這裏改爲test3
DeployEnv = "dev"
# 其他可用區zone訪問host和其標識
# [zones]
# "sh002" = ["10.2.0.10:7171", "10.2.0.11:7171", "10.2.0.12:7171"]
# "sh003" = ["10.3.0.10:7171", "10.3.0.11:7171", "10.3.0.12:7171"]
# 本節點監聽端口
# 注意:ip別配置爲0.0.0.0或者127.0.0.1
[httpServer]
addr = "192.168.1.88:7171" # discovery02.toml 將這裏改爲192.168.1.88:7172 ;discovery03.toml 將這裏改爲192.168.1.88:7173
timeout="40s"
# 當前節點同步其他節點使用的http client
# dial 連接建立超時時間
# keepAlive 連接複用保持時間
[httpClient]
dial = "1s"
keepAlive = "120s"
timeout="40s"
開啓3個窗口,或使用tumx,運行命令
./discovery -conf discovery01.toml -confkey discovery01.toml
./discovery -conf discovery02.toml -confkey discovery02.toml
./discovery -conf discovery03.toml -confkey discovery03.toml
在瀏覽器中打開http://192.168.1.88:7171/discovery/fetch/all
可以看到
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"infra.discovery":[
{
"region":"sh",
"zone":"sh001",
"env":"dev",
"appid":"infra.discovery",
"hostname":"test2",
"addrs":[
"http://192.168.1.88:7171"
],
"version":"",
"metadata":null,
"status":1,
"reg_timestamp":1589945365163804491,
"up_timestamp":1589943919415703511,
"renew_timestamp":1589959015167947127,
"dirty_timestamp":1589945365163804491,
"latest_timestamp":1589945365163804491
},
{
"region":"sh",
"zone":"sh001",
"env":"dev",
"appid":"infra.discovery",
"hostname":"test1",
"addrs":[
"http://192.168.1.88:7172"
],
"version":"",
"metadata":null,
"status":1,
"reg_timestamp":1589941905459043400,
"up_timestamp":1589941905459043400,
"renew_timestamp":1589959005462512261,
"dirty_timestamp":1589941905459043400,
"latest_timestamp":1589941905459043400
},
{
"region":"sh",
"zone":"sh001",
"env":"dev",
"appid":"infra.discovery",
"hostname":"test3",
"addrs":[
"http://192.168.1.88:7173"
],
"version":"",
"metadata":null,
"status":1,
"reg_timestamp":1589941931278988605,
"up_timestamp":1589941931281818784,
"renew_timestamp":1589959031283449287,
"dirty_timestamp":1589941931278988605,
"latest_timestamp":1589941931278988605
}
]
}
}
說明配置成功了
API
項目使用bilibili開源的kratos作爲框架,所以可以查看http://192.168.1.88:7171/metadata 看所有的url路徑
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"/debug/pprof/":{
"method":"GET"
},
"/debug/pprof/allocs":{
"method":"GET"
},
"/debug/pprof/block":{
"method":"GET"
},
"/debug/pprof/cmdline":{
"method":"GET"
},
"/debug/pprof/goroutine":{
"method":"GET"
},
"/debug/pprof/heap":{
"method":"GET"
},
"/debug/pprof/mutex":{
"method":"GET"
},
"/debug/pprof/profile":{
"method":"GET"
},
"/debug/pprof/symbol":{
"method":"GET"
},
"/debug/pprof/threadcreate":{
"method":"GET"
},
"/debug/pprof/trace":{
"method":"GET"
},
"/discovery/cancel":{
"method":"POST"
},
"/discovery/fetch":{
"method":"GET"
},
"/discovery/fetch/all":{
"method":"GET"
},
"/discovery/fetchs":{
"method":"GET"
},
"/discovery/nodes":{
"method":"GET"
},
"/discovery/poll":{
"method":"GET"
},
"/discovery/polls":{
"method":"GET"
},
"/discovery/register":{
"method":"POST"
},
"/discovery/renew":{
"method":"POST"
},
"/discovery/set":{
"method":"POST"
},
"/metadata":{
"method":"GET"
},
"/metrics":{
"method":"GET"
}
}
}
以debug開頭的都是服務監控相關,以discovery開頭的則是服務有關url
字段定義
字段 | 說明 |
---|---|
zone | 機房服務地區標識,用於多機房部署區分數據中心 |
env | 環境信息,(例如:fat1,uat ,pre ,prod)分別對應fat環境 集成環境,預發佈和線上 |
appid | 服務唯一標識。【業務標識.服務標識[.子服務標識]】 全局唯一,禁止修改 |
hostname | instance主機標識 |
addrs | 服務地址 格式爲 scheme://ip:port,支持多個協議地址。如 grpc://127.0.0.1:8888, http://127.0.0.1:8887 |
color | 服務標記,可用於集羣區分,業務灰度流量選擇集羣 |
version | 服務版本號信息 |
metadata | 服務自定義擴展元數據,格式爲{“key1”:“value1”},可以用於傳遞權重,負載等信息 使用json格式傳遞。 { “weight":“10”,“key2”:“value2”} |
錯誤碼定義ecode
錯誤碼 | 說明 |
---|---|
0 | 成功 |
-304 | 實例信息無變化 |
-400 | 請求參數錯誤 |
-404 | 實例不存在 |
-409 | 實例信息不一致 |
-500 | 未知錯誤 |
註冊register
HTTP
POST http://HOST/discovery/register
請求參數
參數名 | 必選 | 類型 | 說明 |
---|---|---|---|
zone | true | string | 可用區 |
env | true | string | 環境 |
appid | true | string | 服務名標識 |
hostname | true | string | 主機名 |
addrs | true | []string | 服務地址列表 |
status | true | int | 狀態,1表示接收流量,2表示不接收 |
color | false | string | 灰度或集羣標識 |
metadata | false | json string | 業務自定義信息 必須爲map[string]string 的json格式 |
返回結果
*****成功*****
{
"code":0,
"message":""
}
****失敗****
{
"code":-400,
"message":"-400"
}
CURL
curl 'http://127.0.0.1:7171/discovery/register' -d "zone=sh1&env=test&appid=provider&hostname=myhostname&status=1&addrs=http%3A%2F%2F172.1.1.1%3A8000&addrs=grpc%3A%2F%2F172.1.1.1%3A9999&version=111&metadata=%7B%22weight%22%3A10%7D"
心跳renew
HTTP
POST http://HOST/discovery/renew
請求參數
參數名 | 必選 | 類型 | 說明 |
---|---|---|---|
zone | true | string | 可用區 |
env | true | string | 環境 |
appid | true | string | 服務名標識 |
hostname | true | string | 主機名 |
返回結果
*****成功*****
{
"code":0,
"message":""
}
****失敗****
{
"code":-400,
"message":"-400"
}
CURL
curl 'http://127.0.0.1:7171/discovery/renew' -d "zone=sh1&env=test&appid=provider&hostname=myhostname"
下線cancel
HTTP
POST http://HOST/discovery/cancel
請求參數
請求參數
參數名 | 必選 | 類型 | 說明 |
---|---|---|---|
zone | true | string | 可用區 |
env | true | string | 環境 |
appid | true | string | 服務名標識 |
hostname | true | string | 主機名 |
返回結果
*****成功*****
{
"code":0,
"message":""
}
****失敗****
{
"code":-400,
"message":"-400"
}
CURL
curl 'http://127.0.0.1:7171/discovery/cancel' -d "zone=sh1&env=test&appid=provider&hostname=myhostname"
獲取實例fetch
HTTP
GET http://HOST/discovery/fetch
請求參數
參數名 | 必選 | 類型 | 說明 |
---|---|---|---|
zone | false | string | 可用區,不傳返回所有zone的 |
env | true | string | 環境 |
appid | true | string | 服務名標識 |
status | true | int | 狀態,1表示接收流量,2表示不接收, 3表示所有狀態 |
返回結果
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"instances":{
"sh001":[
{
"region":"sh",
"zone":"sh001",
"env":"dev",
"appid":"infra.discovery",
"hostname":"test2",
"addrs":[
"http://192.168.1.88:7171"
],
"version":"",
"metadata":{
},
"status":1,
"reg_timestamp":1589945365164441427,
"up_timestamp":1589943919415703511,
"renew_timestamp":1589960245168414093,
"dirty_timestamp":1589945365163804491,
"latest_timestamp":1589945365164441427
}
]
}
}
}
CURL
curl 'http://127.0.0.1:7171/discovery/fetch?zone=sh1&env=test&appid=provider&status=1'
批量獲取實例fetchs
HTTP
GET http://HOST/discovery/fetchs
請求參數
參數名 | 必選 | 類型 | 說明 |
---|---|---|---|
zone | false | string | 可用區,不傳返回所有zone的 |
env | true | string | 環境 |
appid | true | []string | 服務名標識 |
status | true | int | 狀態,1表示接收流量,2表示不接收, 3表示所有狀態 |
返回結果
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"instances":{
"sh001":[
{
"region":"sh",
"zone":"sh001",
"env":"dev",
"appid":"infra.discovery",
"hostname":"test2",
"addrs":[
"http://192.168.1.88:7171"
],
"version":"",
"metadata":{
},
"status":1,
"reg_timestamp":1589945365164441427,
"up_timestamp":1589943919415703511,
"renew_timestamp":1589960245168414093,
"dirty_timestamp":1589945365163804491,
"latest_timestamp":1589945365164441427
}
]
}
}
}
CURL
curl 'http://127.0.0.1:7171/discovery/fetchs?zone=sh1&env=test&appid=provider&appid=provider2&status=1'
獲取全部實例fetch/all
HTTP
GET http://HOST/discoveryfetch/all
請求參數
無
返回結果
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"instances":{
"sh001":[
{
"region":"sh",
"zone":"sh001",
"env":"dev",
"appid":"infra.discovery",
"hostname":"test2",
"addrs":[
"http://192.168.1.88:7171"
],
"version":"",
"metadata":{
},
"status":1,
"reg_timestamp":1589945365164441427,
"up_timestamp":1589943919415703511,
"renew_timestamp":1589960245168414093,
"dirty_timestamp":1589945365163804491,
"latest_timestamp":1589945365164441427
}
]
}
}
}
CURL
curl 'http://127.0.0.1:7171/discovery/fetch/all
獲取node節點
獲取node節點
HTTP
GET http://HOST/discovery/nodes
請求參數
無
返回結果
{
"code":0,
"message":"0",
"ttl":1,
"data":[
{
"addr":"192.168.1.88:7171",
"status":0,
"zone":"sh001"
},
{
"addr":"192.168.1.88:7172",
"status":0,
"zone":"sh001"
},
{
"addr":"192.168.1.88:7173",
"status":0,
"zone":"sh001"
}
]
}
CURL
curl 'http://127.0.0.1:7171/discovery/nodes'