九卷技术录

V1

2023/03/01阅读:37主题:简

Go微服务框架go-kratos实战学习06:配置中心使用-nacos作为配置中心

一、kratos 配置介绍

配置文件的作用就是把一些会变化的配置项单独存放,与程序相剥离。

把配置项进行单独管理。

kratos 支持多种形式的配置,

比如 file,环境变量。

还支持一些配置软件,比如:

等等。

它也支持多种格式,比如 json、yaml、proto、xml 等。

katos 还支持热更新功能

kratos 中的 config 热更新功能,可以在服务不重新发布、不停机、不重启情况下,在线更新服务配置,修改服务行为。

二、基本使用步骤

go-kratos: v2.4.0

Go: v1.17.10

基本使用步骤

  1. 初始化配置源:解析的配置项数据源来自 file,还是配置软件里存储的数据。
  2. 读取配置值

例子1:配置源是 file

文档:https://go-kratos.dev/docs/component/config/#1%E5%88%9D%E5%A7%8B%E5%8C%96%E9%85%8D%E7%BD%AE%E6%BA%90

第一步,初始化配置源。

import (
 "github.com/go-kratos/kratos/v2/config"
 "github.com/go-kratos/kratos/v2/config/file"
)

path := "./config.yaml"

c := config.New(
    config.WithSource( // 初始化配置源
        file.NewSource(path),
    ),
)

第二步,读取配置值

path := "./config.yaml"

c := config.New(
    config.WithSource( // 初始化配置
        file.NewSource(path),
    ),
)

if err := c.Load(); err != nil { //加载配置
    panic(err)
}

// 定义读取配置文件的结构
var v struct {
    Service struct {
        Name    string `json:"name"`
        Version string `json:"version"`
    } `json:"service"`
}

if err := c.Scan(&v); err != nil { // 读取配置到结构体
    panic(err)
}
log.Printf("config: %+v", v)

// 获取值
name, err := c.Value("service.name").String()
if err != nil {
    panic(err)
}
log.Printf("service: %s", name)

上面的配置文件 config.yaml

service:
  name: config
  version: v1.0.0
http:
  server: 
    address: 0.0.0.0:8000
    timeout: 1s
grpc:
  server:
    address: 0.0.0.0:9000
    timeout: 1s

例子2:nacos 作为配置中心

nacos 文档

比如使用 nacos

nacos 文档上介绍的功能:

Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

nacos 的安装这里就不介绍了,请查看安装文档

nacos 安装

我直接在 github 上下载的 win 安装版本:https://github.com/alibaba/nacos/releases/download/2.1.0/nacos-server-2.1.0.zip。解压后直接到nacos的bin目录,执行命令 startup.cmd -m standalone,就会启动 nacos。

运行nacos前,还有一些预备环境,可以到Nacos快速开始查看安装nacos的预备环境文档。

执行启动命名:

startup.cmd -m standalone

image-20220720141840942
image-20220720141840942

上面图片已经显示了进入 console 的 url 地址。

进入 console 界面:

进入 console 界面:http://192.168.56.1:8848/nacos/index.html 默认用户名/密码:nacos/nacos。

image-20220720142114428
image-20220720142114428

新建配置

在上面console图片界面的右边有一个大大的 + 号,点击它转到新建配置页面,相关填写项如下图

image-20220720142948035
image-20220720142948035
service:
  name: config
  version: v1.0.0
http:
  server: 
    address: 0.0.0.0:8000
    timeout: 1s
grpc:
  server:
    address: 0.0.0.0:9000
    timeout: 1s

点击发布,如下图:

image-20220720143231521
image-20220720143231521

编写读取配置代码

nacos go-sdk:

nacos 的 go-sdk 以及文档:https://github.com/nacos-group/nacos-sdk-go

github.com/nacos-group/nacos-sdk-go v1.1.1

获取 nacos 配置:

package main

import (
 "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"

 knacos "github.com/go-kratos/kratos/contrib/config/nacos/v2"

 "github.com/go-kratos/kratos/v2/config"
)

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

 cc := &constant.ClientConfig{
  NamespaceId:         "public",
  TimeoutMs:           5000,
  NotLoadCacheAtStart: true,
  LogDir:              "./config/log",
  CacheDir:            "./config/cache",
  LogLevel:            "debug",
 }

 client, err := clients.NewConfigClient(
  vo.NacosClientParam{
   ClientConfig:  cc,
   ServerConfigs: sc,
  },
 )
 if err != nil {
  log.Panic(err)
 }

 c := config.New(
  config.WithSource(
   knacos.NewConfigSource(
    client,
    knacos.WithGroup("defaulttest_group"),
    knacos.WithDataID("defaulttest.yaml"),
   ),
  ),
 )
 if err := c.Load(); err != nil {
  panic(err)
 }
 name, err := c.Value("service.name").String()
 if err != nil {
  panic(err)
 }
 log.Println("GET service.name: ", name)

}

运行:

go run .\main.go 2022-07-20T14:41:23.121+0800 INFO nacos_client/nacos_client.go:79 logDir:<./config/log> cacheDir:<./config/cache> DEBUG msg=config loaded: defaulttest.yaml format: yaml 2022/07/20 14:41:23 GET service.name: config

三、完整代码地址

kratos 配置使用完整代码地址:

https://github.com/jiujuan/go-kratos-demos/tree/master/config


欢迎大家到我的公众号 九卷技术录,go-kratos 实战学习06:Nacos 配置中心使用 继续讨论

四、参考

  • https://go-kratos.dev/docs/component/config/ config docs
  • https://nacos.io/zh-cn/docs/what-is-nacos.html nacos 文档
  • https://github.com/nacos-group/nacos-sdk-go nacos-sdk-go
  • https://github.com/alibaba/nacos nacos源码
  • https://github.com/hashicorp/consul
  • https://github.com/apolloconfig/apollo
  • https://github.com/etcd-io/etcd

分类:

后端

标签:

Golang

作者介绍

九卷技术录
V1

好技术成就你我