从内部自用到对外服务,配置管理的演进和设计优化实践

本文整理自阿里巴巴中间件技术专家彦林在中国开源年会上的分享,通过此文,您将了解到:

  • 微服务给配置管理所带来的变化
  • 配置管理演进过程中的设计思考
  • 配置管理开源后的新探索
  • 配置中心控制台设计实践

“为什么相对于传统的软件开发模式,微服务要强调配置中心,是出于什么样的诉求需要我们专门设计一个配置中心?厘清了这些问题,我们就知道如何去设计配置中心,并获得一个比较好的用户体验,和一个生产可用的结果。”

微服务给配置管理所带来的变化

在单机的情况下,我们把配置放在代码里边,发布的时候直接重启,非常轻量,但在微服务的情况下,出现了两个新的场景:

第一个是出现了多台设备,之前改一台设备就 OK 了,但是现在需要改多个设备,业务量大的时候,可能要改几十甚至几百台设备。显然,通过手动来完成这些设备的配置是不切实际的。所以说微服务之后,产生了一个新的难题,设备的配置变更管理难了。

第二个是微服务之后,出现了路由规则。并且,服务A找服务B的过程中,路由规则、重试策略和熔断机制,都是动态变化的。例如,我们发现下游依赖的一个服务不可用了,需要把它降级,这样对整个业务的资损影响才是最小的。通过更改一个配置,就可以实时地推到业务的进程里边,让它立马生效,进行降级。这就是我们微服务架构下要做配置中心的另一大原因。

配置管理演进过程中的设计思考

面对微服务架构下对配置中心的新诉求,我们该如何去满足呢?

我们的解法就是针对分散的管理模式,设计一个集中的管控平台,即配置中心。当有配置变更的时候,就可以在配置中心上来实现。配置管理的策略就是集中管控和动态推送,以解决分散的问题。其中,动态推送是微服务里边配置管理的核心,改一个配置时,确保每台机器可以收到配置更新,并实时生效。

除此之外,我们还做了一个发布管控。就是在变更之前,找线上的一台机器,先把变更发布下去,如果没有问题再去全网推。同时,对于已发布的配置变更可以一键逆操作,就是相当于给了一次吃后悔药的机会,因为很可能,我们推错的时候,忘了更改前的参数,那么可以通过一键逆操作来缩短恢复时间,在机制上降低了配置管理的风险。

随后,在我们做配置中心的云化产品的过程中,也就是从服务集团内部客户走向服务外部企业用户的时候,我们遇到了新的挑战。

服务集团内部用户的时候,我们会搭几套物理集群。但是产品云化后,为每一个云计算的用户去搭一个环境,成本就太高了。于是我们设计了一套集群去支撑云上的用户,及其多个使用环境,例如日常测试环境、预发环境和生产环境。

其次,为了进一步降低用户的使用成本,我们提供了一个逻辑隔离的能力。这和 K8S 的体系是一样的,就是在整个配置体系下面,新增一个命名空间或是租户。在启动的过程中动态传一些参数进去,然后把所有的配置隔离在不同的命名空间之下,这样大家就相互不影响了。我们看到的都是一个key ,但实际上是在前面动态的添加了一个逻辑参数,即命名空间。

此外,在某一个环境里边,如果某个用户或者一个环境里边的一个租户变更配置很频繁,或者是把权限搞错了,这个影响会是全局的。之前,我们的一个专有云用户遇到了一个问题,就是写了大量的配置变更数据,几百万条,最后把数据库写爆了。因此,为了避免因为某个租户更改配置影响到全局的事情发生,我们设计了流量管控和容量管控。即一个用户默认最多创建100条或者200条数据,上限由管理员来设置。进一步的,我们把这个管控封装成一个接口作为云产品的一个特性。

以上就是整个配置中心设计的演进过程,伴随着我们对配置中心的理解和用户的需求而来,从配置管理到集中管控,到配置发布前的自动校验,到发布管控,再到流量和容量管控。

配置管理演进过程中的设计思考

