You need to enable JavaScript to run this app.
导航

基于 Kitex 使用 Nacos 服务注册中心

最近更新时间2023.11.10 17:24:38

首次发布时间2023.05.26 14:35:42

本文主要面向 Kitex 的使用者,通过示例介绍如何使用 MSE Nacos 实现服务注册发现。

说明

MSE Nacos 服务注册发现功能是基于社区 registry-nacos 与 Kitex 服务注册扩展实现。

背景信息

在微服务场景下,部分服务尽可能的拆解到最小的颗粒,确保服务和服务间的深度解耦,方便业务的快速迭代。但是随之而来的服务管理和控制变得异常的复杂和繁琐,维护成本大幅提升。服务注册和服务发现的诞生就可以有效的解决这些问题,提高开发和运维的效率。

  • 服务注册:将服务模块的信息注册到一个公告的组件上,例如注册中心。
  • 服务发现:新注册的服务模块能够及时被其他的服务调用发现。
  • CloudWeGo-Kitex:Golang 微服务 RPC 框架,具有高性能、强可扩展的特点。

前提条件

  • 已创建微服务引擎实例,操作说明参见 创建实例
  • 已创建容器服务集群,操作说明参见 创建集群

    注意

    通过私网连通时,容器服务集群需要和微服务引擎实例处于同一个 VPC。

  • 已开通镜像仓库产品。若未开通,请登录 镜像仓库控制台,根据系统引导开通产品。
  • 已创建镜像仓库实例,操作方法参见 创建标准版实例

操作步骤

步骤一:创建 Provider

  1. 修改 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")
       }
       // ...
    }
    
  2. 在上述代码的 ServerConfig 中配置 Nacos Server 的地址(上述 MSE Nacos 实例私网或公网访问地址);在ClientConfig 中配置Nacos 用户名、密码。

    • constant.ServerConfig

      参数说明
      constant.NewServerConfigNacos Server 的地址,即 MSE Nacos 实例私网或公网访问地址。
    • constant.ClientConfig

      参数说明
      UsernameNacos 账号用户名。
      PasswordNacos 账号密码。

      说明

      MSE Nacos 默认开启鉴权,用户必须配置鉴权后才能使用。初始用户名和密码为都为 nacos,与控制台访问用户名相同。后续如需更改,支持通过控制台或 OpenAPI 实现。

  3. 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"]
    
  4. 在 Terminal 执行以下操作。

    docker build -t mse-demo-kitex-provider .
    
    
    
  5. 推送 Docker 镜像至镜像仓库,操作说明参见 推送和拉取镜像

  6. 在容器服务创建无状态负载。操作说明参见 创建无状态负载

步骤二:创建 Consumer

  1. 修改 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)
       }
    }
    
  2. 在上述代码的 ServerConfig 中配置 Nacos Server 的地址(上述 MSE Nacos 实例私网或公网访问地址);在ClientConfig 中配置Nacos 用户名、密码。

    • constant.ServerConfig

      参数说明
      constant.NewServerConfigNacos Server 的地址,即 MSE Nacos 实例私网或公网访问地址。
    • constant.ClientConfig

      参数说明
      UsernameNacos 账号用户名。
      PasswordNacos 账号密码。

      说明

      MSE Nacos 默认开启鉴权,用户必须配置鉴权后才能使用。初始用户名和密码为都为 nacos,与控制台访问用户名相同。后续如需更改,支持通过控制台或 OpenAPI 实现。

  3. 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"]
    
  4. 在 Terminal 执行以下操作。

    docker build -t mse-demo-kitex-consumer .
    
    
    
  5. 推送 Docker 镜像至镜像仓库,操作说明参见 推送和拉取镜像

  6. 在容器服务创建无状态负载。操作说明参见 创建无状态负载

结果验证

  1. 登录 Nacos 实例控制台,操作说明参见 登录 Nacos 控制台

  2. 在左侧菜单栏,单击 服务管理 > 服务列表。即可查看已被发现的 Provider 服务 echo

    alt

  3. 查看 mse-demo-kitex-consumer 无状态负载的日志,可以看到 Consumer 正确的从 Provider 服务 echo 得到了返回。
    alt