这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天,记录一下基于 kitex 和 hertz 的微服务 demo 搭建流程。
简介
上一篇主要讲了技术选型和模块划分,本文主要讲解 nacos 作为注册中心和配置中心与 kitex 相结合。
什么是 nacos
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
关于 nacos 的部署与配置持久化可以参考官方文档,此处不做介绍。
Nacos 作为注册中心
引入依赖
Kitex 的服务发现功能提供了对 nacos 的支持,需要引入 registry-nacos 依赖。
go get -u github.com/kitex-contrib/registry-nacos
构建 nacos 客户端(NamingClient)
由于 registry-nacos 底层是基于 nacos-sdk-go v1.1.2 的,因此该部分的代码可以参考其官方文档。
配置 nacos 服务端地址
sc := []constant.ServerConfig{
*constant.NewServerConfig("127.0.0.1", 8848),
}
初始化 nacos 客户端配置
cc := &constant.ClientConfig{
NamespaceId: "public", // 命名空间Id
TimeoutMS: 10000, // 请求Nacos服务端的超时时间,默认是10000ms
Username: "nacos", // Nacos服务端的API鉴权Username
Password: "nacos", // Nacos服务端的API鉴权Password
}
创建 nacos 客户端
Client, err := clients.NewNamingClient(vo.NacosClientParam{
ClientConfig: cc,
ServerConfigs: sc,
})
注册 rpc 服务端
这里使用了上一篇提到的 idl 模块中 hello 模块的相关代码(由 kitex 代码生成工具生成),创建了一个 rpc 服务端,并设置了服务的注册名为 HelloRpcService,通过上一步构建的 nacos 客户端完成注册。
import (
"github.com/cloudwego/kitex/pkg/rpcinfo"
"github.com/cloudwego/kitex/server"
"github.com/joker-star-l/service_demo_idls/hello/kitex_gen/api/hello"
"github.com/kitex-contrib/registry-nacos/registry"
)
...
svr := hello.NewServer(
new(HelloImpl),
server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: "HelloRpcService"}),
server.WithRegistry(registry.NewNacosRegistry(Client)),
)
注册 http 服务端
设置 http 服务注册名为 HelloService,通过上一步构建的 nacos 客户端完成注册。
success, err := Client.RegisterInstance(vo.RegisterInstanceParam{
Ip: "127.0.0.1",
Port: 8080,
Weight: 10,
Enable: true,
Healthy: true,
ServiceName: "HelloService",
Ephemeral: true,
})
Nacos 作为配置中心
编写配置
在 nacos 中编写一个名为 HelloService.json 的文件,当作该服务的配置文件。
构建 nacos 客户端(ConfigClient)
ConfigClient, err = clients.NewConfigClient(vo.NacosClientParam{
ClientConfig: cc,
ServerConfigs: sc,
})
读取配置
configParam := vo.ConfigParam{
DataId: "HelloService.json",
Group: "DEFAULT_GROUP",
}
conf, err := ConfigClient.GetConfig(configParam)
监听配置
注册监听器,当 nacos 上的配置文件发生改变时,会执行 OnChange 函数。其中 data 参数代表文件的最新数据。
err = ConfigClient.ListenConfig(vo.ConfigParam{
DataId: configParam.DataId,
Group: configParam.Group,
OnChange: func(namespace, group, dataId, data string) {
if group == configParam.Group && dataId == configParam.DataId {
... // 具体逻辑
}
},
})