当我们对配置中心进行开源(开源项目名称:Nacos)的时候,有了新的思考。

项目开源初期,在宣讲的时候我们会强调Nacos的性能,例如经受了双11的流量考验,支持每天上亿次的配置推送,但在开源过程中和一些开发者沟通下来,大家其实并不会太考虑开源产品的性能,因为大部分开发者所处的企业,其流量规模根本没有那么大,大家更关心的是产品的易用性,开发者用爽了,才会谈性能的问题、安全的问题和容量的问题。

所以,我们在之后的产品设计策略上做了些调整。就是只要用户能看的到地方,就会用心去设计,等满足了简单易用,满足了中小企业对配置中心的需求后,再去强调Nacos的性能。

简单易用分为两个维度,一个是各类基础设计,包括模型和接口等,另一个是控制台的使用体验设计。

先看下我们在接口设计方面的模型。

这张图展示的是一个最简单的配置模型,一个配置文件里边填 value 。按大家最正常的理解来说,一个DataId ,一个 Content (一个key和一个 value 就可以了),为什么还出现了Namespace、 Group这些设置呢。原因是,做了微服务之后,大家的配置集中管控了。集中管控遇到的第一个问题就是,当多个应用去做拆分的时候,会有一个隔离的需求。

比如一个应用 A 的开发,和一个应用 B的开发,希望他们两个的配置是相互隔离的,通过各自的应用,能很快的实现相应的配置变更。所以我们在一个 key-value 的基础上又加了一个 Group ,这个Group 就是一个逻辑分组的概念,一般我们推荐填写它的应用名称或者模块名称,便于大家把不同应用的配置分开,也方便后边进行权限管控。

那Namespace是干嘛的呢?如果是一家规模较小的企业,可能连测试环境也没有,这时候Namespace是没有任何意义的,我默认是你隐藏的,它是一个空串。如果说你是一家中型的或者更大一点的公司,有很多环境,测试、预发和生产等多个环境,线上还有一些梯度环境,这时候我们就可以通过一个 Namespace ,让你连到不同的环境上了,就是进入不同的逻辑区域。Namespace 是用在环境上的, Group 是应用,DataId 里边就是一个 key-value 。

这样一看,模型就很简单了。

第二个是在通信协议的选型上,有 gRPC ,HTTP和rsocket等,最终选择了HTTP。因为我们认为配置管理是一个非常通用的需求,不仅 Java 需要,包括淘系的 C语言、Note.JS 都有同样的需求,比如 Note.JS ,前端的一些动态文案,需要动态去更改。所以出于对多语言的兼容,我们选择了HTTP接口 。

第三个是SDK设计上的优化,对Java 而言,用户关心的是体验,例如Spring 的用户最关心的是本地开发的体验。我在刚才那个 property 文件里边写一个东西,通过 @value 注册进来,它拉的是本地的一个配置,解决了本地配置的一个易用性问题。即如果配置中心里边有,从配置中心里边选可配置的 key ,没有的话就用本地的,我们就是通过SDK无缝地去解决了这个问题。

以上是我们在基础设计做的一些设计和思考,接下来我们分享下在控制台体验上的设计。

配置中心控制台设计实践

  • 交互界面的颜色选定

我们把选择权交给了社区,通过设置一个issue话题和投票,我们最终采用了经典黑+蓝色点缀的方案。

  • 控制台的使用体验

我们增强了控制台的易用性,比如提供 Properties 或者 JSON 格式校验的方法来避免,增删改查过程中可能会出现的一些人为错误。

此外,在一个分布式系统中,我们是需要协作的。创建完配置,需要让大家知道创建者为何要创建这个配置,目的是什么。为了解决这个问题,我们给配置打了一些元信息。

举个例子,在阿里巴巴,我们把变更风险分为四级, P1, P2, P3和 P4,P1 是风险最高的。今天的这个demo基本没有风险,我就写个P4 。这个标签就是用来说明这个变更风险不大。但如果是 P1 或者P2 的配置,我就会去做一个管控,一旦有修改是需要创建者来审评的,以降低变更风险。

  • 性能体验

