摘要: 本文我们就如何使用阿里云ACM这样的配置管理产品在Spring Cloud中替代Spring Cloud Config帮助简化环境配置管理做一个简单的示例,帮助你理解基于ACM来简化微服务环境配置管理的方案,并会简单比较一下ACM与Spring Cloud Config方案的优劣。

  1. 配置的环境属性

毫无疑问,在系统持续交付的过程中,系统最终运行环境的多样性及复杂性毫无疑问增加了我们在配置管理工作上的负担,有时候,甚至不夸张的说,配置就是因环境而生。

这在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方案的优劣。

  1. 场景故事

为了帮助理解需求和场景,在日常工程实践中,我们一般会用用户故事(User Story)的方式,预设一个简单的场景,以此来做阐释和交流,熟悉微服务历史的兄弟一定熟悉下面这张早期的布道图:

本文中我们就以Movie Service为例,假设我们需要从关系数据库MySQL(RDS)检索所有电影信息列表,但是在测试环境、预发和生产环境我们需要使用不同的数据库,因为只有生产库才需要顶配的机器。这样我们的应用需要在不同的环境配置不同的数据源配置、连接池配置、数据库安全配置等等,我们会介绍如何基于阿里云ACM的Namespace映射不同环境的能力,为movie service在不同运行环境设置不同的数据源配置。

如下图所示:

  1. 创建微服务 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>
  1. 在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=60000spring.datasource.hikari.maximum-pool-size=10
>        prod:spring.datasource.hikari.connection-timeout=15000spring.datasource.hikari.maximum-pool-size=200
>

而为了方便开发调试,我们仅在开发环境打开了SQL Trace

dev:

spring.jpa.show-sql=true
  1. 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.acmalibaba.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等信息,如下图所示:

  1. 在浏览器里访问Movie Service

  1. 查看ACM配置推送刷新信息

如果在movie service引入了spring-boot-starter-actuator依赖并且在application.properties设置了management.security.enabled=false,可以通过端点 http://&lt;>/acm 看到应用的配置消费及刷新情况,如下图:

也可以在ACM控制台上查看配置的推送轨迹、配置版本等信息,具体使用方法可参考ACM官方文档,在此不再赘述。

在我的博文《现代应用架构中的配置管理面临的挑战》 里有长篇幅的侧面论述。
如果测试、生产因为配置打出来的包不一样,如何保证你的测试是有效的?

关注微服务的开发者一定拜读过下面这本微服务圣经

在上书中的第6.7及6.8小节对于环境和配置有非常精彩的阐述,这里将原文引用在此

6.8 服务配置

服务需要一些配置。理想情况下,这些配置的工作量应该很小,而且仅仅局限于环境间配置的差异。如果你的配置修改了很多服务的基本行为,或者不同环境之间的配置差异很大,那么你可能就只能在一套环境中发现某个特定的问题,这是极其痛苦的事情。
所以,如果存在不同环境之间的配置差异,应该如何在部署流程中对其进行处理呢?一种方法是对每个环境创建不同的构建物,并把配置内建在该构建物中。刚开始看这种方法好像挺有道理。配置已经被内建了,只需要简单的部署,它应该就能够正常工作了,对吧?其实这是有问题的。还记得持续交付的概念吗?我们想要创建一个构建物作为候选发布版本,并使其沿着流水线向前移动,最终确认它能够被发布到生产环境。想象一下,我构建了一个Customer-Service-Test构建物和Customer-Service-Prod构建物。如果Customer-Service-Test构建物通过了测试,但我真正要部署的构建物却是Customer-Service-Prod,又要如何验证这个软件最终会真正运行在生产环境中呢?
还有一些其他的挑战。首先,创建这些构建物比较耗时。其次,你需要在构建的时候知道存在哪些环境。你要如何处理敏感的配置数据?我可不想把生产环境的数据库密码提交到源代码中,但是如果在创建这些构建物时需要的话,通常这也是难以避免的。
一个更好的方法是只创建一个构建物,并将其配置单独管理。从形式上来说,这针对的可能是每个环境一个属性文件,或者是传入到安装过程中的一些参数。还有一个在应对大量微服务时比较流行的方法是,使用专用系统来提供配置,第11章会详细讨论这个话题。
配置漂移
当应用部署之后运行过程中,尤其是部署在多台服务器上之后,如果使用开发人员或者运维人员手工维护配置文件的方式,日积月累之后,会产生我们所谓的"配置飘移"问题,即由于应用以及依赖的组件的版本变更带来的配置差异,以及不同的团队或者人的多次不同时间点做的不同的修改会导致数据中心中每台机器上的相同的应用的配置在各台机器上或多或少都有细微的差别,而这往往是bug和重大故障隐藏之所。

  1. 总结

