结合实际场景谈一谈微服务配置

作为 Nacos 5W1H 的系列文章,本文将围绕“Where”,讲述 Nacos 配置管理的三个典型的应用场景:

  • 数据库连接信息
  • 限流阈值和降级开关
  • 流量的动态调度

上一篇:Nacos帮我解决了什么问题?

数据库连接信息

曾经有朋友跟我聊过一个问题,“业务飞速发展,团队越来越大,人员流动也相对频繁起来,怎么才能更好的保证数据的安全性,不被泄露呢?”。他提到这样一个场景,公司创立初期,服务后端的代码都是他一行一行码出来的,当时只有他一个人,后端与数据库的连接配置信息也就直接放置在项目的配置文件中。他使用的是 Spring Boot 框架,配置信息就是存放在 application.properties 中,使用 Spring 的 profile 属性保证不同环境连接不同的数据库。如下所示:

生产环境:application-prod.properties

spring.datasource.url=生产环境的数据库连接地址
spring.datasource.username=生产环境的数据库用户账号
spring.datasource.password=生产环境的数据库用户密码

开发环境:application-dev.properties

spring.datasource.url=开发环境的数据库连接地址
spring.datasource.username=开发环境的数据库用户账号
spring.datasource.password=开发环境的数据库用户密码

测试、预发环境也是类似。这种将数据库连接信息直接放置在配置文件中,跟着项目代码一起通过 Git 管理,的确是有蛮大的数据泄露的风险。试想,一个新来不久的小伙伴,他一当要投入研发工作,有 Git Pull 代码的权限之后,代表他可能就拥有了直接操作线上数据库的权限了。当时的我给他建议可以通过以下几个方面去降低数据风险:

  • 将数据库连接信息等敏感配置从项目中剥离;
  • 数据库增加 IP 白名单连接限制;
  • 最小权限原则:每个账号只配置所必需的权限,避免删表删库等高危操作;
  • 定期修改数据库账号、密码。

回想起来,我当时给的建议并没有完全解决他的问题,甚至还带来了其他一些问题。例如,上述的第一点,“将敏感配置从项目剥离”,剥离出来的敏感配置存放到哪里?怎么管理这些配置呢?也许,你会想到,存放到应用部署机器的环境变量或某个文件中。不,一样有风险,说不定哪天开发同学必须得登录上机器排查问题,就有泄露的风险,总之,得尽可能地做到在整个开发流程都不会有任何泄露的风险。应用中可能不只是连接一个数据源,分库分表的情况,不同数据存储(如 MySQL / Redis / Elasticsearch 等)的情况,还有,其他更多敏感配置项,配置数据的增多会给管理带来不便。

另外,“定期修改数据库账号、密码”,修改后我能怎么方便快捷的下发到所有应用程序中呢?既然是敏感配置,其变更也会带来不少的风险,我需要能先到小量的几台机器验证,保证对业务无影响,我再全部下发到其他所有的机器上去,是否还得有“灰度发布”的功能呢?账号密码修改下发后,应用出现异常,影响到业务了,我要怎么快速地回滚呢?是否还得有“版本控制”、“快速回滚”的功能呢?不是所有的开发同学都有权限能修改敏感配置信息,是否还需要有“权限管控”的功能?对敏感配置的任何操作都应该被记录,是否还需要有“变更审计”的功能呢?

现在,我有了更好的建议:使用 Nacos 配置管理模块,将敏感配置信息都存放到 Nacos 中。Nacos 配置管理,其中一个立身之本就是为敏感配置保驾护航。它提供上述场景所需的功能,通过命名空间区分不同环境(开发、测试、预发、生产),通过“版本控制”保证变更可追溯,通过“快速回滚”保证错误变更时影响最小,通过的“灰度发布”功能保障配置安全平稳地变更,还有更多更全面功能(权限管控、变更审计等)即将支持。

那么,怎么将敏感配置项目的配置文件中迁移到 Nacos 中呢?下面以 Spring Boot 连接 MySQL 为例:

添加依赖

<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${latest.version}</version>

注意 Spring Boot 1.x 使用 nacos-config-spring-boot-starter 0.1.x 版本,Spring Boot 2.x 使用 nacos-config-spring-boot-starter 0.2.x 版本。

在 application.properties 中添加 Nacos 连接配置

nacos.config.server-addr=127.0.0.1:8848

这里是简单的示例,在实际生产中,还需配置 Nacos 命名空间信息(区分环境)、鉴权信息(如 AccessKey、SecretKey 等,即将支持的权限访问控制)。而 Nacos 配置模块对应的阿里云产品 ACM,借助于 ECS 实例 RAM 角色,最终能到达连 AccessKey、SecretKey 都不需要填写的目的。

