【推荐】开源动态配置ares服务让业务飞起来,”赶超nacos、apollo,从此不再依靠 spring cloud config“

本文主要是介绍【推荐】开源动态配置ares服务让业务飞起来,”赶超nacos、apollo,从此不再依靠 spring cloud config“,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

What is ARES?

Open source dynamic configuration center with easy deployment and high stability

Ares系统是基于Java语言开发的,部署简单且高稳定性的动态配置系统.

让您可以集中化、动态化管理自己应用中的配置.

允许您的应用以监听和拉取结合的方式快速变更运行时的应用配置

具有丰富的配置管理UI简化操作,同时也保障数据的隔离性与灵活性

About

Ares系统目前在橙鹰公司内部使用,并稳定的提供服务:

  • 长时间稳定运行:自上线以来已经稳定运行长达吗1年 以上

  • 支持多条业务线:公司内 *3条* 环境隔离的业务线同时使用 1套 Ares动态配置

  • 接入众多服务:一共支持了 *23个* 先上服务,包括 600多条 配置信息

  • 支持多个环境:同时支撑开发、测试、预发、线上 *4套* 环境

  • 完成大量配置推送:自上线以来总共进行过接近 *2000次* 配置修改

 

项目地址:https://github.com/ChengYingOpenSource/ares

开源不易,我们会持续维护和优化,惊喜不断请大家点赞收藏!

为迎接2021,经过内部使用多年,正式开源并发布正式版本,欢迎大家使用和共同参与开发和维护。

 

  • 欢迎大家钉钉扫码加入 

常见配置服务比较

 

功能点

Spring Cloud Config

Apollo

Nacos

Ares

分布式部署

 部署复杂

部署复杂

部署简单

部署简单

配置格式校验

不支持

支持

支持

支持

通信协议

HTTP和AMQP

HTTP

HTTP

TCP

数据一致性

Git保证数据一致性,从Git读数据

数据库模拟消息队列,Apollo定时读消息

HTTP异步通知

Ack+心跳时间戳

注册中心

不支持

不支持

支持AP和CP模型

后续支持

权限管理

不支持

支持

不支持

可优化

易用性

无界面易用性差

有界面支持,使用复杂

简单

简单

 

 

 

 

 

 

Features

高效的动态配置

  • 多环境、多层次的配置管理,支持复杂的业务场景和网络环境

  • 支持websocket模式,方便非Java语言的接入

  • 客户端自适应的负载均衡,避免服务端抖动带来的配置丢失

  • 基于TCP的长连接,监听模式让配置生效更实时

可扩展的集群服务

  • 分布式部署的服务端,远程协调,构成一个集群

  • 去中心化的集群服务,每个服务端对外服务都是一致的

  • 服务器集群化过程不依赖其它中间件

  • 允许运行时对服务端集群进行扩容

  • 服务端与管理端统一部署,不需要额外部署SLB


Overall architecture

 

 

 

Performance and restrictions(性能测试)

测试环境:

1 server / 50 clients

server specification: 2c4g, JVM -Xmx512m

CilentsNumberStartPushingTimeLastReceivedTimeElapsedTimeFailure
1010:34:15.40010:34:15.48282ms0
2010:39:51.08010:39:51.183103ms0
5010:58:32.30110:58:32.490190ms0

Modules

  • ares-biz : 核心逻辑模块,包括主要的配置管理和推送流程

  • ares-client : 客户端SDK模块,负责实现与服务器集群的通讯和配置的更新

  • ares-client-spring : 基于Spring框架实现的可快速接入SDK

  • ares-cluster : 基于Akka框架实现的,去中心化的集群模块

  • ares-common : 常用的工具类集合和主要的基础数据模型

  • ares-dao : 数据库访问层

  • ares-deploy : 构建和部署程序,保护配置文件

  • ares-model : 数据模型集合

  • ares-webapi : 接口逻辑模块

部署文档

 https://github.com/ChengYingOpenSource/ares/blob/master/doc/UserGuide/Deployment.md

接口文档

https://github.com/ChengYingOpenSource/ares/blob/master/ares-doc/api-doc.md

 Ares中的发布订阅机制

 https://github.com/ChengYingOpenSource/ares/blob/master/doc/DesignAndPattern/Architecture.md

配置同步机制

https://github.com/ChengYingOpenSource/ares/blob/master/doc/DesignAndPattern/Flow.md

