草庐IT

这个好用的分布式应用配置中心,我们把它开源了

百度Geek说 2023-03-28 原文


导读:SpringBoot的时代到来,对于曾经面向一堆XML配置的开发经历,那真是一大福音,一切都变得非常简洁,留下的就是简化的配置文件设置。但在分布式环境下呢?众多的实例集群下,动态的实例迁移等情况时常发生,导致配置管理的工作变得复杂且困难,百度研发团队通过多年的架构建设经验,把过往的配置管理的相关经验沉淀成一套通用的解决方案,现以开源的方式回馈给社区开发者,希望帮助大家彻底解决配置建设的难题。

全文约4200字,预计阅读时间8分钟。

分布式环境下的配置管理挑战可以说配置化是当今应用开发与部署必备的一个能力要求,我们通常把一些容易变化以及依赖外部情况而变化的内容,通过配置化的方式来实现,这样我们就可以在零编码的情况下实现功能调整,实现极低成本的应用扩展能力。而对于配置管理方式,最为常见的方式就是配置文件方式, 通过特定的文件内容格式进行设置, 部署时也会与应用程序放在一起。这样使用方式在单机情况下比较容易且简单,但是在大型的分布式应用场景下,特别又要区分不同环境(开发,测试,线上等)就会导致管理成本与出错风险急速加大。

以上述场景为例,涉及的问题与挑战有:

  1. 操作复杂,成本高:如果有几十台实例,则需要按个登录机器进行修改, 很容易发生遗漏;
  2. 检验与查错难度大:在几十台实例修改,如有其中几台修改出错,很难发现,同时也很难进行内容回溯与回滚;
  3. PAAS环境下,无法有效操作:在paas环境下,因为漂移都现象存在,直接登录实例进行修改,已经是非常危险的行为了,因为一旦漂移,配置就会失效到最初方式;
  4. 动态加载,配置变更推送场景很难支持。

所以针对大型分布式场景,通过建立配置中心来统一管理配置的能力就显得非常必要了,把业务开发者从复杂以及繁琐的配置管理中解脱出来,只需专注于业务代码本身,从而可以显著提升开发以及运维效率。将配置和应用在部署阶段解耦也可以进一步提升发布的效率,降低部署成本。同时配置独立化管理后,针对配置的安全性、回滚能力、追溯能力、应急控制处理等也会有很强的支撑。

2  BRCC为什么是一个好的配置中心

2.1  好的配置中心应该具有的优点

前面讲了在分布式环境中为什么需要配置中心,那么一个好的配置中心应该具备哪些优点呢?
在我们看来,好的配置中心应该有以下优点:

1. 使用便捷

业务系统使用配置中心应该是非常简单的:配置中心提供统一的kv管理能力,业务系统从配置中心获取配置,然后在系统中使用配置。所以我们认为,衡量配置中心是否优秀的最关键因素就是业务系统使用配置的便捷程度,越方便越是好的配置中心。
使用便捷包括了两个方面:

  • 接入便捷  SDK与API是最常见的接入方式。应尽可能的使用标准化的设计要求。SDK如在Java语言使用,应兼容Spring与SpringBoot的配置规范,直接使用而无需修改原有代码, API则采用RESTful的定义标准,采用资源定位方式,提升可读性与易用性;
  • 管理便捷  好的配置中心会提供界面友好的控制台,方便使用者登录进行配置管理。配置的管理层面更加清晰化,包括产品,工程, 环境, 版本, 分组等丰富的管理机制。

2. 功能完善

配置中心最主要的功能是对配置的管理,除了对配置的crud、批量变更、模糊匹配、快速导航之外,一个好的配置中心还需要有以下的配置能力:

  • 推送  使用者在配置中心变更了配置,能够重新推送配置给业务系统,并且能反馈业务系统接收配置的状态。
  • 追溯  配置变更的历史都有保存,并且变更之间能进行diff。在分布式环境下, 可以追踪各个实例的生效状态,
  • 多环境多版本  好的配置中心能满足业务系统在不同环境和版本下的配置需求,并提供版本之间diff的能力。
  • 审计/回滚  配置中心能记录使用者做的每一次变更操作,供审计使用。

3. 运维简单

  • 部署简单  能快速部署在各种环境,支持更丰富的环境,如虚拟机、paas、容器化等,支持集群化和高可用部署。
  • 监控告警  提供完整,丰富监控和告警的能力,以帮助快速定位问题,快速处理风险。

