前面《kratos微服务实战(九)kratos项目之注册到nacos的服务之间相互调用》我们再go-kratos中集成了nacos作为注册中心,本文我们再演示下再go-kratos中集成配置中心。
这里要特别注意的是在go-kratos中注册到nacos和配置nacos的配置中心是分开独立的,所以这里是需要写两遍连接nacos代码的。下面开始演示:
一、nacos配置准备
既然要使用nacos作为配置中心,首先就需要在nacos中把配置给配置起来,
1、点击nacos的配置惯例->配置列表
2、选择对应的名称空间
3、创建一个名称为user.yaml的配置
在这个user.yaml文件中填写如下的值:
app: name: test version: 1.0.0.1
以上我们的配置文件就准备好了。
2、修改配置文件
这里配置中心的话,我们需要把nacos配置相关的信息给添加进去,所以这里修改configs/config.yaml文件,那nacos的group和dataid再增加进去
nacos: addr: 192.168.1.249 port: 8848 namespaceId: 0153af57-1fb8-43ef-bfe5-1212e6b43db2 dataId: user.yaml groupId: DEFAULT_GROUP
当然这里我们就不需要修改internal/conf/conf.proto了,因为我们不需要给他注册进去,如果进行注册的话,后续的代码量有点多,这里我们采取configutils的形式来完成。(当然有个人代码要求的,也可以修改conf.proto,再便宜个新的)
三、安装依赖
这里由于采用configutils的形式,所以这里我们需要安装下读取文件和读取nacosconfig的依赖
go get github.com/spf13/viper go get github.com/go-kratos/kratos/contrib/config/nacos/v2
四、编写nacos config文件
这里我们在internal/config文件夹下创建一个文件夹nacos,再在nacos文件夹下创建一个nacos.go文件,我们的nacos配置读取的utils就准备写在这里
接着我们向这个文件编写nacos读取config的utils实现,主要是以下几步:
1、声明nacos的一些变量 2、编写方法,读取configs/config.yaml文件中nacos的信息,把值赋予给对应变量 3、编写方法,初始化nacos的对应连接,监听文件 4、编写方法,获取读nacos config的读取流
具体的实例代码如下:
package nacos
import (
knacos "github.com/go-kratos/kratos/contrib/config/nacos/v2"
"github.com/go-kratos/kratos/v2/config"
"github.com/go-kratos/kratos/v2/log"
"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"
"github.com/spf13/viper"
)
/*
*
声明nacos的一些变量
*/
var (
nacosConfig config.Config //远程配置中心实例
nacosIp string //nacosip地址
nacosPort uint64 //nacos端口
nacosNameSpaceId string //当前服务名称空间
nacosDataId string //nacos配置的DataID
nacosGroup string //nacos配置的group分组
)
/*
*
创建文件流,读取nacos的配置信息
*/
func readConfig() {
localConfig := viper.New() //新建本地配置中心实例
localConfig.SetConfigFile("..\\..\\configs\\config.yaml") //指定本地配置文件
//读取配置文件
if err := localConfig.ReadInConfig(); err != nil {
panic(err)
}
nacosIp = localConfig.GetString("data.nacos.addr")
nacosPort = localConfig.GetUint64("data.nacos.port")
nacosNameSpaceId = localConfig.GetString("data.nacos.namespaceId")
nacosDataId = localConfig.GetString("data.nacos.dataId")
nacosGroup = localConfig.GetString("data.nacos.groupId")
}
/*
* 创建nacos连接
*/
func InitNacosConfig() (c config.Config) {
//初始化读取配置文件
readConfig()
sc := []constant.ServerConfig{
*constant.NewServerConfig(nacosIp, nacosPort),
}
cc := &constant.ClientConfig{
NamespaceId: nacosNameSpaceId,
TimeoutMs: 5000,
NotLoadCacheAtStart: true,
LogDir: "tmp/nacos/log",
CacheDir: "tmp/nacos/cache",
LogLevel: "debug",
}
client, err := clients.NewConfigClient(
vo.NacosClientParam{
ClientConfig: cc,
ServerConfigs: sc,
},
)
if err != nil {
panic(err)
}
c = config.New(
config.WithSource(
knacos.NewConfigSource(client,
knacos.WithGroup(nacosGroup),
knacos.WithDataID(nacosDataId),
)))
if err := c.Load(); err != nil {
panic(err)
}
return c
}
/**
其他文件获取nacos config读取流的公共方法
*/
func GetConfig() config.Config {
if nacosConfig == nil {
log.Info("准备初始化nacos读取配置")
nacosConfig = InitNacosConfig()
}
return nacosConfig
}五、读取nacos配置信息
接下来我们只需要在需要读取nacos配置信息的地方调用这里的GetConfig方法即可,例如我们在前面的internal/service/account.go文件中的login方法里面调用获取nacos上面配置的appname和version值,调用效果如下:
appname, err := nacos.GetConfig().Value("app.name").String()
version, err := nacos.GetConfig().Value("version").String()上面我们在实际写代码的时候我会忽略掉获取的error(go里面到处是error的判断,让go的代码看起来非常复杂,所以一般不用的话就忽略掉即可),使用_替代了。
六、运行测试
最后我们把项目运行起来测试看看效果,在调用之后,可以很直观的看到打印的日志是获取到了nacos的信息了
这里控制台没显示完,实际中大家可以直接测试,还有如果在nacos上修改了最新的值之后
调用获取的值也是最新的
以上就是在go-kratos中集成nacos配置中心的案例,最后按照惯例,附上本案例的源码,登陆后即可下载。









发表评论