简介
去中心化的配置平台和注册中心,轻松部署多个节点即可实现高可用的配置中心和注册中心。 有别于以往的配置中心 + 注册中心 的结构, 对于大多数中小公司或组织而言, 其实这两个组件是完全可以合并的, 分别维护配置中心和注册中心,需要花费很多的额外代价,需要精通两个组件以及两个组件依赖的组件, 比如 apollo, 它还依赖数据库,还有单独的管理页面等。 spring-cloud 需要单独部署eureka等等。 总之,分开维护的成本是很高的,如果想合并使用, micro-conf
或许是你唯一的选择。
项目地址:
- micro-conf 核心服务
- micro-conf-go go版本客户端,目前已实现
- micro-conf-ui 界面,计划会利用 go embedded 把前端直接嵌入二进制,降低维护成本。
micro-conf
把配置中心和注册中心可以合并的部分,统统进行了合并,只有在关键功能上进行了区分, 比如配置管理以及服务注册两个部分是分开的, 但是其他部分比如心跳维护、配置下发等都是合并的。 它的设计是非常简单的。 架构图如下:
功能特点介绍
-
micro-conf
底层存储使用 raft协议,具有很高的可用性,任意一台节点挂掉,不影响其他节点正常提供服务。任一台节点提供的功能均等价,包括API、心跳和前端页面等, 部署和维护极为简单。 -
micro-conf
具备 apollo和spring-cloud 的核心功能, 可以轻松方便的使用。 - 项目是go编写的, 启动速度是非常快的,而且占用资源比较小,节省内存和cpu。
- 前置nginx进行路由转发,配置页面也可以实现高可用。
- 客户端自动重连, 网络抖动不影响正常提供服务
- 采用Websocket连接方式进行心跳上报和配置推送。
管理页面使用
- 如果你不是管理员,那么请你先注册一个用户。
- 如果没有应用,你可以委托管理员帮你创建一个应用
- 如果有应用没权限, 你可以委托管理员,或者应用的owner帮你添加对应的权限
- 应用创建完成并且分配权限后,你将会有一个应用详情页的入口, 你可以点击进入详情页
- 详情页上,你可以看到正在运行的实例页表以及其状态, 也可以对应用的配置进行修改,甚至可以操作对某台实例进行上下线,编辑实例对应的meta
- 详情页上,你还可以看到应用对应的token, 有了token你就可以在项目中使用这个token来连接
micro-conf
了 - 如果想给应用增加其他配置,那么需要在界面上另外添加配置的选项
- 管理员可以给普通用户某个App Owner 权限或者 Dev权限, 有了权限, 就可以去对这个App的一些配置进行修改和发布
- 权限角色目前有 admin, owner, developer, viewer 四种角色,权限依次降低
管理页面
管理后台需要先登录,登录后无应用,需要先创建应用,创建完应用,分配好权限后即可看到对应的应用详情。
首页
首页会展示你所拥有权限的应用列表, 也会展示器群信息。 你可以点击收藏自己常用的应用,也可以通过 Ctrl +F
搜索你需要管理的应用。
应用配置页
左侧你可以看到这个应用的详细信息,包括创建时间、部门、创建人、权限、 应用的token,等等, 也可以在左侧添加应用分组,编辑应用信息,编辑应用角色等。
右侧则是用来管理应用对应分组下面的配置,以及注册的实例列表的, 你可以清楚的看到这个分组下面注册的实例列表, 也可以看到每个配置文件都有哪些实例在监听。 对于配置文件, 你可以通过 Add Namespace
按钮进行添加, 配置文件,配置文件有三种格式可选 json
, yaml
, props
这些都是常用的配置文件格式。修改完配置文件后, 点击保存即可。 你可以点击预览按钮,来对比修改前后的差异, 预览过后,你可以点击发布配置,点击后配置变更推送会推送给监听这一配置文件的所有节点。 如果想看历史配置,则需要点击 Release history
进行查看, 也可以进行方便的回滚操作。
客户端使用
一、 获取依赖 (Get dependency)
go get github.com/grdisx/micro-conf-go
二、编写配置文件 (write config file for micro-conf)
配置文件格式如下,也可以是其他格式的, 只要符合 定义格式 中 MicroConf
格式定义即可
# 服务 id 保证唯一即可
id: OrderService
# raft集群地址,用英文逗号分割,中间不能有空格, 推荐至少部署3台
meta-servers: 10.10.10.44:8000,10.10.10.32:8000,10.10.10.14:8000
# 服务注册的端口
port: 8080
# 服务对应的配置名称, 可以写多个用英文逗号分割, 也可以共享配置,需要指定 app.group.namespace 到sharedNamespace
namespaces: app.props
# 服务分组,默认default
group: default
# 服务与 micro-conf 注册配置中心的心跳间隔
heartbeat-timeout: 10
# 在管理页面新建应用时候分配的 应用对应的token
token: 8kA1W63KOSOXs6x9z8q40w9MXRjZJb9k
# 要注册的meta信息
meta:
# zone 固定meta, 表示区域信息, 可用于客户端筛选zone调用
zone: hz
# tags 也是固定meta,表示标签, 可用于客户端筛选tag调用
tags: beta,test
# 服务信息,是否开启服务注册,如果不开启默认注册的实例状态是 DISABLED, 开启则为 UP
service:
enabled: true
# 依赖的客户端列表
clients:
- name: OrderService
group: default
tags: test
zone: hz
timeout: 10
三、使用方法 (Getting ready)
示例如下,您需要先准备好 micro-conf 的配置对象 mc.MicroConf
, 可以从任意地方读取。
读取后, 可以直接使用 mc.NewClient(conf)
创建客户端, 然后启动客户端即可, 使用方法非常简单。
micro-conf 存在的意义就是为了合并配置中心和服务注册中心,减少对应的服务器成本和维护成本。因此他主要包括如下两方面的功能
- 配置中心
- 配置管理和获取
- 配置变化监听
- 注册中心
- 把自身注册为可供其他应用调用的微服务
- 生成可以调用其他微服务的客户端
package demo
import (
"fmt"
"github.com/grdisx/micro-conf-go/mc"
)
func demo() {
// conf 配置构造这一步需要自己去实现,
conf := new(mc.MicroConf)
// 创建client 并且启动, 正常来讲,需要在你的项目启动前启动
client1 := mc.NewClient(conf)
client1.Start()
// 添加配置变更监听器
client1.AddListener(xxxx)
// ---------------- 配置中心 部分的功能用法 ------------------------
// 从配置中心获取 key为 app.id对应的 int 值
appId, _ := client1.GetInt("app.id")
fmt.Println(appId)
// 从配置中心获取 key为 userIds 对应的 int 值列表
ids := client1.GetIntList("userIds")
fmt.Println(ids)
// 从配置中心获取一个map,key为 demo
m := client1.GetAnyMap("demo")
fmt.Println(m)
// 从配置中心获取一个对象,目前是用json反序列化的
demo := new(DemoStruct)
// ----- 微服务调用方面的支持 -------------------------------------
// 调用其他注册服务的客户端构造,(本例为自己调用自己)
// 目前的负载均衡策略是 RoundRobin
orderService := client1.GetClient("OrderService")
resp, err := orderService.Get(context.Background(), "/api/ping")
orderService.Post(context.Background(), "/api/ping")
orderService.Put(context.Background(), "/api/ping")
}
注: 本包支持,多个服务的注册,只需要多份配置即可, 配置上不能有冲突,比如端口不能冲突, app名称不能冲突
贡献 (how to contribute)
目前计划支持Java,其他语言的客户端暂时不支持 如果开发者有兴趣, 欢迎编写其他语言的客户端,并提交. 可以联系我,直接建立对应的仓库。
由于目前此项目仅有我一个人在维护和跟进, 如果需要新的功能,可能需要比较长的时间开发。 如果您对这个项目有兴趣,欢迎发邮件联系我。
文章如需转载,请注明出处。