go-kratos / kratos

Your ultimate Go microservices framework for the cloud-native era.
https://go-kratos.dev
MIT License
23.37k stars 4.01k forks source link

帮看下discovery+ rpc 配置使用姿势是有什么问题吗? #94

Closed Angel-fund closed 5 years ago

Angel-fund commented 5 years ago

discovery+ rpc 使用流程 我是这样理解的;

启动discovery 服务节点(7171), 然后把服务(rpc)注册到discovery上面

入口文件 cmd/main.go

dis := discovery.New(app.Conf.Discovery)
resolver.Register(dis)

ins := &naming.Instance{
        Zone:     "sh001",
        Env:      "dev",
        AppID:    "api.service",
        Addrs: []string{
            "http://172.0.0.1:8000",
            "grpc://127.0.0.1:9000",
        },
        LastTs:   time.Now().Unix(),
        Metadata: map[string]string{
            "weight":      "10",
        },
    }
// 注册服务
disCancel, err = dis.Register(context.Background(), ins)
if err != nil {
    panic(err)
}

rpc 客户端

func newAccountClient(cfg *app.GRPCConf) api.DemoClient {
    conn, err := warden.NewClient(cfg.WardenConf).Dial(context.Background(), "discovery://default/api.service")
    if err != nil {
        panic(err)
    }
    return api.NewDemoClient(conn)
}

rpc 服务端

func New(svc *service.Service) *warden.Server {
    var rc struct {
        Server *warden.ServerConfig
    }
    if err := paladin.Get("grpc.toml").UnmarshalTOML(&rc); err != nil {
        if err != paladin.ErrNotExist {
            panic(err)
        }
    }
    ws := warden.NewServer(rc.Server)
    pb.RegisterDemoServer(ws.Server(), svc)
    ws, err := ws.Start()
    if err != nil {
        panic(err)
    }
    return ws
}

启动后狂打下面的信息, 似乎发现不了这个rpc服务,是我使用姿势有问题马

discovery: successfully polls(http://127.0.0.1:7171/discovery/polls?appid=infra.discovery&env=dev&hostname=dev&latest_timestamp=0) instances ({"infra.discovery":{"zone_instances":null,"latest_timestamp":1557366391671257157,"err":""}})

配置文件

[discovery]
  nodes = ["127.0.0.1:7171"]
  zone = "sh001"
  env = "dev"
tsingson commented 5 years ago

服务注册的 Region 配置是什么?

tsingson commented 5 years ago

说一下, discovery 启动参数或配置文件里, region 是关键参数, 就像 /region/zone/env/appID 这样, /region 是根路径, 如果 region 缺失或匹配不对, 下面的 appID 是找不到匹配项的

Angel-fund commented 5 years ago

说一下, discovery 启动参数或配置文件里, region 是关键参数, 就像 /region/zone/env/appID 这样, /region 是根路径, 如果 region 缺失或匹配不对, 下面的 appID 是找不到匹配项的

./discovery -conf discovery-example.toml -alsologtostderr discovery启动用的是 示例默认的配置

nodes = ["127.0.0.1:7171"]

# 本可用区zone(一般指机房)标识
[env]
region = "sh"
zone = "sh001"
host = "test1"
DeployEnv = "dev"

注册参数

ins := &naming.Instance{
        Region:   "sh",
        Zone:     "sh001",
        Env:      "dev",
        Hostname: "test1",
        AppID:    "api.service",
        Addrs: []string{
            "http://172.0.0.1:8000",
            "grpc://127.0.0.1:9000",
        },
    }

注册前貌似 要 res := dis.Build("api.service") 做一下这样的操作, 文档貌似也没说要这样做, 不然报 http: no Host in request URL, 然后注册又报

discovery: client.Get(http://127.0.0.1:7171/discovery/polls?appid=infra.discovery&appid=api.service&env=dev&hostname=test1&latest_timestamp=1557366391671257157&latest_timestamp=0) get error code(-404)

注册配置参数, 和discovery 启动参数是一直了吧

tonybase commented 5 years ago

先看看服务发现有那些已经注册的服务: http://127.0.0.1:7171/discovery/fetch/all

然后再看看服务参数是否有对应上了

lintanghui commented 5 years ago

注册前貌似 要 res := dis.Build("api.service") 做一下这样的操作, 文档貌似也没说要这样做, 不然报 http: no Host in request URL, 然后注册又报

注册的时候不需要build dis.build 是声明你需要依赖这个服务然后discovery会watch这个服务的变更 报404 是你依赖的服务不存在 通过 @tonyboxes 的方法fetch/all 看下都注册进去了哪些服务。

Angel-fund commented 5 years ago

哈哈可以了 谢谢各位, 还是配置问题 discovery.New(conf) conf 中少了 一个region 参数, 经@tsingson 提点,看了下 goim 启动 参数是从 nohup target/logic -conf=target/logic.toml -region=sh 命令行注入的