在历经了阿里N代程序员的开发,配置变更最终才沉淀出性能强、容量大和高可用体系完美结合的产品。当时,我们中间件最大的 leader 给我们提一个诉求,“快递三日达,配置推送一秒达”,就是一变更,一秒就能将配置变更推送到几十万台机器,这就是我们当时产品主要的迭代方向之一。那为什么,我们对配置变更的性能要求如此之高呢?

举个例子,上图左边的是机房a,右边的是机房b,其中user 1 和 user 2 是不同的用户 ID ,当尾号为0 的用户访问Region1,当尾号为 1 的用户访问Region2。但是突然我发现线上不知道谁做了变更,没查到原因,发生 Region2尾号为 1的所有用户访问全出现异常了。那是不是我要改变路由规则,让所有的用户,不管ID尾号是 0是 1 都去访问Region1 。要实现这个,就需要通过通过配置变更来实现。且实现的越快,对用户的感知影响就越小。这是Nacos在异地多活的动态路由的典型应用场景。

以上就是我分享的关于配置中心演进、演进过程中的思考以及我们在服务集团内部用户,上云后服务企业用户和开源后服务开发者的一些思考和探索。

 

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12 种主流编程语言输出“ Hello World ”,把我给难住了!

作为一名程序员,在初步学习编程想必都绕不开一个最为基础的入门级示例“Hello World”,那么,你真的了解各个语言“Hello World”的正确写法吗?在我们刚开始打开编程世界的时候,往往写的第一个程序都是简单的文本输出&a…

mysql 截取域名_sql 截取域名的问题

sql 截取域名的几种方法总结,需要的朋友可以参考一下最近由于对数据库的域名要排重,因为sql直接使用起来方便一些,就整理下A.截取从字符串左边开始N个字符代码如下:Declare S1 varchar(100)Select S1http://www.jb51.netSelect Left(S1,4)---…

优秀工程师必备的三大思维,你拥有哪些?

不同岗位、不同职责的技术人对工程师思维的深度要求是不一样的,但从多维度去思考却应是每个技术人都应该具备的素养。本文整理自阿里巴巴高级技术专家至简在团队内部的个人分享,希望通过对工程师思维的分析和解读,让大家能正确对待那些在现实…

看完这篇还不了解Nginx,那我就哭了!

戳蓝字“CSDN云计算”关注我们哦!作者 | 蔷薇Nina责编 | 阿秃想必大家一定听说过 Nginx,若没听说过它,那么一定听过它的"同行"Apache 吧!Nginx 的产生Nginx 同 Apache 一样都是一种 Web 服务器。基于 REST 架构风格&…

迁移学习NLP:BERT、ELMo等直观图解

2018年是自然语言处理的转折点,能捕捉潜在意义和关系的方式表达单词和句子的概念性理解正在迅速发展。此外,NLP社区已经出现了非常强大的组件,你可以在自己的模型和管道中自由下载和使用(它被称为NLP的ImageNet时刻)。…

python如何仿写文章_python,python3.x_求助,用python仿写以下代码,python,python3.x,java - phpStudy...

求助&#xff0c;用python仿写以下代码public static void main(String[] args) {Scanner scnew Scanner(System.in);int nsc.nextInt();int[] flagnew int[29];float[] anew float[29];for(int i0;ia[i](float)1.0/(float)(i2);}for(int j1;j<Math.pow(2, 29);j){int tempj…

开发函数计算的正确姿势 —— 爬虫

在 《函数计算本地运行与调试 - Fun Local 基本用法》 中&#xff0c;我们介绍了利用 Fun Local 本地运行、调试函数的方法。但如果仅仅这样简单的介绍&#xff0c;并不能展现 Fun Local 对函数计算开发的巨大效率的提升。 这一次&#xff0c;我们拿一个简单的场景来举例子——…

SonarQube 规则的挂起与激活

文章目录规则添加规则挂起规则添加 规则挂起

内存性能的正确解读

