微服务框架 Go-Micro 集成 Nacos 实战之服务注册与发现
作者 | 张斌斌
导读:本文主要介绍如何使用 Golang 生态中的微服务框架 Go-Micro(v2) 集成 Nacos 进行服务注册与发现。(Go-Micro 目前已经是 v3 版本,但由于某些原因项目已经更名为 nitro 具体原因大家可以去 github 中查看。)
相关背景知识
1. Go-Micro
1)Micro 概述
API
Web
Sidecar
Bot
CLI
2)Go-Micro 组件
Registry
Selector
Broker
Transport
Codec
Plugins
Server
Client
2. Nacos
快速开始
1. Go-Micro 服务端
1)安装 protoc
go get github.com/golang/protobuf/protoc-gen-go
2)安装 Go-Micro/v2
go install github.com/micro/micro/v2
3)新建 golang 项目(服务端)
在项目根目录下创建 proto 文件夹,用来存放 protobuf 文件
在 proto 文件夹下创建 greeter.proto 文件
文件内容如下:
syntax = "proto3";package helloworld;service Greeter {rpc Hello(HelloRequest) returns (HelloResponse) {}}message HelloRequest {string name = 1;}message HelloResponse {string greeting = 2;}
生成相应的 Go 代码
protoc --micro_out=. --go_out=. proto/greeter.proto
在 proto 目录下,生成了 pb.go 以及 pb.micro.go 两个文件
创建 server.go 并运行
package mainimport ("context"helloworld "go-micro-nacos-demo1/proto""github.com/micro/go-micro/v2""github.com/micro/go-micro/v2/logger""github.com/micro/go-micro/v2/registry"nacos "github.com/micro/go-plugins/registry/nacos/v2")type Helloworld struct{}// Call is a single request handler called via client.Call or the generated client codefunc (e *Helloworld) Hello(ctx context.Context, req *helloworld.HelloRequest, rsp *helloworld.HelloResponse) error {logger.Info("Received Helloworld.Call request")return nil}func main() {addrs := make([]string, 1)addrs[0] = "console.nacos.io:80"registry := nacos.NewRegistry(func(options *registry.Options) {options.Addrs = addrs})service := micro.NewService(// Set service namemicro.Name("my.micro.service"),// Set service registrymicro.Registry(registry),)helloworld.RegisterGreeterHandler(service.Server(), new(Helloworld))service.Run()}
在 Nacos console 中可以看到 my.micro.service 成功注册
2. Go-Micro 客户端
创建 client.go (为了方便演示,本文在同一项目下创建了 cient.go)。
package mainimport ("context""fmt"helloworld "go-micro-nacos-demo1/proto""github.com/micro/go-micro/v2""github.com/micro/go-micro/v2/registry"nacos "github.com/micro/go-plugins/registry/nacos/v2")const serverName = "my.micro.service"func main() {addrs := make([]string, 1)addrs[0] = "console.nacos.io:80"r := nacos.NewRegistry(func(options *registry.Options) {options.Addrs = addrs})// 定义服务,可以传入其它可选参数service := micro.NewService(micro.Name("my.micro.service.client"),micro.Registry(r))// 创建新的客户端greeter := helloworld.NewGreeterService(serverName, service.Client())// 调用greeterrsp, err := greeter.Hello(context.TODO(), &helloworld.HelloRequest{Name: "John"})if err != nil {fmt.Println(err)}//获取所有服务fmt.Println(registry.ListServices())//获取某一个服务services, err := registry.GetService(serverName)if err != nil {fmt.Println(err)}//监听服务watch, err := registry.Watch()fmt.Println(services)// 打印响应请求fmt.Println(rsp.Greeting)go service.Run()for {result, err := watch.Next()if len(result.Action) > 0 {fmt.Println(result, err)}}}
运行客户端,在 nacos console 中可以看到客户端服务也注册到了 nacos 中。
server.go 的控制台中打印了调用日志。
3. Go-Micro 集成 Nacos 功能说明
1)server.go
registry := nacos.NewRegistry(func(options *registry.Options) {options.Addrs = addrs})service := micro.NewService(// Set service namemicro.Name("my.micro.service"),// Set service registrymicro.Registry(registry),)service.Run()
2)client.go
r := nacos.NewRegistry(func(options *registry.Options) {options.Addrs = addrs})service := micro.NewService(micro.Name("my.micro.service.client"),micro.Registry(r))
// 创建新的客户端greeter := helloworld.NewGreeterService(serverName, service.Client())// 调用greeterrsp, err := greeter.Hello(context.TODO(), &helloworld.HelloRequest{Name: "John"})
services,err:=registry.ListServices()
service, err := registry.GetService(serverName)
watch, err := registry.Watch()for {result, err := watch.Next()if len(result.Action) > 0 {fmt.Println(result, err)}}
总结
相关链接
Go-Micro: https://github.com/asim/nitro
Nacos: https://nacos.io/zh-cn/index.html
Nacos 钉钉社区交流群:30438813, 23191211(Nacos golang 生态交流群)
