企业设计网站系统,网站建设怎么宣传,泉州企业建站模板,深圳市住房城乡建设局网站首页摘要#xff1a; 本文我们就如何使用阿里云ACM这样的配置管理产品在Spring Cloud中替代Spring Cloud Config帮助简化环境配置管理做一个简单的示例#xff0c;帮助你理解基于ACM来简化微服务环境配置管理的方案#xff0c;并会简单比较一下ACM与Spring Cloud Config方案的优…摘要 本文我们就如何使用阿里云ACM这样的配置管理产品在Spring Cloud中替代Spring Cloud Config帮助简化环境配置管理做一个简单的示例帮助你理解基于ACM来简化微服务环境配置管理的方案并会简单比较一下ACM与Spring Cloud Config方案的优劣。
点此查看原文http://click.aliyun.com/m/41595/
配置的环境属性
毫无疑问在系统持续交付的过程中系统最终运行环境的多样性及复杂性毫无疑问增加了我们在配置管理工作上的负担有时候甚至不夸张的说配置就是因环境而生.
这在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依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId
/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope
/dependencydependencygroupIdcom.zaxxer/groupIdartifactIdHikariCP/artifactIdversion2.7.6/version
/dependency
创建 MySQL(RDS) 数据库及用户
mysql create database db_example; -- Create the new database
mysql create user springuserlocalhost identified by ThePassword; -- Creates the user
mysql grant all on db_example.* to springuserlocalhost; -- 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;
import 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 {AutowiredMovieRepository movieRepository;RequestMapping(/list-movies)public ResponseBody IterableMovie listMovies() {return movieRepository.findAll();} }
在ACM中使用Namespace创建隔离的环境配置
注: 在阿里云上使用ACM的前提是开通了该项服务具体开通流程可以参考文档ACM 快速入门开通服务并登陆之后即可进入 ACM 控制台 创建命名空间及配置
在ACM中创建3个环境 (dev,stage,prod) 为 dev,stage,prod 不同环境分别创建配置
注意 我们完成了什么?
在上一步中我们为相同配置项针对不同环境的设置了不同的值例如 ‘spring.datasource.url’这个配置项我们通过设置不同的url来为各环境连接不同的数据库并且仅在生产环境开启SSL (useSSLtrue)dev:spring.datasource.urljdbc:mysql://localhost:3306/db_example?useSSLfalseprod:spring.datasource.urljdbc:mysql://30.5.101.169:3306/db_example?useSSLtrue同时我们也为生产环境(prod)设置了更大的数据库连接池和更小的连接超时时间dev:spring.datasource.hikari.connection-timeout60000spring.datasource.hikari.maximum-pool-size10prod:spring.datasource.hikari.connection-timeout15000spring.datasource.hikari.maximum-pool-size200而为了方便开发调试我们仅在开发环境打开了SQL Tracedev:spring.jpa.show-sqltrue
Movie Service与配置中心ACM集成 现在我们将集成Movie Service与ACM以便从ACM中获取对应环境的配置. 关于如何在Spring Cloud中使用ACM具体可以参考ACM官方文档 开发指南 SDK 参考 Spring Cloud ACM
为movie service引入ACM依赖dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-acm/artifactIdversion1.0.1/version/dependency
在application.properties配置ACM连接信息、namespace、accessKey、secretKey等信息
spring.application.namemovie-service
spring.application.groupcom.alibaba.cloud.acmalibaba.acm.endpointacm.aliyun.com
alibaba.acm.namespaceyour_namespace_id
alibaba.acm.accessKeyyour_ak
alibaba.acm.secretKeyyour_sk
注意: 你可以在ACM的’命名空间详情’或者’配置的示例代码’里找到你的namespace_idaccessKeysecretKey等信息如下图所示:在浏览器里访问Movie Service查看ACM配置推送刷新信息
如果在movie service引入了spring-boot-starter-actuator依赖并且在application.properties设置了management.security.enabledfalse,可以通过端点 http:///acm 看到应用的配置消费及刷新情况如下图:也可以在ACM控制台上查看配置的推送轨迹、配置版本等信息具体使用方法可参考ACM官方文档在此不再赘述。
ACM与Spring Cloud Config简单对比
扩展思考 - 为什么不把配置放到应用自身的jar包里 在我的博文《现代应用架构中的配置管理面临的挑战》 里有长篇幅的侧面论述。 如果测试、生产因为配置打出来的包不一样如何保证你的测试是有效的 关注微服务的开发者一定拜读过下面这本微服务圣经
在上书中的第6.7及6.8小节对于环境和配置有非常精彩的阐述这里将原文引用在此
6.8 服务配置
服务需要一些配置。理想情况下这些配置的工作量应该很小而且仅仅局限于环境间配置的差异。如果你的配置修改了很多服务的基本行为或者不同环境之间的配置差异很大那么你可能就只能在一套环境中发现某个特定的问题这是极其痛苦的事情。 所以如果存在不同环境之间的配置差异应该如何在部署流程中对其进行处理呢一种方法是对每个环境创建不同的构建物并把配置内建在该构建物中。刚开始看这种方法好像挺有道理。配置已经被内建了只需要简单的部署它应该就能够正常工作了对吧其实这是有问题的。还记得持续交付的概念吗我们想要创建一个构建物作为候选发布版本并使其沿着流水线向前移动最终确认它能够被发布到生产环境。想象一下我构建了一个Customer-Service-Test构建物和Customer-Service-Prod构建物。如果Customer-Service-Test构建物通过了测试但我真正要部署的构建物却是Customer-Service-Prod又要如何验证这个软件最终会真正运行在生产环境中呢 还有一些其他的挑战。首先创建这些构建物比较耗时。其次你需要在构建的时候知道存在哪些环境。你要如何处理敏感的配置数据我可不想把生产环境的数据库密码提交到源代码中但是如果在创建这些构建物时需要的话通常这也是难以避免的。 一个更好的方法是只创建一个构建物并将其配置单独管理。从形式上来说这针对的可能是每个环境一个属性文件或者是传入到安装过程中的一些参数。还有一个在应对大量微服务时比较流行的方法是使用专用系统来提供配置第11章会详细讨论这个话题。
配置漂移 当应用部署之后运行过程中尤其是部署在多台服务器上之后如果使用开发人员或者运维人员手工维护配置文件的方式日积月累之后会产生我们所谓的”配置飘移”问题即由于应用以及依赖的组件的版本变更带来的配置差异以及不同的团队或者人的多次不同时间点做的不同的修改会导致数据中心中每台机器上的相同的应用的配置在各台机器上或多或少都有细微的差别而这往往是bug和重大故障隐藏之所。
总结 在本文中我们以一个测试和生产连接不同的数据库配置不同的数据源(包括连接池)参数为例介绍了如何将阿里云配置中心ACM与Spring Cloud一起使用帮助你在微服务架构中简化你的环境配置管理。