Kitex中的Nacos| 青训营笔记

326 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第8天,今天我学习了如何使用Kitex框架注册一个Nacos服务。

为什么需要服务发现

分布式的情况下,每个微服务都会有自己的ip和port,那么调用者就需要知道所有服务的ip和port,但是ip和port并不是一直不变的,所以需要一个服务能够统计所有的服务ip和port,这就是服务发现功能。通常与服务发现配套使用的是负载均衡功能,当一个服务由多个实例来提供的时候,我们需要一个负载均衡来平衡到达各个实例的请求量。

什么是Nacos

Nacos是阿里开源的一个服务发现与动态配置服务,在spring cloud中有不错的生态位,技术也比较成熟。在2.0版本往后还提供了grpc连接来解决1.0中的大量心跳连接带来的网络负担。

Kitex与Nacos

kitex提供了一个Nacos的包可以用来连接Nacos,可以参考github.com/kitex-contr…

下面简单来介绍一下如何使用

1.安装nacos

参考Nacos支持三种部署模式 学习的时候,可以最简单的单机部署-内置存储模式,如果在生成环境中可以部署成集群-高可用存储模式。

2.服务注册

在go中可以封装一个函数来为所有的服务提供相同的注册信息

func KitexServerRegistry() kitexRegistry.Registry {
   sc := []constant.ServerConfig{
      *constant.NewServerConfig("127.0.0.1", 8848),
   }

   // the nacos client config
   cc := constant.ClientConfig{
      NamespaceId:         "",
      TimeoutMs:           5000,
      NotLoadCacheAtStart: true,
      LogDir:              "/tmp/nacos/log",
      CacheDir:            "/tmp/nacos/cache",
      LogLevel:            "info",
      // more ...
   }

   r, err := clients.NewNamingClient(
      vo.NacosClientParam{
         ClientConfig:  &cc,
         ServerConfigs: sc,
      },
   )
   if err != nil {
      panic(err)
   }
   return registry.NewNacosRegistry(r)
}

然后给kitex的NewServer函数传入server.WithRegistry(r)

r := nacos.KitexServerRegistry()
svr := UserRelationPb.NewServer(
   new(UserRelationImpl),
   server.WithServiceAddr(&net.TCPAddr{Port: 50052}),
   server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: "userRelation"}),
   server.WithRegistry(r),
)

这样就可以注册成功了

3.服务调用

服务的调用也非常简单,只要两个步骤,新建client,然后调用

userinfo.NewClient("userInfoImpl", client.WithHostPorts("0.0.0.0:8888"))

然后这次调用client就行