添加 @NacosPropertySource 注解

@SpringBootApplication
@NacosPropertySource(dataId = "mysql.properties")
public class SpringBootMySQLApplication {public static void main(String[] args) {SpringApplication.run(Application.class, args);
}

在本地启动的 Nacos 控制台上新增 dataId 为 mysql.properties 的配置,配置内容为 MySQL 连接配置信息:

通过这四个简单的步骤,就将 MySQL 连接信息从原来的 application.properties 迁移到 Nacos 的,让 Nacos 将敏感配置管控起来,大大降低数据泄露的风险。同时,Nacos 配置管理提供的“统一管控”、“版本控制”、“快速回滚”等强大的功能也为其运维管理带来极大的便利。

限流阈值和降级开关

限流、降级,众所周知,是在开发高并发系统过程中需要考虑的两大关键点,是运行时保护系统的两大利器。限流阈值和降级开关,最终是抽象为一个个的配置项,要想实现运行时的动态调整阈值和开关的启停,将这些配置项存放到 Nacos 的配置模块中最适合不过了。

在今年 8 月的时候,阿里巴巴开源了 Sentinel,以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。在阿里巴巴内部,Nacos 跟 Sentinel 就是多年携手相伴,砥砺前行的好机油,为双 11 等各种大促立下了功劳,也为剁手党提供了良好的购物体验。

下面就以 Sentinel 流控为例,演示如果通过 Nacos 来做到运行时的动态控制流量:

  1. 添加依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>${latest.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-extension</artifactId>
<version>${latest.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>${latest.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${latest.version}</version>

2.模拟并发请求

final class RunTask implements Runnable {
@Override
public void run() {while (!stop) {Entry entry = null;try {entry = SphU.entry(resourceName);// token acquired, means passpass.addAndGet(1);} catch (BlockException e1) {block.incrementAndGet();} catch (Exception e2) {// biz exception} finally {total.incrementAndGet();if (entry != null) {entry.exit();}}Random random2 = new Random();try {TimeUnit.MILLISECONDS.sleep(random2.nextInt(50));} catch (InterruptedException e) {// ignore}}
}

3.配置 Nacos 连接信息与 dataId 等,并将其设置为 Sentinel 的数据源

public class NacosDynamicFlowDemo {private static final String KEY = "TestResource";public static void main(String[] args) {final String remoteAddress = "localhost";final String groupId = "DEFAULT_GROUP";final String dataId = "com.alibaba.nacos.demo.flow.rule";ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(remoteAddress, groupId, dataId,source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));FlowRuleManager.register2Property(flowRuleDataSource.getProperty());// Assume we config: resource is `TestResource`, initial QPS threshold is 5.FlowQpsRunner runner = new FlowQpsRunner(KEY, 1, 10000);runner.simulateTraffic();runner.tick();
}

4.在本地启动的 Nacos 控制台中新建 dataId 为 com.alibaba.nacos.demo.flow.rule 的流控配置

5.运行 NacosDynamicFlowDemo,你会看到如下标准输出信息

再到 Nacos 控制台修改刚刚新建的流控配置,将限流阈值 count 的值修改为 1.0,完整的标准输出信息如下

以上示例演示了如何通过 Nacos + Sentinel 实现动态流量控制的能力,核心就是用到了 Nacos 配置模块“动态推送”的能力。原理是 sentinel-datasource-nacos 集成了 nacos-client ,其与 nacos-server 维持着连接,当用户在 Nacos 控制台进行配置变更时,nacos-server 会快速地将该配置的最新内容推送到 nacos-client 中,Sentinel 一拿到最新的流控配置,就转换了流控策略,如示例将流控阈值调整为 1.0,限制为更少的流量进入系统的业务处理流程。

流量的动态调度

业务发展壮大到一定的规模,单一的集群已经承载不了全部的用户请求,需要将用户的流量分流到不同的集群上。当然,更进一步的方案是:不同的集群位于不同的区域,这样,除了缓解业务处理的压力,也给系统带来容灾的能力。

比如,某电商系统有 1 亿用户量,将系统的流量按照用户的 ID 进行切分,ID 为 1-1000W 的用户请求分发到区域 A 的集群 a 上,ID 为 10001W-2000W 的用户请求流量分发到区域 B 的集群 b 上,以此类推,最终将所有用户的请求流量打散到 10 个不同区域的集群上,同时,每个集群冗余了一些系统资源。当区域 A 的机房发生不可抗的灾难(如地震)时,我们需要有动态调度流量的能力,最好能秒级得将流量从区域 A 调度到另外可用的区域的集群上。

这正是 Nacos 配置管理大有作为的地方,将用户 ID 的分片和对应的路由规则存放在 Nacos 的中,配合统一接入层等的组件,就能将流量打散到各个集群上,进而让系统能承载更大的流量,以更好的支撑业务的发展。另外,将其存放与 Nacos 中,也就具备了配置“动态化”的能力,一旦某区域出现基础设施无法及时恢复的问题时,只需在 Nacos 的控制台上修改 ID 分片的路由规则,就能将有问题的区域流量快速切换到其他可用的区域上,保障对业务几乎无损。Nacos 在阿里内部能做到秒级推送到十万级别机器上的推送效率。

总结

除了以上三个场景,其实还有更多更大胆的应用场景,如“大数据实时计算算法调整”、“异地容灾多活”、“应用业务场景动态推送”等等,可以参看 Nacos 的阿里云产品 ACM 的使用场景 。Nacos 配置管理模块,将敏感配置收拢管控起来,极大降低数据泄露等风险,并且提供如“动态推送”、“版本控制”、“快速回滚”等功能,保障了敏感配置的变更安全平稳的执行。

在限流与降级的场景,通过一个示例,为大家演示了如何通过 Nacos + Sentinel 实现流量的动态控制,这也是 Nacos 配置管理的一个十分典型的应用场景。降级也一样,大促高峰期间将某个非关键的系统组件进行关闭,在过了高峰期后再开启,这个也是可以通过 Nacos 的“动态推送”的功能来实现。

总之,只要系统涉及到了“敏感的配置”、“动态的配置”,都应该考虑将配置放入到 Nacos 中,让 Nacos 管控起来。

 

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

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

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

相关文章

哈工大人工智能研究院院长刘劼:AIoT 核心在“智”不在“联”,需云边端协同...

受访者 | 刘劼采访者 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;物联网是继计算机、互联网和移动通信之后的又一次信息产业的革命性发展。近几年来&#xff0c;物联网发展迅速&#xff1a;据研究机构IDC公司预测&#xff0c;到2020年&#xff0c;物联…

RabbitMQ 管控台配置导入导出和重要性

背景&#xff1a;rabbitmq100个节点&#xff0c;做迁移&#xff0c;现在linux6环境&#xff0c;想升级到linux7版本&#xff0c;然后把rabbitmq部署到linux7版本上 怎么去做呢&#xff1f; 不可能把rabbitmq重新构建好&#xff0c;再把对应的交换机、绑定、配置重新设置一遍&am…

使用Spring整合Quartz轻松完成定时任务

文章目录1. 必不可少jar包依赖2. 编写任务调度类013. 编写任务调度类024. quartz配置文件5. 测试service6. 效果图开发环境版本jdk1.8Maven3.6.1springSpring 4.2.6.RELEASEIdea2019 1. 必不可少jar包依赖 <dependency><groupId>org.springframework</groupId&g…

太真实了:程序员等级图鉴

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 肥又君责编&#xff5c;阿秃程序员是一个非常神奇的工种&#xff0c;他们对技术有特殊的崇拜&#xff0c;有着严格的等级划分&#xff0c;不同级别的程序员有什么不同之处呢&#xff1f;Let us 瞅瞅 &#xff5e;日常工作日常…

windows故障转移群集和mysql_Windows 2016 无域故障转移群集部署方法 超详细图文教程...

故障转移群集是一个很实用的功能,而windows在2016版本开始,终于支持不用域做故障转移群集.在群集中,我们可以设定一个"群集IP"而客户端只需要根据这个"群集IP"就能连接当前群集的主服务器.而不必关心群集服务器之间的替换.而更棒的是,它是"去中心&quo…

Dubbo下一站:Apache顶级项目

近日&#xff0c;在Apache Dubbo开发者沙龙杭州站的活动中&#xff0c;阿里巴巴中间件技术专家曹胜利(展图)向开发者们分享了Dubbo2.7版本的规划。 本文将为你探秘 Dubbo 2.7背后的思考和实现方式。 Dubbo 2.7 将围绕 异步支持优化、元数据改造&#xff0c;引入JDK8的特性、Net…

Java 中判断连接Oracle数据库连接成功

import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Application {public static Connection getConnection() {Connection conn null;try { //连接driver为&#xff1a;oracle.jdbc.driver.OracleDriver//或者oracle…

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

本文整理自阿里巴巴中间件技术专家彦林在中国开源年会上的分享&#xff0c;通过此文&#xff0c;您将了解到&#xff1a; 微服务给配置管理所带来的变化配置管理演进过程中的设计思考配置管理开源后的新探索配置中心控制台设计实践“为什么相对于传统的软件开发模式&#xff0…

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

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

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

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

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

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

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

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

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

在 《函数计算本地运行与调试 - 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…

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

“我的故事都是和团队技术相关的&#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…