go-discovery服务注册与发现

简介

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'

猜你喜欢

转载自blog.csdn.net/luslin1711/article/details/106236777