这是我参与「第五届青训营 」笔记创作活动的第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就行