stack-labs / questions

任何关于Micro的问题都可以在Issue中创建
27 stars 6 forks source link

代码中已经指定了etcd作为注册最新,为何还需要在运行的时候指明 #2

Closed yeaze closed 5 years ago

yeaze commented 5 years ago
etcd := etcdv3.NewRegistry(func(options *registry.Options) {
        options.Addrs = "127.0.0.1:2379"
    options.Timeout = 5 * time.Second
})

// create new web service
service := web.NewService(
    web.Name("kh.micro.api.khlog"),
    web.Version("latest"),
    web.RegisterTTL(time.Second*30),
    web.RegisterInterval(time.Second*20),
    web.Registry(etcd),
)

上面代码中,我已经指定了使用etcd作为注册中心,但是当我将程序编译出来并运行的时候:

./main

发现上面这样执行,并没有使用etcd作为注册中心,必须改成下面这样才有效:

./main --registry=etcd --registry_address=127.0.0.1:2379

很疑惑,那我在代码中还有必要设置使用什么作为注册中心吗,求教?

Allenxuxu commented 5 years ago

可以提供一下完整代码吗

yeaze commented 5 years ago
package main

import (
    "time"

    "kaihu-micro/khlog-srv/database"
    "kaihu-micro/khlog-srv/handler"
    "kaihu-micro/khlog-srv/subscriber"
    "kaihu-micro/khlog-srv/repository"
    khlog "kaihu-micro/khlog-srv/proto/khlog"

    "github.com/micro/go-micro"
    "github.com/micro/go-micro/config"
    "github.com/micro/go-micro/registry"
    "github.com/micro/go-micro/util/log"
    "github.com/micro/go-micro/service/grpc"
    "github.com/micro/go-plugins/registry/etcdv3"
)

func init() {
    // 加载配置文件
    config.LoadFile("./config.yaml")

    // 连接数据库
    database.Connect()
}

func main() {
    // 使用etcd注册服务
    etcd := etcdv3.NewRegistry(func(options *registry.Options) {
        options.Addrs = config.Get("ETCD", "CLUSTER").StringSlice(nil)
        options.Timeout = config.Get("ETCD", "TIMEOUT").Duration(5) * time.Second
    })

    // New Service
    service := grpc.NewService(
        micro.Name("kh.micro.srv.khlog"),
        micro.Version("latest"),
        micro.Address(config.Get("PORT").String("")),
        micro.RegisterTTL(time.Second*30),
        micro.RegisterInterval(time.Second*20),
        micro.Registry(etcd),
    )

    // Initialise service
    service.Init()

    // Register Handler
    khlog.RegisterKhlogHandler(service.Server(), &handler.Khlog{
        IFLogRepo: &repository.IFLog{DB: database.DB},
        ClientLogRepo: &repository.ClientLog{DB: database.DB},
    })

    // Register Struct as Subscriber
    micro.RegisterSubscriber("kh.test", service.Server(), new(subscriber.Khlog))

    // Register Function as Subscriber
    //micro.RegisterSubscriber("kh.micro.srv.khlog", service.Server(), subscriber.Handler)

    // Run service
    if err := service.Run(); err != nil {
        log.Fatal(err)
    }
}

使用go run main.go 的时候没有问题的, 使用go build main.go 编译出二进制文件之后, 直接运行二进制文件 ./main 这样貌似并没有使用etcd作为注册中心

hb-chen commented 5 years ago

我这边分别测试了用micro、web、grpc创建服务,指定registry都是OK的。 而且不应该出现go run./main不一致的情况 另外我看你的配置是从config.yaml文件获取的,这里可以看下配置是否都加载正确go run./main在加载路径上可能不一样,如果是配置没有获取到,那也就无法在etcd上看到注册的服务

hb-chen commented 5 years ago

我测试的版本是v1.14.0

yeaze commented 5 years ago

@hb-chen 感谢哈,我自己再确认下,是否有别的问题。

yeaze commented 5 years ago