服务端核心流程

 

  • NettyServer: 通过netty创建server, 接受客户端的channel链接和数据接受发送;

  • Coordinator: 当NettyServer接受到请求时,通过coordinator进行处理, 同时coordinator订阅eventbus的事件 ; 当server端配置变更时,需要主动推送数据,会通过eventbus 传递给coordinator;

  • ConfManager: 配置管理的核心类,响应配置的查找、变更;

  • ServerCluster: 集群服务管理入口的类; 提供配置变更在集群内的publish;

  • ClusterNotify:集群内消息通知的类, 底层实现可以是AkkaCluster,也可以是自定义其它方式;

  • AkkaCluster: 通过akka 实现集群管理和消息的publish;

  • Cache: 用于配置的缓存, 加快配置的查找和读取;

缓存设计 &数据一致性

https://github.com/ChengYingOpenSource/ares/blob/master/doc/DesignAndPattern/Server.md

 

配置管理的五大核心概念

应用: 实际使用配置的应用, 每个应用都需要有唯一的身份标识 —— appCode
环境: 配置对应的环境 , 环境和代码无关,同一份代码部署在不同的环境就应该能够获取到不同环境的配置。
集群: 一个应用下不同实例的分组 ; 对不同的cluster,同一个配置可以有不一样的值,如zookeeper地址
配置组: 一个应用下不同配置的分组, 如数据库配置文件,RPC配置文件,应用自身的配置文件等
配置项: KV配置对的内容; key使用dataId进行表示; Value即配置的Content

关系如下图所示

 

配置管理操作

命名空间

命名空间(namespace)的主要作用是为了更清楚的将不同业务线的应用做划分,方便我们管理不同业务线的各个应用。命名空间页面主要提供对命名空间的管理功能,包括:新建命名空间,删除命名空间,命名空间列表。 如下图所示: 

新建命名空间

新建命名空间需要填写:命名空间编码,命名空间名称,描述三个字段。具体如下图所示。 

环境空间

环境空间的主要作用是划分应用不同的部署环境,应用与环境是一对多的关系,即同一个应用在不同环境下,可以有不同的配置。目前定义了:开发,测试,预发,生产四个环境。 具体界面如下所示: 

应用配置

应用配置主页面主要是对已有应用的展示,并提供了新建应用,删除应用,应用搜索功能。 

应用配置页面

点击应用配置主页面中的应用名称,会进入应用配置页面,我们对应用配置的设置都会在这里完成。新增一个应用配置主要有以下几个步骤。
1、首先检查左侧菜单栏中,该应用是否已经绑定环境。如果没有绑定环境,则通过“绑定环境”按钮来绑定环境,如果已经绑定环境,则选择要新增配置的环境。
2、选择要新增配置的分组,默认为default分组,如果对分组有需要,可以通过“新增分组”来完成分组的创建
3、选择好分组之后,我们就可以创建新的应用配置了。ares中对于value提供了丰富的类型,能够满足我们开发过程中的不同需求,主要有:TEXT JSON,XML,YAML,HTML,Properties。
4、保存完配置之后,可以通过配置列表中右侧“push轨迹”查看已经接收配置的应用实例,描述或配置内容的改变都会触发push操作。 

应用接入教程

 https://github.com/ChengYingOpenSource/ares/blob/master/doc/UserGuide/QuickStart.md

本案例基于spring boot 2.X

关键操作步骤

1. 搭建spring boot 2.X项目,引入关键依赖

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.1.1.RELEASE</version>
</dependency>

2. 添加 spring ares client,具体版本以最新为主

 <dependency><groupId>com.cy.ares</groupId><artifactId>ares-client-spring</artifactId><version>${ares-client-spring.version}</version>
</dependency>

3. 根据实际需要,添加其它依赖包

4. 主程序配置,添加自动扫描 ares client包,注入bean

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(basePackages = "com.cy.ares")

5. 添加关键配置,具体配置根据实际环境配置

#应用端口
server.port=30000
#应用名
spring.application.name=ares_demo
#动态配置应用名
ares.config.appCode=test
#动态配置环境编码
ares.config.envCode=cy-platform-dev
#动态配置项目空间名
ares.config.namespaceCode=fd_saas
#动态配置服务节点ip:port 多个逗号分隔
ares.config.serverAddr=192.168.101.32:30333

对应关键配置作用 

6. 添加动态配置管理类,加载动态配置核心bean SpcpContext;详细可参照本项目AresConfig类

