摘要: 本文我们就如何使用阿里云ACM这样的配置管理产品在Spring Cloud中替代Spring Cloud Config帮助简化环境配置管理做一个简单的示例,帮助你理解基于ACM来简化微服务环境配置管理的方案,并会简单比较一下ACM与Spring Cloud Config方案的优劣。
- 配置的环境属性
毫无疑问,在系统持续交付的过程中,系统最终运行环境的多样性及复杂性毫无疑问增加了我们在配置管理工作上的负担,有时候,甚至不夸张的说,配置就是因环境而生。
这在Eugen Paraschiv的博文 Configuration Must Be Environment Specific里有简单的阐述,在我的博文《现代应用架构中的配置管理面临的挑战》 的容器化、调度与配置管理小节也有深入的阐述。
如果要问,是什么导致了我们应用的构建物(artifact)在各个环境不能保持一样,有时候Docker无法轻易达成“Build Once, Run Anywhere!"的承诺,其答案往往就是环境配置的差异,为帮助你理解,举一些简单的例子:
在开发环境中将logLevel设置为DEBUG,在预发环境logLevel设置为INFO,生产环境里logLevel设置为WARNING
在开发环境中使用4核8G的机器跑数据库,而在生产中用32核96G机器跑数据库
在日常环境执行线程池的最大线程数应该设置为15,而生产环境上这个值应该大一点,默认设为150
在线上环境中,中心机房,应用数据源需要连接A库,而深圳机房,应用应该就近连接使用B库
只有在小淘宝环境,双向同步开关才应该关闭
这次的改动有点大,新的特性仅在线上的杭州单元把该特性开放出来,其它的单元环境先不要开放出来
本文我们就如何使用阿里云ACM这样的配置管理产品在Spring Cloud中替代Spring Cloud Config帮助简化环境配置管理做一个简单的示例,帮助你理解基于ACM来简化微服务环境配置管理的方案,并会简单比较一下ACM与Spring Cloud Config方案的优劣。
- 场景故事
为了帮助理解需求和场景,在日常工程实践中,我们一般会用用户故事(User Story)的方式,预设一个简单的场景,以此来做阐释和交流,熟悉微服务历史的兄弟一定熟悉下面这张早期的布道图:
本文中我们就以Movie Service为例,假设我们需要从关系数据库MySQL(RDS)检索所有电影信息列表,但是在测试环境、预发和生产环境我们需要使用不同的数据库,因为只有生产库才需要顶配的机器。这样我们的应用需要在不同的环境配置不同的数据源配置、连接池配置、数据库安全配置等等,我们会介绍如何基于阿里云ACM的Namespace映射不同环境的能力,为movie service在不同运行环境设置不同的数据源配置。
如下图所示:
- 创建微服务 Movie Service
新建Spring Boot Starter 微服务应用 movie service
movie service的业务逻辑很简单,从MySQL(RDS)里列出所有的movie列表,如下简图所示:
这里我们创建了一个标准的jpa应用(类似Spring官网的样例工程 Accessing data with MySQL,我们的工程结构如下图所示:
引入JPA、MySQL、连接池HikariCP以及WEB依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.7.6</version>
</dependency>
创建 MySQL(RDS) 数据库及用户
mysql> create database db_example; -- Create the new database
mysql> create user 'springuser'@'localhost' identified by 'ThePassword'; -- Creates the user
mysql> grant all on db_example.* to 'springuser'@'localhost'; -- Gives all the privileges to the new user on the newly created database
具体可参考 Accessing data with MySQL 中的 'Create the database'小节
创建 WEB Controller
package com.alibaba.demo.microsvc.controller;
import org.springframework.beans.factory.annotation.Autowired;
org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.demo.microsvc.dao.MovieRepository;
import com.alibaba.demo.microsvc.model.Movie;
@RestController
public class MovieController {
@Autowired
MovieRepository movieRepository;
@RequestMapping("/list-movies")
public @ResponseBody Iterable<Movie> listMovies() {
return movieRepository.findAll();
}
}
</pre>
- 在ACM中使用Namespace创建隔离的环境配置
注: 在阿里云上使用ACM的前提是开通了该项服务,具体开通流程可以参考文档ACM 快速入门,开通服务并登陆之后,即可进入 ACM 控制台 创建命名空间及配置
在ACM中创建3个环境 (dev,stage,prod)
为 dev,stage,prod 不同环境分别创建配置
注意 我们完成了什么?
在上一步中,我们为相同配置项针对不同环境的设置了不同的值,例如 'spring.datasource.url'这个配置项,我们通过设置不同的url来为各环境连接不同的数据库,并且仅在生产环境开启SSL (useSSL=true)
dev:
spring.datasource.url=jdbc:mysql://localhost:3306/db_example?useSSL=false
>
prod:
spring.datasource.url=jdbc:mysql://30.5.101.169:3306/db_example?useSSL=true
>
同时,我们也为生产环境(prod)设置了更大的数据库连接池和更小的连接超时时间
dev:
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.maximum-pool-size=10
>
prod:
spring.datasource.hikari.connection-timeout=15000
spring.datasource.hikari.maximum-pool-size=200
>
而为了方便开发调试,我们仅在开发环境打开了SQL Trace
dev:
spring.jpa.show-sql=true
- Movie Service与配置中心ACM集成
现在我们将集成Movie Service与ACM以便从ACM中获取对应环境的配置. 关于如何在Spring Cloud中使用ACM,具体可以参考ACM官方文档 开发指南 > SDK 参考 > Spring Cloud ACM
为movie service引入ACM依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-acm</artifactId>
<version>1.0.1</version>
</dependency>
在application.properties配置ACM连接信息、namespace、accessKey、secretKey等信息
spring.application.name=movie-service
spring.application.group=com.alibaba.cloud.acm
alibaba.acm.endpoint=acm.aliyun.com
alibaba.acm.namespace=<your_namespace_id>
alibaba.acm.accessKey=<your_ak>
alibaba.acm.secretKey=<your_sk>
注意: 你可以在ACM的'命名空间详情'或者'配置的示例代码'里找到你的namespace_id,accessKey,secretKey等信息,如下图所示:
- 在浏览器里访问Movie Service
- 查看ACM配置推送刷新信息
如果在movie service引入了spring-boot-starter-actuator依赖并且在application.properties设置了management.security.enabled=false,可以通过端点 http://<>/acm 看到应用的配置消费及刷新情况,如下图:
也可以在ACM控制台上查看配置的推送轨迹、配置版本等信息,具体使用方法可参考ACM官方文档,在此不再赘述。
在我的博文《现代应用架构中的配置管理面临的挑战》 里有长篇幅的侧面论述。
如果测试、生产因为配置打出来的包不一样,如何保证你的测试是有效的?
关注微服务的开发者一定拜读过下面这本微服务圣经
在上书中的第6.7及6.8小节对于环境和配置有非常精彩的阐述,这里将原文引用在此
6.8 服务配置服务需要一些配置。理想情况下,这些配置的工作量应该很小,而且仅仅局限于环境间配置的差异。如果你的配置修改了很多服务的基本行为,或者不同环境之间的配置差异很大,那么你可能就只能在一套环境中发现某个特定的问题,这是极其痛苦的事情。
所以,如果存在不同环境之间的配置差异,应该如何在部署流程中对其进行处理呢?一种方法是对每个环境创建不同的构建物,并把配置内建在该构建物中。刚开始看这种方法好像挺有道理。配置已经被内建了,只需要简单的部署,它应该就能够正常工作了,对吧?其实这是有问题的。还记得持续交付的概念吗?我们想要创建一个构建物作为候选发布版本,并使其沿着流水线向前移动,最终确认它能够被发布到生产环境。想象一下,我构建了一个Customer-Service-Test构建物和Customer-Service-Prod构建物。如果Customer-Service-Test构建物通过了测试,但我真正要部署的构建物却是Customer-Service-Prod,又要如何验证这个软件最终会真正运行在生产环境中呢?
还有一些其他的挑战。首先,创建这些构建物比较耗时。其次,你需要在构建的时候知道存在哪些环境。你要如何处理敏感的配置数据?我可不想把生产环境的数据库密码提交到源代码中,但是如果在创建这些构建物时需要的话,通常这也是难以避免的。
一个更好的方法是只创建一个构建物,并将其配置单独管理。从形式上来说,这针对的可能是每个环境一个属性文件,或者是传入到安装过程中的一些参数。还有一个在应对大量微服务时比较流行的方法是,使用专用系统来提供配置,第11章会详细讨论这个话题。
配置漂移
当应用部署之后运行过程中,尤其是部署在多台服务器上之后,如果使用开发人员或者运维人员手工维护配置文件的方式,日积月累之后,会产生我们所谓的"配置飘移"问题,即由于应用以及依赖的组件的版本变更带来的配置差异,以及不同的团队或者人的多次不同时间点做的不同的修改会导致数据中心中每台机器上的相同的应用的配置在各台机器上或多或少都有细微的差别,而这往往是bug和重大故障隐藏之所。
- 总结
在本文中,我们以一个测试和生产连接不同的数据库,配置不同的数据源(包括连接池)参数为例,介绍了如何将阿里云配置中心ACM与Spring Cloud一起使用,帮助你在微服务架构中简化你的环境配置管理。
相关推荐
此外,还有阿里云的商业化组件,如 ACM(应用配置管理)用于分布式环境中的配置管理,OSS(对象存储服务)提供云存储服务,SchedulerX 是分布式任务调度产品,支持定时任务执行。 在实际开发中,Spring Cloud 可以...
1. **SpringCloud**:SpringCloud是基于Spring Boot的一套微服务解决方案,提供包括服务发现、配置中心、负载均衡、熔断机制等服务。在本项目中,SpringCloud可能被用于实现服务注册与发现、API网关、服务间调用、...
阿里云ACM和独立部署均受支持。 支持的Python: Python 2.6 Python 2.7 Python 3.3 Python 3.4 的Python 3.5 Python 3.6 Python 3.7 支持的ACM版本 ACM 1.0 变更记录 安装 对于Python 2.7及更高版本: pip ...
8. **应用配置管理(ACM)**:ACM提供集中式的配置管理和推送服务,实现配置的动态更新和版本控制。 9. **任务调度服务(SchedulerX)**:SchedulerX支持多语言任务,提供精确的定时触发、任务依赖和容灾机制,可...
在介绍天融信新ACM集中管理平台的配置手册内容时,我们可以从以下几个方面来展开,包括平台概览、配置步骤、管理功能、监控机制、系统维护以及网络工具等方面的知识点。 首先,天融信新ACM集中管理平台是一个旨在对...
【深信服企业级云 aCMP 用户手册】是深信服科技股份有限公司针对其aCMP 6.0.15版本的云管理平台所编写的一份详细指南,旨在帮助用户理解和操作这一云管平台。手册涵盖了从基础概念到高级功能的全方位介绍,适合网络...
aCloud_19 aCMP产品配置及维护.pdf
6. Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。 7. Alibaba Cloud OSS:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低...
6. **ACM (Application Configuration Management)**:应用配置管理服务,使得配置的管理和分发变得更加简单和安全,支持动态更新,提高运维效率。 7. **DRDS (Distributed Relational Database Service)**:分布式...
在ACM(国际大学生程序设计竞赛)中,参赛团队需要具备高效的编程技能和对环境的熟练配置能力。本文将详细阐述ACM比赛环境的配置,包括操作系统的选择、编程语言的安装与配置、编译器的选取以及集成开发环境(IDE)...
ACM(Application Configuration Management,应用配置管理)是阿里云产品之一,前身为阿里中间件配置中心工具Diamond。ACM 的主要功能是对应用配置进行集中管理和推送,旨在解决分布式系统的配置管理问题。 ACM 的...
通过版本管理、配置存储、控制台、动态推送、多环境管理和强一致性发布控制等特性,ACM极大地简化了配置管理工作,增强了配置管理的服务能力。 在安全性方面,ACM提供了强大的保障。4月12日,ACM发布了“加密配置”...
在本项目中,我们主要探讨的是如何利用Java和Spring框架来实现ACM国际大学生程序设计竞赛中的“数字三角形”问题。ACM竞赛是全球知名的编程竞赛,旨在培养学生的算法设计和编程能力。数字三角形问题通常涉及到动态...
【基于ACM自主云管理的AIOPs解决方案】 在当今数字化转型的时代,企业正在寻求更加高效、智能化的IT运维管理方式。ACM(Autonomous Cloud Management)和AIOPS(Artificial Intelligence for IT Operations)的结合...
在使用航芯的ACM32固件库时,开发者需要了解这些驱动的详细功能和使用方法,并结合STM32 HAL库的使用经验,进行必要的代码调整。同时,由于不同MCU的硬件特性差异,即使API类似,也可能需要针对航芯MCU的特性进行...
在Linux环境下,ACM资源包的使用对于学习和参与编程竞赛、提升算法能力有着重要作用。 在"Linux操作系统acm资源包"中,主要包含了一个名为"acm-server"的压缩子文件。这个文件可能是ACM相关的服务器模拟环境、练习...