@hb-chen @Allenxuxu 刚刚又实验了一下,发现情况是这样的(我之前的描述现象不够准确): 还是上面的代码,而且确保配置文件能正确读取: 1、我用go run main.go 或者 ./main 运行程序后 服务应该是注册成功的 然后输入命令 : micro --registry=etcd --registry_address=127.0.0.1:2379 list services 结果显示是空,没有任何服务。

2、倘若我以下列方式启动服务: ./mian --registry=etcd --registry_address=127.0.0.1:2379 然后输入命令 : micro --registry=etcd --registry_address=127.0.0.1:2379 list services 结果就能看到我刚刚启动的那个服务的名字。

另外我的版本也是v1.14.0

hb-chen commented 5 years ago

这是因为etcd分两个版本的API,你代码中使用的是etcdv3,而micro命令指定的etcd,统一一下应就对了

hb-chen commented 5 years ago

在服务启动时会有使用的注册中心等信息,比如使用v3的输出注册中心为Registry [etcdv3]

go run main.go
2019-11-01 13:41:35.575496 I | Transport [http] Listening on [::]:63862
2019-11-01 13:41:35.575646 I | Broker [http] Connected to [::]:63863
2019-11-01 13:41:35.576055 I | Registry [etcdv3] Registering node: go.micro.srv.example-2dcaba0a-9bce-458d-8d4a-7694e20544a4
hb-chen commented 5 years ago

另外需要注意的是micro在将etcd转为默认集成注册中心是go-micro中有一个etcd,这个使用的是v3 API,但注册中心名字是etcd,你在使用时要保证micro工具和项目应用同一个注册中心,避免出现不兼容问题

yeaze commented 5 years ago

@hb-chen 请教下,为什么我go run main.go 启动的时候输出是如下这样的:

2019-11-01 10:56:02.465725 I | Server [grpc] Listening on [::]:9090 2019-11-01 10:56:02.465784 I | Broker [http] Connected to [::]:45179 2019-11-01 10:56:02.465999 I | Registering node: kh.micro.srv.khlog-f491a2a7-9a2a-43b0-a68c-c8df658b51e2

和你的对比,发现没有Transport 和 Registry的相关信息

hb-chen commented 5 years ago

我的是micro.NewService(),你的是grpc,这个有区别正常,micro工具使用etcd注册中心的问题应解决了吧

yeaze commented 5 years ago

micro工具中集成的应该是v2版本吧,倘若我想使用v3就需要自己引入v3 然后重新编译micro工具对吧?

hb-chen commented 5 years ago

对,如果你是最新版本的micro直接重新编译一个,现在项目内默认就集成了etcd,然后你的代码中就不要应用go-plugins的etcdv3,而是引用github.com/micro/go-micro/registry/etcd

yeaze commented 5 years ago

弄明白了,非常感谢您的耐心解答,谢谢!

itcuihao commented 4 years ago

micro-web 如何注册etcd呢?

[GIN-debug] POST /api/v1/push --> bookbook_push/api/services.(*JPushService).JPush-fm (4 handlers) 2019-12-30 16:44:56.221184 I | Listening on [::]:53048 2019-12-30 16:45:38.332153 I | Received signal interrupt 2019-12-30 16:45:38.333154 I | Stopping


- micro 启动

➜ api go run main.go [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.

[GIN-debug] POST /api/v1/push --> bookbook_push/api/services.(*JPushService).JPush-fm (4 handlers) 2019-12-30 16:45:53.028153 I | Transport [http] Listening on [::]:53062 2019-12-30 16:45:53.029154 I | Broker [http] Connected to [::]:53063 2019-12-30 16:45:53.042163 I | Registry [etcd] Registering node: bookbook.micro.web.push-6e3f5027-c20b-4dd5-917b-5f3827314229


对比看 web 并没有注册etcd呢。

代码:
// service := web.NewService(
//  web.Name(WebName),
//  web.Version(WebVersion),
//  web.Registry(common.RegistryEtcd()),
// )
service := micro.NewService(
    micro.Name(WebName),
    micro.Version(WebVersion),
    micro.Registry(common.RegistryEtcd()),
)

service.Init()

// service.Handle("/", router())
router()
if err := service.Run(); err != nil {
    panic(err)
}