掘金 后端 ( ) • 2024-06-06 17:50

简介

去中心化的配置平台和注册中心,轻松部署多个节点即可实现高可用的配置中心和注册中心。 有别于以往的配置中心 + 注册中心 的结构, 对于大多数中小公司或组织而言, 其实这两个组件是完全可以合并的, 分别维护配置中心和注册中心,需要花费很多的额外代价,需要精通两个组件以及两个组件依赖的组件, 比如 apollo, 它还依赖数据库,还有单独的管理页面等。 spring-cloud 需要单独部署eureka等等。 总之,分开维护的成本是很高的,如果想合并使用, micro-conf 或许是你唯一的选择。

项目地址:

  1. micro-conf 核心服务
  2. micro-conf-go go版本客户端,目前已实现
  3. micro-conf-ui 界面,计划会利用 go embedded 把前端直接嵌入二进制,降低维护成本。

micro-conf 把配置中心和注册中心可以合并的部分,统统进行了合并,只有在关键功能上进行了区分, 比如配置管理以及服务注册两个部分是分开的, 但是其他部分比如心跳维护、配置下发等都是合并的。 它的设计是非常简单的。 架构图如下:

arch.png

功能特点介绍

  1. micro-conf 底层存储使用 raft协议,具有很高的可用性,任意一台节点挂掉,不影响其他节点正常提供服务。任一台节点提供的功能均等价,包括API、心跳和前端页面等, 部署和维护极为简单。
  2. micro-conf 具备 apollo和spring-cloud 的核心功能, 可以轻松方便的使用。
  3. 项目是go编写的, 启动速度是非常快的,而且占用资源比较小,节省内存和cpu。
  4. 前置nginx进行路由转发,配置页面也可以实现高可用。
  5. 客户端自动重连, 网络抖动不影响正常提供服务
  6. 采用Websocket连接方式进行心跳上报和配置推送。

管理页面使用

  1. 如果你不是管理员,那么请你先注册一个用户。
  2. 如果没有应用,你可以委托管理员帮你创建一个应用
  3. 如果有应用没权限, 你可以委托管理员,或者应用的owner帮你添加对应的权限
  4. 应用创建完成并且分配权限后,你将会有一个应用详情页的入口, 你可以点击进入详情页
  5. 详情页上,你可以看到正在运行的实例页表以及其状态, 也可以对应用的配置进行修改,甚至可以操作对某台实例进行上下线,编辑实例对应的meta
  6. 详情页上,你还可以看到应用对应的token, 有了token你就可以在项目中使用这个token来连接 micro-conf
  7. 如果想给应用增加其他配置,那么需要在界面上另外添加配置的选项
  8. 管理员可以给普通用户某个App Owner 权限或者 Dev权限, 有了权限, 就可以去对这个App的一些配置进行修改和发布
  9. 权限角色目前有 admin, owner, developer, viewer 四种角色,权限依次降低

管理页面

管理后台需要先登录,登录后无应用,需要先创建应用,创建完应用,分配好权限后即可看到对应的应用详情。

首页

home.png

首页会展示你所拥有权限的应用列表, 也会展示器群信息。 你可以点击收藏自己常用的应用,也可以通过 Ctrl +F 搜索你需要管理的应用。

应用配置页

detail.png

左侧你可以看到这个应用的详细信息,包括创建时间、部门、创建人、权限、 应用的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 存在的意义就是为了合并配置中心和服务注册中心,减少对应的服务器成本和维护成本。因此他主要包括如下两方面的功能

  1. 配置中心
    • 配置管理和获取
    • 配置变化监听
  2. 注册中心
    • 把自身注册为可供其他应用调用的微服务
    • 生成可以调用其他微服务的客户端
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,其他语言的客户端暂时不支持 如果开发者有兴趣, 欢迎编写其他语言的客户端,并提交. 可以联系我,直接建立对应的仓库。

由于目前此项目仅有我一个人在维护和跟进, 如果需要新的功能,可能需要比较长的时间开发。 如果您对这个项目有兴趣,欢迎发邮件联系我。

文章如需转载,请注明出处。