@Component
public class AresConfig {private static final Logger LOGGER = LoggerFactory.getLogger(AresConfig.class);
private static final String TEST_PUSH_ACTION_CFG_KEY = "test.push.cfg.key";private static final String TEST_GET_ACTION_CFG_KEY = "test.get.action.cfg.key";@Resourceprivate SpcpContext spcpContext;
}

支持两种方式,一种是配置变更监听器通知更新,一种是主动获取最新配置。

方式1:配置变更监听器通知更新

 /*** 测试配置*/@Getterprivate List<String> testPushActionCfg = Collections.emptyList();@PostConstructpublic void init() {ConfigFetchActor fetchActor = spcpContext.getConfFetchActor();try {fetchActor.addListener(TEST_PUSH_ACTION_CFG_KEY, this::setTestPushActionCfg);setTestPushActionCfg(spcpContext.getConfFetchActor().getConfig(TEST_PUSH_ACTION_CFG_KEY));} catch (Exception e) {LOGGER.error("AresConfig fetchActor riskFilterTenantCodes config fail. e:{}", e);}}/*** 更新本地配置** @param dataItem*/private void setTestPushActionCfg(DataItem dataItem) {String value = dataItem != null ? dataItem.getContent() : null;// 配置变更打印LOGGER.warn("setSpecialTenantCodesConfig value={}", value);if (org.apache.commons.lang3.StringUtils.isBlank(value)) {testPushActionCfg = Collections.emptyList();} else {try {testPushActionCfg = JSONObject.parseObject(value, new TypeReference<List<String>>() {});} catch (Exception e) {LOGGER.error("parse fail e:{}", e);testPushActionCfg = Collections.emptyList();}}}

方式2:主动获取最新配置

/*** 根据key查询value** @param key 配置key* @return 配置value*/private String getValue(String key) {try {ConfigFetchActor fetchActor = spcpContext.getConfFetchActor();DataItem dataItem = fetchActor.getConfig(key);if (dataItem == null) {return null;}return dataItem.getContent();} catch (Exception e) {LOGGER.error("get ares config exception!key:" + key, e);}return null;}/*** 根据key查询value** @param key        配置key* @param defaultVal 默认值* @return 配置value*/public String getValue(String key, String defaultVal) {try {String configValue = getValue(key);if (StringUtils.isBlank(configValue)) {return defaultVal;}return configValue;} catch (Exception e) {LOGGER.warn("get ares config key:{} fail! defaultVal:{}", key, defaultVal);return defaultVal;}}public int getTestConfig() {// 默认值30String val = getValue(TEST_GET_ACTION_CFG_KEY, String.valueOf(30));int days = Integer.valueOf(val);return days;}

8. 在动态配置管理界面添加对应项目空间(namespace)环境(envCode)应用(appCode)对应配置项

如不需要经常修改可使用默认值,可不需要在管理界面上添加配置项。

9. 添加配置获取使用,本样例定时打印

@Slf4j
@Component
@AutoConfigureAfter(AresConfig.class)
public class ConfigPrintTask {@Resourceprivate AresConfig aresConfig;@Scheduled(cron = "*/5 * * * * *")public void configShow() {log.info("TEST_GET_ACTION_CFG_KEY value:{}", aresConfig.getTestConfig());log.info("=============================");log.info("TEST_PUSH_ACTION_CFG_KEY value:{}", aresConfig.getTestPushActionCfg());log.info("=============================");}
}

10. 启动项目可以看到ares启动关键信息

客户端配置加载启动,关键信息

2020-10-13 20:26:19.857 [INFO ] [main] com.cy.ares.spcp.context.SpcpContext - [Ares2Client] addShutdownHook success.
2020-10-13 20:26:20.288 [INFO ] [main] c.c.a.spcp.client.network.netty.NettyPoolManager - newClient created!,currentNode={"host":"192.168.101.32","port":30333}
2020-10-13 20:26:21.635 [INFO ] [nioEventLoopGroup-2-2] c.c.a.spcp.client.network.netty.LogicClientHandler - channel Active!ctx=LogicClientHandler#0
2020-10-13 20:26:21.639 [INFO ] [main] c.c.a.spcp.client.network.netty.NettyPoolManager - check channel ,active=true
2020-10-13 20:26:21.642 [INFO ] [main] c.c.a.spcp.client.network.netty.NettyPoolManager - newClient success!
2020-10-13 20:26:21.644 [INFO ] [main] c.c.a.spcp.client.network.netty.NettyPoolManager - check channel ,active=true
2020-10-13 20:26:21.646 [INFO ] [main] c.c.a.spcp.client.network.netty.NettyPoolManager - checkClient =true!

客户端注册监听器,并获取配置初始化,关键信息

2020-10-13 20:26:21.818 [INFO ] [main] c.cy.ares.spcp.actor.register.ServiceRegisteActor - registe success result={"count":0,"eventId":"ca64639d-e4d4-4866-b025-95e0dca5ea29","header":{},"name":"resp:service:registe"}
2020-10-13 20:26:21.890 [WARN ] [main] com.cy.ares.spcp.actor.fetcher.ConfigFetchActor - fetch data item is empty!
2020-10-13 20:26:21.899 [INFO ] [main] com.cy.ares.client.spring.SpringAresContextCreater - create spcpContext,config={"confNodes":[{"host":"192.168.101.32","port":30333}],"connectTimeout":3000,"heartbeatInterval":3000,"heartbeatMaxFailedCount":3,"heartbeatRespTimeout":3000,"initReadTimeout":10000,"maxChannel":2,"maxPoolTry":3,"readTimeout":5000,"respExecuteMaxThread":16,"serverAddr":"192.168.101.32:30333"},instanceInfo={"appCode":"test","clusterCode":"default","envCode":"cy-platform-dev","hostName":"CYSJ-GDDN-0157.hz.ali.com","instanceId":"30.14.204.136;CYSJ-GDDN-0157.hz.ali.com;90185;91979769","ipAddr":"30.14.204.136","namespaceCode":"fd_saas","serverPort":0}
2020-10-13 20:26:21.931 [WARN ] [main] com.cy.ares.spcp.actor.fetcher.ConfigFetchActor - fetch data item is empty!dataId=test.push.cfg.key,group=default

客户端配置主动获取,关键信息

2020-10-13 20:26:25.025 [WARN ] [scheduling-1] com.cy.ares.spcp.actor.fetcher.ConfigFetchActor - fetch data item is empty!dataId=test.get.action.cfg.key,group=default
2020-10-13 20:26:25.032 [INFO ] [scheduling-1] com.cy.ares.demo.task.ConfigPrintTask - TEST_GET_ACTION_CFG_KEY value:30
2020-10-13 20:26:25.033 [INFO ] [scheduling-1] com.cy.ares.demo.task.ConfigPrintTask - =============================
2020-10-13 20:26:25.033 [INFO ] [scheduling-1] com.cy.ares.demo.task.ConfigPrintTask - TEST_PUSH_ACTION_CFG_KEY value:[]
2020-10-13 20:26:25.033 [INFO ] [scheduling-1] com.cy.ares.demo.task.ConfigPrintTask - =============================

11. 管理界面配置变更,监听器会主动打印配置变更信息,并更新。

12.打包操作

mvn clean package -Dmaven.test.skip=true

13. 打包完后在项目target目录下找到jar包,执行启动操作

默认端口 30000 启动操作

 java -jar ares-demo.jar

Planning

  • 灰度发布:允许按照流量标识或者机器IP等标识生效配置,来让配置生效过程更加平稳

  • 平滑扩容:新的机器加入集群后,客户端可以快速感知和负载均衡

  • 支持spring注解:支持动态修改spring注解的配置项

  • 多语言支持:后续将有更多语言的SDK以websocket或者TCP的方式接入Ares

  • 云原生的部署:优化集群建立方式,支持如K8S环境下的部署

  • 可扩展的管理端权限:使用方可以将自己的权限体系接入管理端

 

这篇关于【推荐】开源动态配置ares服务让业务飞起来,”赶超nacos、apollo,从此不再依靠 spring cloud config“的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/390715

相关文章

Java五子棋之坐标校正

上篇针对了Java项目中的解构思维,在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现:坐标校正,我们如何使漫无目的鼠标点击变得有序化和可控化呢? 目录 一、从鼠标监听到获取坐标 1.MouseListener和MouseAdapter 2.mousePressed方法 二、坐标校正的具体实现方法 1.关于fillOval方法 2.坐标获取 3.坐标转换 4.坐

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

UE3 的Config文件夹

工作中需要用到UE3,看官方文档中文版翻译有些偷懒和翻译不妥当,故看着英文自己翻译理解了一下,以供后续参考。 目录 基础内容 0.概述  1.uc脚本中的类定义关联配置文件和保存 2.保存配置文件API SaveConfig() StaticSaveConfig() 3.ucc 编译的时候使用 4.配置文件类型 Default 配置文件 和 XXX 配置文件  Base 配置

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。