4. 安全可靠

配置安全性非常关键,例如数据库的用户与密码,一旦泄露风险非常大,所以配置中心的安全性需要很全面的考量。
一是配置存储、传输的安全性,如内容可以加密;二是操作的权限管控, 必须对使用者进行权限控制,而权限控制的粒度到什么程度、使用者的操作是否有迹可循、配置变更是否可回滚,都决定着配置中心的好坏。

5. 高性能与稳定性

在很多大型业务场景下,还面临着众多产品线同时使用的情况,产生高并发的请求配置服务的情况。所以在配置服务的架构设计必须需要考虑到这种因素,实现高吞吐、高时效与高稳定的架构要求。所以整体架构要具备分布式的架构设计要求,配合弹性的扩展能力与多级的缓存同步机制,才能很好地解决这些问题,达到秒级的推送与变更能力, 提升至4个9999的稳定性要求。

2.2 BRCC的优点

21年2月我们开源了一款配置中心BRCC (Better Remote Config Center),其主打的产品特性就是简单、易用、安全。BRCC功能结构图如下:


特点

1. 简单好用的SDK端

BRCC提供多种语言的sdk,拿java sdk来说,其特点就是完全兼容springboot的配置规范,可以直接使用spring的@Value注解来加载配置,如下代码:

@Componentpublic class Person {
   @Value("person.username")    private String name;

   // 提供Setter 和 Getter 方法}

对于习惯spring的开发者来说,可以在application.properties里面设置 person.username=张三 就能在启动时将“张三”赋值给persion类的name变量上。而在使用BRCC时,只要把 person.username=张三  保存在BRCC中,引入BRCC starter的依赖就可以了,在业务代码上无需改造,对业务系统来说可以算是0侵入了。
2. 功能完备的服务端
BRCC作为一种轻量级的分布式配置管理解决方案,部署简单,基于spring boot 2.0开发,打包后可以直接运行,支持配置的分发、更新推送。除了部署简单外,服务端还有一些特别实用的功能:

  • 安全的控制台  提供了一套完整的控制台操作界面,支持多级权限控制,能够从产品线、工程、环境等维度上进行读写的控制。
  • 配置热发布  BRCC提供了配置推送的功能,当配置变更后,可以主动触发推送,将配置重新推送给业务系统,而业务系统收到配置后,可以根据自己的需要进行热更新,从而不需要重启既可以生效配置。在BRCC的服务端也可以查看推送后配置在业务系统上的生效情况。
  • 配置操作可追溯  在业务系统的迭代升级中,常常会有配置的变动,在BRCC中,使用者对配置的所有变更操作都有迹可循,对历史配置也可以查询、回滚和对比。

总而言之,BRCC是一块非常优秀的分布式配置中心解决方案,它完全兼容原生Spring配置规范,除了提供基本的配置存储,还提供配置注释、key-value维度查询、变更推送、变更轨迹记录及查询、细粒度的权限控制、sdk实例管理、友好的UI界面,简单部署等特点,详细的功能请参看https://github.com/baidu/brcc。下面我们来看看如何快速搭建和使用吧!

3. BRCC快速入门

3.1 快速搭建BRCC服务端

选择一个合适的版本, 您可以在brcc的release notes中找到每个版本支持的功能的介绍,当前推荐的稳定版本为1.0.4。

https://github.com/baidu/brcc/releases


为了方便大家体验,我们在百度云上部署了体验环境:

在线体验环境地址:http://180.76.36.149/#/login测试账号1:test1 123456测试账号2:test2 123456

第一步,环境准备。
BRCC 依赖 Java 环境来运行。

https://docs.oracle.com/cd/E19182-01/820-7851/inst_cli_jdk_javahome_t/

如果您是从代码开始构建并运行BRCC,还需要为此配置 Maven环境。

https://maven.apache.org/index.html

请确保是在以下版本环境中安装使用:


  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。

  2. 64 bit JDK 1.8+;下载 & 配置。

  3. Maven 3.2.x+;下载 & 配置。(仅源码编译需要)

  4. mysql5.6+

  5. redis3.2+


64 bit JDK 1.8+ 下载

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
64 bit JDK 1.8+ 配置

https://docs.oracle.com/cd/E19182-01/820-7851/inst_cli_jdk_javahome_t/
Maven 3.2.x+ 下载

https://maven.apache.org/download.cgi
Maven 3.2.x+ 配置

https://maven.apache.org/settings.html

第二步,下载源码或者安装包。
你可以通过源码和发行包两种方式来获取brcc。

