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'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章