2024年kratos学习(二) kratos配置_kartos(1),腾讯Golang开发面试凉凉

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Scan(v interface{}) error
Value(key string) Value
Watch(key string, o Observer) error
Close() error

}


* Load: 加载配置源
* Scan: 将配置反射到结构体中
* Value: 获取配置的值
* Watch: 监听配置更新
* Close: 关闭所有watch


## File


[完整代码](https://bbs.csdn.net/topics/618658159)


### 初始化配置源



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

### 读取配置


读取配置可以使用Scan来反射到结构体也可以使用Value获取指定键值


#### 使用Scan



var v struct {
	Service struct {
		Name    string `json:"name"`
		Version string `json:"version"`
	} `json:"service"`
}

// Unmarshal the config to struct
if err := c.Scan(&v); err != nil {
	panic(err)
}

**如果通过Scan方法来读取, 修改文件内容后结构体的也会跟着更改**



for {
	version, err := c.Value("service.version").String()
	if err != nil {
		panic(err)
	}
	log.Printf("version: %s", version)
	time.Sleep(time.Second)
}

// 2023/05/07 11:51:47 version: v1.0.0
// 2023/05/07 11:51:48 version: v1.0.011


#### 使用Value



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

### 监听配置变更


通过`.Watch`​方法,可以监听配置中某个字段的变更,在本地或远端的配置中心有配置文件变更时,执行回调函数进行自定义的处理



// watch key
if err := c.Watch("service.name", func(key string, value config.Value) {
	log.Printf("config changed: %s = %v\n", key, value)
}); err != nil {
	panic(err)
}

## env


[完整代码](https://bbs.csdn.net/topics/618658159)


如果有配置需要从环境变量读取可以配置env.NewSource



c := config.New(
config.WithSource(
// 添加前缀为 KRATOS_ 的环境变量,不需要的话也可以设为空字符串
env.NewSource(“KRATOS_”),
// 添加配置文件
file.NewSource(path),
))

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

// 获取环境变量 KRATOS_PORT 的值,这里用去掉前缀的名称进行读取
port, err := c.Value(“PORT”).String()


除了上面使用Value方法直接读的方式,也可以在配置文件内容里使用占位符来把环境变量中的值渲染进去:



service:
name: “kratos_app”
http:
server:
# 使用 service.name 的值
name: “KaTeX parse error: Expected 'EOF', got '#' at position 21: …ice.name}" #̲ 使用环境变量 PORT 替换…{PORT:8080}”
# 使用环境变量 TIMEOUT 替换,无默认值
timeout: “$TIMEOUT”


## consul


### 部署consul


这里我们使用docker-compose部署



version: “3.0”

services:
consul:
container_name: consul
image: consul
restart: always
ports:
- 8500:8500
command: [“consul”,“agent”,“-server”,“-bootstrap”,“-data-dir”,“/consul”,“-ui”,“-bind”,“127.0.0.1”,“-client”,“0.0.0.0”]


添加配置



docker exec -it consul consul kv put http/server/port 8000


代码实现



package main

import (
“github.com/go-kratos/kratos/contrib/config/consul/v2”
“github.com/go-kratos/kratos/v2/config”
“github.com/hashicorp/consul/api”
“log”
)

func main() {
consulClient, err := api.NewClient(&api.Config{
Address: “127.0.0.1:8500”,
})
if err != nil {
panic(err)
}
cs, err := consul.New(consulClient, consul.WithPath(“http/server”))
// consul中需要标注文件后缀,kratos读取配置需要适配文件后缀
// The file suffix needs to be marked, and kratos needs to adapt the file suffix to read the configuration.
if err != nil {
panic(err)
}
c := config.New(config.WithSource(cs))
defer c.Close()

// load sources before get
if err := c.Load(); err != nil {
	log.Fatalln(err)
}

// acquire config value
foo, err := c.Value("port").String()
if err != nil {
	log.Fatalln(err)
}

log.Println(foo)

}


## etcd


### 部署etcd


这里我们使用docker-compose部署



version: “3.0”

networks:
etcd-net: # 网络
driver: bridge # 桥接模式

volumes:
etcd1_data: # 挂载到本地的数据卷名
driver: local
etcd2_data:
driver: local
etcd3_data:
driver: local

etcd 其他环境配置见:https://doczhcn.gitbook.io/etcd/index/index-1/configuration

services:
etcd1:
image: bitnami/etcd:latest # 镜像
container_name: etcd1 # 容器名 --name
restart: always # 总是重启
networks:
- etcd-net # 使用的网络 --network
ports: # 端口映射 -p
- “20000:2379”
- “20001:2380”
environment: # 环境变量 --env
- ALLOW_NONE_AUTHENTICATION=yes # 允许不用密码登录
- ETCD_NAME=etcd1 # etcd 的名字
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd1:2380 # 列出这个成员的伙伴 URL 以便通告给集群的其他成员
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 # 用于监听伙伴通讯的URL列表
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 # 用于监听客户端通讯的URL列表
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd1:2379 # 列出这个成员的客户端URL,通告给集群中的其他成员
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster # 在启动期间用于 etcd 集群的初始化集群记号
- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 # 为启动初始化集群配置
- ETCD_INITIAL_CLUSTER_STATE=new # 初始化集群状态
volumes:
- etcd1_data:/bitnami/etcd # 挂载的数据卷

etcd2:
image: bitnami/etcd:latest
container_name: etcd2
restart: always
networks:
- etcd-net
ports:
- “20002:2379”
- “20003:2380”
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_NAME=etcd2
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd2:2380
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd2:2379
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
- ETCD_INITIAL_CLUSTER_STATE=new
volumes:
- etcd2_data:/bitnami/etcd

etcd3:
image: bitnami/etcd:latest
container_name: etcd3
restart: always
networks:
- etcd-net
ports:
- “20004:2379”
- “20005:2380”
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_NAME=etcd3
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd3:2380
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd3:2379
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
- ETCD_INITIAL_CLUSTER_STATE=new
volumes:
- etcd3_data:/bitnami/etcd


然后添加一个配置



docker exec -it etcd1 etcdctl put /app-config hello


代码实现读取配置



package main

import (
“log”
“time”

clientv3 "go.etcd.io/etcd/client/v3"
"google.golang.org/grpc"

cfg "github.com/go-kratos/kratos/contrib/config/etcd/v2"
"github.com/go-kratos/kratos/v2/config"

)

func main() {
// create an etcd client

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

config"
)

func main() {
// create an etcd client

[外链图片转存中…(img-PslhhLib-1715655427886)]
[外链图片转存中…(img-MV9O8yqL-1715655427886)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值