在本文中,我们以一个测试和生产连接不同的数据库,配置不同的数据源(包括连接池)参数为例,介绍了如何将阿里云配置中心ACM与Spring Cloud一起使用,帮助你在微服务架构中简化你的环境配置管理。

原文链接:http://click.aliyun.com/m/100...

使用阿里云ACM简化你的Spring Cloud微服务环境配置管理相关推荐

  1. 使用阿里云ACM简化你的Spring Cloud微服务环境配置管理 1

    摘要: 本文我们就如何使用阿里云ACM这样的配置管理产品在Spring Cloud中替代Spring Cloud Config帮助简化环境配置管理做一个简单的示例,帮助你理解基于ACM来简化微服务环境 ...

  2. 如何用ACM简化你的Spring Cloud微服务环境配置管理

    摘要: 本文我们就如何使用阿里云ACM这样的配置管理产品在Spring Cloud中替代Spring Cloud Config帮助简化环境配置管理做一个简单的示例,帮助你理解基于ACM来简化微服务环境 ...

  3. spring cloud微服务分布式云架构 - Spring Cloud简介

    Spring Cloud是一系列框架的有序集合.利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现.注册.配置中心.消息总线.负载均衡.断路器.数据监控等(这里只简单的列了 ...

  4. spring cloud微服务分布式云架构 - Spring Cloud简介(一)

    点击上面 免费订阅本账号! 本文作者:it菲菲 原文:https://yq.aliyun.com/articles/672239? 点击阅读全文前往 Spring Cloud是一系列框架的有序集合.利 ...

  5. (二)spring cloud微服务分布式云架构 - 整合企业架构的技术点

    spring cloud本身提供的组件就很多,但我们需要按照企业的业务模式来定制企业所需要的通用架构,那我们现在需要考虑使用哪些技术呢? 下面我针对于spring cloud微服务分布式云架构做了以下 ...

  6. spring cloud微服务分布式云架构 - Spring Cloud集成项目简介

    Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的.在学习Spring Clo ...

  7. spring cloud微服务分布式云架构 - 整合企业架构的技术点

    spring cloud本身提供的组件就很多,但我们需要按照企业的业务模式来定制企业所需要的通用架构,那我们现在需要考虑使用哪些技术呢? 下面我针对于spring cloud微服务分布式云架构做了以下 ...

  8. (二)spring cloud微服务分布式云架构-整合企业架构的技术点

    spring cloud本身提供的组件就很多,但我们需要按照企业的业务模式来定制企业所需要的通用架构,那我们现在需要考虑使用哪些技术呢?Spring Cloud大型企业分布式微服务云架构源码请加一七九 ...

  9. Spring Cloud微服务分布式云架构—集成项目简介

    Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的.在学习Spring Clo ...

最新文章

  1. 订阅者java_RxJava:“java.lang.IllegalStateException:只允许一个订阅者!”
  2. BlendMode颜色混合模式枚举值
  3. Android之 AndroidManifest.xml 文件解析
  4. nodejs-文件系统
  5. ML---Simple Linear Regression
  6. java 本地发送邮件_java在本地发送邮件可以,在服务器发送报错
  7. 使用回溯法解决编辑距离问题(C语言)
  8. dp 扔鸡蛋_使用动态编程(DP)的鸡蛋掉落问题
  9. Asp.net 自定义config文件读取
  10. win7下import pytorch报错AttributeError: function 'AddDllDirectory' not found
  11. JS:ES10新特性
  12. linux python命令无反应_几个无(有)聊(趣)的Linux命令
  13. Unity 5.6 UGUI 按钮被遮挡
  14. ETL数据清洗的案例
  15. php字符串函数(2)替换、分割、填充、去除
  16. MySQL sql语句中变量应用
  17. UA MATH524 复变函数 验证一个函数是否为调和函数
  18. 热电阻温度计 电阻温度探测器 直接浸入式清洁传感器 精密RTD 美国Burns 胶囊式铂电阻温度检测器 迷你RTD整体热电偶套管 气温传感器 测温传感器 温度传感器 温度传感器生产厂家 温度变送器
  19. 计算机更改锁屏密码忘记了怎么办,win10锁屏密码忘记了怎么办_w10忘记锁屏密码的处理步骤...
  20. 解决屏保时间过短的问题(电脑息屏过快)

热门文章

  1. MySQl笔记8:把good表中商品名为‘诺基亚xxxx‘的商品,改为‘HTCxxxx‘
  2. python四十七:在子类中调用父类方法
  3. 开发vue底部导航栏组件
  4. 【跃迁之路】【545天】程序员高效学习方法论探索系列(实验阶段302-2018.08.04)...
  5. 第九课 特殊权限set_uid、stick_bit,软链接,硬链接
  6. 面向对象先导课程——PART3
  7. Linux---系统日志
  8. Hibernate Session的Flush模式
  9. 利用钥匙串,在应用里保存用户密码的方法
  10. 加密移动硬盘解决方案