本文主要面向 Kitex 的使用者,通过示例介绍如何使用 MSE Nacos 实现服务注册发现。
说明
MSE Nacos 服务注册发现功能是基于社区 registry-nacos 与 Kitex 服务注册扩展实现。
在微服务场景下,部分服务尽可能的拆解到最小的颗粒,确保服务和服务间的深度解耦,方便业务的快速迭代。但是随之而来的服务管理和控制变得异常的复杂和繁琐,维护成本大幅提升。服务注册和服务发现的诞生就可以有效的解决这些问题,提高开发和运维的效率。
注意
通过私网连通时,容器服务集群需要和微服务引擎实例处于同一个 VPC。
修改 kitex-examples 工程中的 ./hello/main.go
文件。修改后的文件如下所示。
import ( "log" api "github.com/cloudwego/kitex-examples/hello/kitex_gen/api/hello" "github.com/cloudwego/kitex/pkg/rpcinfo" "github.com/cloudwego/kitex/server" "github.com/kitex-contrib/registry-nacos/registry" "github.com/nacos-group/nacos-sdk-go/clients" "github.com/nacos-group/nacos-sdk-go/common/constant" "github.com/nacos-group/nacos-sdk-go/vo" ) func main() { // ... sc := []constant.ServerConfig{ *constant.NewServerConfig("127.0.0.1", 8848), } cc := constant.ClientConfig{ Username: "nacos", Password: "nacos", } cli, err := clients.NewNamingClient( vo.NacosClientParam{ ClientConfig: &cc, ServerConfigs: sc, }, ) if err != nil { panic(err) } svr := api.NewServer( new(HelloImpl), server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: "echo"}), server.WithRegistry(registry.NewNacosRegistry(cli)), ) if err := svr.Run(); err != nil { log.Println("server stopped with error:", err) } else { log.Println("server stopped") } // ... }
在上述代码的 ServerConfig 中配置 Nacos Server 的地址(上述 MSE Nacos 实例私网或公网访问地址);在ClientConfig 中配置Nacos 用户名、密码。
constant.ServerConfig
参数 | 说明 |
---|---|
constant.NewServerConfig | Nacos Server 的地址,即 MSE Nacos 实例私网或公网访问地址。 |
constant.ClientConfig
参数 | 说明 |
---|---|
Username | Nacos 账号用户名。 |
Password | Nacos 账号密码。 |
说明
MSE Nacos 默认开启鉴权,用户必须配置鉴权后才能使用。初始用户名和密码为都为 nacos,与控制台访问用户名相同。后续如需更改,支持通过控制台或 OpenAPI 实现。
在 kitex-examples 工程中修改 Dockerfile 文件。修改后的文件如下所示。
FROM golang:1.18-alpine RUN apk update && apk add git WORKDIR /code COPY . . RUN go env -w GOPROXY=https://goproxy.io,direct RUN go env -w GO111MODULE=on RUN go build -o hello-server ./hello ENTRYPOINT ["./hello-server"]
在 Terminal 执行以下操作。
docker build -t mse-demo-kitex-provider .
推送 Docker 镜像至镜像仓库,操作说明参见 推送和拉取镜像。
在容器服务创建无状态负载。操作说明参见 创建无状态负载。
修改 kitex-examples 工程中的 ./hello/client/main.go
文件。修改后的文件如下所示。
import ( "context" "fmt" "log" "time" "github.com/cloudwego/kitex-examples/hello/kitex_gen/api" "github.com/cloudwego/kitex-examples/hello/kitex_gen/api/hello" "github.com/cloudwego/kitex/client" "github.com/kitex-contrib/registry-nacos/resolver" "github.com/nacos-group/nacos-sdk-go/clients" "github.com/nacos-group/nacos-sdk-go/common/constant" "github.com/nacos-group/nacos-sdk-go/vo" ) func main() { // ... sc := []constant.ServerConfig{ *constant.NewServerConfig("127.0.0.1", 8848), } cc := constant.ClientConfig{ Username: "nacos", Password: "nacos", } cli, err := clients.NewNamingClient( vo.NacosClientParam{ ClientConfig: &cc, ServerConfigs: sc, }, ) if err != nil { panic(err) } client, err := hello.NewClient("echo", client.WithResolver(resolver.NewNacosResolver(cli))) if err != nil { log.Fatal(err) } count := 0 for { req := &api.Request{Message: fmt.Sprintf("my request %d", count)} resp, err := client.Echo(context.Background(), req) if err != nil { log.Fatal(err) } log.Println(resp) count++ time.Sleep(time.Second) } }
在上述代码的 ServerConfig 中配置 Nacos Server 的地址(上述 MSE Nacos 实例私网或公网访问地址);在ClientConfig 中配置Nacos 用户名、密码。
constant.ServerConfig
参数 | 说明 |
---|---|
constant.NewServerConfig | Nacos Server 的地址,即 MSE Nacos 实例私网或公网访问地址。 |
constant.ClientConfig
参数 | 说明 |
---|---|
Username | Nacos 账号用户名。 |
Password | Nacos 账号密码。 |
说明
MSE Nacos 默认开启鉴权,用户必须配置鉴权后才能使用。初始用户名和密码为都为 nacos,与控制台访问用户名相同。后续如需更改,支持通过控制台或 OpenAPI 实现。
在 kitex-examples 工程中修改 Dockerfile 文件。修改后的文件如下所示。
FROM golang:1.18-alpine RUN apk update && apk add git WORKDIR /code COPY . . RUN go env -w GOPROXY=https://goproxy.io,direct RUN go env -w GO111MODULE=on RUN go build -o hello-client ./hello/client ENTRYPOINT ["./hello-client"]
在 Terminal 执行以下操作。
docker build -t mse-demo-kitex-consumer .
推送 Docker 镜像至镜像仓库,操作说明参见 推送和拉取镜像。
在容器服务创建无状态负载。操作说明参见 创建无状态负载。
登录 Nacos 实例控制台,操作说明参见 登录 Nacos 控制台。
在左侧菜单栏,单击 服务管理 > 服务列表。即可查看已被发现的 Provider 服务 echo。
查看 mse-demo-kitex-consumer
无状态负载的日志,可以看到 Consumer 正确的从 Provider 服务 echo 得到了返回。