微服务框架 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 main
import (
"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 code
func (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 name
micro.Name("my.micro.service"),
// Set service registry
micro.Registry(registry),
)
helloworld.RegisterGreeterHandler(service.Server(), new(Helloworld))
service.Run()
}
在 Nacos console 中可以看到 my.micro.service 成功注册
2. Go-Micro 客户端
创建 client.go (为了方便演示,本文在同一项目下创建了 cient.go)。
package main
import (
"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())
// 调用greeter
rsp, 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 name
micro.Name("my.micro.service"),
// Set service registry
micro.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())
// 调用greeter
rsp, 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 生态交流群)