Closed yeaze closed 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作为注册中心
我这边分别测试了用micro、web、grpc创建服务,指定registry都是OK的。
而且不应该出现go run
与./main
不一致的情况
另外我看你的配置是从config.yaml
文件获取的,这里可以看下配置是否都加载正确go run
和./main
在加载路径上可能不一样,如果是配置没有获取到,那也就无法在etcd
上看到注册的服务
我测试的版本是v1.14.0
@hb-chen 感谢哈,我自己再确认下,是否有别的问题。
@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
这是因为etcd分两个版本的API,你代码中使用的是etcdv3,而micro命令指定的etcd,统一一下应就对了
在服务启动时会有使用的注册中心等信息,比如使用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
另外需要注意的是micro在将etcd转为默认集成注册中心是go-micro中有一个etcd,这个使用的是v3 API,但注册中心名字是etcd,你在使用时要保证micro工具和项目应用同一个注册中心,避免出现不兼容问题
@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的相关信息
我的是micro.NewService(),你的是grpc,这个有区别正常,micro工具使用etcd注册中心的问题应解决了吧
micro工具中集成的应该是v2版本吧,倘若我想使用v3就需要自己引入v3 然后重新编译micro工具对吧?
对,如果你是最新版本的micro直接重新编译一个,现在项目内默认就集成了etcd
,然后你的代码中就不要应用go-plugins的etcdv3,而是引用github.com/micro/go-micro/registry/etcd
弄明白了,非常感谢您的耐心解答,谢谢!
micro-web 如何注册etcd呢?
➜ api go run main.go
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[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)
}
上面代码中,我已经指定了使用etcd作为注册中心,但是当我将程序编译出来并运行的时候:
发现上面这样执行,并没有使用etcd作为注册中心,必须改成下面这样才有效:
很疑惑,那我在代码中还有必要设置使用什么作为注册中心吗,求教?