Go Micro 使用 consul 服务注册和发现
在构建微服务时,使用服务注册和发现可以减少配置的复杂性。
注册机制提供了一个服务发现机制来将名称解析为地址。它可以由consul,etcd,zookeeper,dns,gossip等提供支持。一个服务应该在启动时使用注册机制进行注册,并在关闭时取消注册。
Go Micro 支持 consul、etcd、dns 多种方式进行服务注册和发现,默认使用 mdns。
consul 是一个分布式一致性的 key-value 存储技术, 被用来做配置共享和服务发现。
1. 运行 consul
consul 在开发或者测试环境中,可以直接使用 docker 运行。
docker run --name consul -d -p 8500:8500 consul agent -server -ui -bootstrap-expect=1 -client=0.0.0.0
可以通过浏览器直接管理 consul,地址为:http://localhost:8500。
2. Go Micro 服务注册
Go Micro 的 RPC 微服务,使用 consul 作为服务注册的方法如下:
package main import ( "context" "github.com/micro/go-micro" "github.com/micro/go-micro/registry" "github.com/micro/go-micro/util/log" "github.com/micro/go-plugins/registry/consul" "hello/proto/hello" ) func main() { // 创建 consul 服务注册项,其中 192.168.3.25:2379 为 consul 服务地址。 // consul 服务地址按照实际情况填写 reg := consul.NewRegistry(registry.Addrs("192.168.3.25:2379")) // 创建一个新的服务,服务名为 go.micro.srv.hello service := micro.NewService( micro.Name("go.micro.srv.hello"), micro.Version("latest"), // 使用服务注册插件 micro.Registry(reg), ) // 通过命令行参数或者插件初始化服务 service.Init() // Use the generated client stub // 通过客户端的桩创建 go.micro.srv.hello 服务客户端 helloService := hello.NewHelloService("go.micro.srv.hello",service.Client()) // Make request // 调用 RPC Call 方法 response, err := helloService.Call(context.Background(), &hello.Request{ Name: "codebaoku", }) if err != nil { log.Error(err) return } // Print result // 打印 RPC Call 调用结果 log.Info(response.Msg) }
3. Go Micro 服务发现
Go Micro 客户端,可以通过服务发现使用注册在 consul 的 RPC 微服务:
package main import ( "context" "github.com/micro/go-micro" "github.com/micro/go-micro/registry" "github.com/micro/go-plugins/registry/consul" "github.com/micro/go-micro/util/log" "hello/proto/hello" ) func main() { // 创建 consul 服务注册项,其中 192.168.3.25:2379 为 consul 服务地址。 // consul 服务地址按照实际情况填写 reg := consul.NewRegistry(registry.Addrs("192.168.3.25:2379")) // Create a new service // 创建一个新的服务,服务名为 go.micro.srv.hello service := micro.NewService() // Parse command line flags // 使用服务注册插件初始化服务 service.Init(micro.Registry(reg)) // Use the generated client stub // 通过客户端的桩创建 go.micro.srv.hello 服务客户端 helloService := hello.NewHelloService("go.micro.srv.hello",service.Client()) // Make request // 调用 RPC Call 方法 response, err := helloService.Call(context.Background(), &hello.Request{ Name: "codebaoku", }) if err != nil { log.Error(err) return } // Print result // 打印 RPC Call 调用结果 log.Info(response.Msg) }
Go Micro API 服务是对 SRV RPC服务的封装,它将请求装换为 RPC 请求转给 SRV RPC 服务,并将 SRV RPC 的处理结果返回客户端。我们可以使用 Go Micro 的 micro ...