一台服务器&#xff0c;不管是物理机还是虚拟机&#xff0c;必不可少的就是内存&#xff0c;内存的性能又是如何来衡量呢。 1. 内存与缓存 现在比较新的CPU一般都有三级缓存&#xff0c;L1 Cache&#xff08;32KB-256KB&#xff09;&#xff0c;L2 Cache&#xff08;128KB-2M…

2019年技术盘点云数据库篇(一):UCloud专家谈云数据库:千锤百炼 云之重器

作者 | 刘丹 出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09; 公有云逐渐成为企业运行 IT 设施的新趋势&#xff0c;那么作为企业最核心的系统—数据库&#xff0c;数据上云也成为大数据时代的必然选择。对企业来说&#xff0c;数据可视为其命脉&#xff0…

wxpython富文本_去除富文本编辑器中的标签

public static String deRegularExpression(String content) {content deRegularScript(content); // 过滤script标签String regEx_style "/* String regEx_inStyle "style\"([^\";];?)\""; */String regEx_html "<[^>]>&quo…

专访阿里云专有云马劲,一个理性的理想主义者

“我的故事都是和团队技术相关的&#xff0c;自己还真没有什么引人入胜的故事。”当马劲被问到能不能多分享些个人经历故事时他笑着说&#xff0c;我们就干脆怀着好奇聊了聊他和阿里云专有云一路走来的故事。 马劲&#xff0c;花名隆猫&#xff0c;阿里云专有云事业部兼企业应用…

80后阿里P10,“关老板”如何带着MaxCompute一路升级?

我是个幸运的人。虽然幸运不能被复制&#xff0c;但是眼光和努力可以。 关涛/关老板&#xff0c;80后的阿里P10&#xff0c;阿里巴巴通用计算平台负责人&#xff0c;阿里巴巴计算平台研究员。12年职场人生&#xff0c;微软和阿里的选择。 关涛的花名取自谐音&#xff1a;观涛。…

【重磅快讯】T11 2019数据智能技术峰会举办,AI将成为行业颠覆者

当前数据的价值日益凸显&#xff0c;已成为重要的生产要素和社会财富。云计算、人工智能、5G等技术的蓬勃发展&#xff0c;带来了智能化时代算力的提升。以数据为“能源”、以技术为“引擎”&#xff0c;才能将数据转化为智能&#xff0c;产生突破局限、跨越发展的力量。11月25…

java内部类实现方式_Java内部类详解

一 内部类是什么Java类中不仅可以定义变量和方法&#xff0c;还可以定义类&#xff0c;这样定义在类内部的类就被称为内部类。根据定义的方式不同&#xff0c;内部类分为静态内部类&#xff0c;成员内部类&#xff0c;局部内部类&#xff0c;匿名内部类四种。Java为什么要引入内…

如何创建一个数据科学项目?

假如你想要开始一个新的数据科学项目&#xff0c;比如对数据集进行简单的分析&#xff0c;或者是一个复杂的项目。你应该如何组织你的项目流程&#xff1f;数据和代码要放在那里&#xff1f;应该使用什么工具&#xff1f;在对数据处理之前&#xff0c;需要考虑哪些方面&#xf…

Spring boot + mybatis + oracle代码生成器

在pom文件中加入依赖 <build><plugins><!--逆向工程--><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><configuration…

i 智慧 | IBM存储:全面贯彻新存储的“智慧之道”

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹责编 | 阿秃出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;随着移动互联网、信息技术等创新发展&#xff0c;数据量呈指数级爆发式增长并表现在多个方面&#xff0c;即规模扩张、结构多元化的数据新…

二十分钟教你如何将区块链应用与函数计算相结合

前言 本篇文章适合对区块链应用感兴趣或是想要通过函数计算服务进一步开发区块链应用的新人。本文将结合阿里云区块链服务、阿里云函数计算服务、阿里云日志服务 以及社区应用 Marbles&#xff0c;手把手教大家如何将阿里云区块链服务与阿里云函数计算服务相结合&#xff0c;并…