  • 从 Github 上下载源码方式

git clone https://github.com/baidu/brcc.git
cd brcc/
sh compile.sh


  • 下载编译后压缩包方式


您可以从 release notes下载 brcc-server.zip 包。

unzip brcc-server.zip 或者 tar -zxvf brcc-server.tar.gz
cd brcc-server


第三步,启动BRCC配置中心服务。


在start.sh中按要求配置好mysql和redis后,你就可以通过执行此脚本启动brcc了。

3.2 配置管理与SDK接入

第一步,BRCC管理端添加配置。

在brcc管理端创产品线、工程、环境、版本、分组、 配置, 如下图所示。


如上图,创建了产品线test1、工程test-rcc、版本1.0.0 和分组group1,并且配置了a、b、c 配置项。


第二步,引入brcc-sdk-starter, 确保pom.xml中引入以下依赖。

<dependency>
    <groupId>com.baidu.mappgroupId>
    <artifactId>brcc-sdk-starterartifactId>
    <version>${brcc.version}version>
dependency>

目前最新的版本是1.0.0。


第三步, 添加BRCC的SDK配置描述。


在接入brcc配置中心之前,确保SpringBoot配置是完整的, 在application.properties文件中添加如下内容。

  rcc.cc-server-url: http://180.76.36.149
  rcc.cc-password: 123456
  rcc.logProperties: true
  rcc.projectName: test-rcc
  env-name: dev
  cc-version-name: 1.0.0
  enableUpdateCallback: true
  appName: example


配置属性介绍

属性名称

默认值

必填

描述

rcc.cc-server-urlnull

服务地址

rcc.project-namenull

工程名称

rcc.cc-passwordnull

工程的api密码, 创建工程时指定

rcc.env-namenull

环境名称

rcc.cc-version-namenull

版本名称

rcc.log-propertiesfalse

是否打印配置

rcc.enable-update-callbackfalse

是否启用自动更新

rcc.connection-timeout3000

链接超时时间(ms)

rcc.read-timeout10000

读超时时间 (ms)

rcc.callback-interval2000

心跳探测频率(ms)

rcc.app-name

null

实例上报,采集应用名

rcc.container-id-env-name

hostname

容器ID对应的环境变量名称

rcc.idc-env-name

null

机房ID对应的环境变量名称

rcc.use-only-site-local-interfaces

false

是否上报IP只读局域网卡

rcc.preferred-networks

null

上报IP来源网卡(如en0)列表,英文逗号分隔

rcc.ignored-interfaces

null

上报IP来源忽略网卡列表,英文逗号分隔


第四步,在项目中进行配置开发。


brcc完全兼容原生spring配置规范,你可以像application.yml,application.properties一样是用brcc中的配置,如:

@Value("${a}")
int a = 0;
 
@Value("${b}")
long b = 0;
 
@Value("${c}")
String c;


第五步,配置验证。


启动日志中出现以下日志说明配置加载成功。


配置发送变更后执行推送变更操作后,日志中会出现以下提示。


以上例子,你可以到 https://github.com/baidu/brcc/tree/main/brcc-example 获得。

4  关于我们我们大部分成员来自于百度智能小程序研发部的基础架构团队,致力于用简单易用的方式解决配置相关的需求,降低配置的研发和运维成本。
BRCC的愿景是为业务系统提供简单、好用的配置服务。目前BRCC已经github上开源,大家可以访问获取全部代码,也可以star我们项目,以便高效获得我们持续的更新信息。

https://github.com/baidu/brcc


本期作者介绍 | 来自于百度智能小程序研发部的基础架构团队,致力于用简单易用的方式的解决配置相关的需求,降低配置的研发和运维成本。


阅读原文:这个好用的分布式应用配置中心,我们把它开源了

招聘信息:近期热招大数据研发工程师、服务端研发工程师(C++/GO/Java),Web前端研发工程师,iOS/Android客户端研发工程师

欢迎关注百度Geek说同名公众号联系我们~



有关这个好用的分布式应用配置中心,我们把它开源了的更多相关文章

  1. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  4. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  5. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  6. ruby - 分布式事务和队列,ruby,erlang,scala - 2

    我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和

  7. ruby-on-rails - 如何在 Gem 中获取 Rails 应用程序的根目录 - 2

    是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在

  8. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  9. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  10. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

随机推荐