简介
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'