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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
MSE Nacos 企业版免费试用,1600元额度,限量50份
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 本文我们就如何使用阿里云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)的方式,预设一个简单的场景,以此来做阐释和交流,熟悉微服务历史的兄弟一定熟悉下面这张早期的布道图:

acm_pic5_config_service

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

如下图所示:

创建微服务 Movie Service

  • 新建Spring Boot Starter 微服务应用 movie service

    movie service的业务逻辑很简单,从MySQL(RDS)里列出所有的movie列表,如下简图所示:

    spring_micro_movie_sample_3

    这里我们创建了一个标准的jpa应用(类似Spring官网的样例工程 Accessing data with MySQL,我们的工程结构如下图所示:

spring_micro_movie_sample_1

  • 引入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>
    
    AI 代码解读
  • 创建 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
    
    AI 代码解读

    具体可参考 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 {
         
    
              @Autowired
              MovieRepository movieRepository;
    
              @RequestMapping("/list-movies")
              public @ResponseBody Iterable<Movie> listMovies() {
         
                    return movieRepository.findAll();
              }    
    
         }
    
    AI 代码解读

在ACM中使用Namespace创建隔离的环境配置

注: 在阿里云上使用ACM的前提是开通了该项服务,具体开通流程可以参考文档ACM 快速入门,开通服务并登陆之后,即可进入 ACM 控制台 创建命名空间及配置

  • 在ACM中创建3个环境 (dev,stage,prod)

spring_micro_movie_sample_4

  • 为 dev,stage,prod 不同环境分别创建配置

spring_micro_movie_sample_5

注意 我们完成了什么?

在上一步中,我们为相同配置项针对不同环境的设置了不同的值,例如 '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
AI 代码解读

同时,我们也为生产环境(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
AI 代码解读

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

    dev:
        spring.jpa.show-sql=true
AI 代码解读

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>
    
    AI 代码解读
  • 在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>
    
    AI 代码解读

注意: 你可以在ACM的'命名空间详情'或者'配置的示例代码'里找到你的namespace_id,accessKey,secretKey等信息,如下图所示:

spring_micro_movie_sample_6

在浏览器里访问Movie Service

spring_micro_movie_sample_7

查看ACM配置推送刷新信息

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

spring_micro_movie_sample_8

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

ACM与Spring Cloud Config简单对比

对比项 Spring Cloud Config 阿里云ACM
Spring Cloud 无缝集成 支持 支持
源码分发方式 开源 即将开源
收费模式 免费 免费
大规模(超10万配置)生产验证 无公开的大规模生产验证案例 阿里巴巴数据中心生产环境超百万级配置,每天超亿级配置变更推送,双11等严苛场景验证
配置管控UI控制台 无控制台,依赖IDE,GIT等三方工具 专业的配置管理UI控制台
多语言支持 主要支持java生态,无其它语言的原生客户端 支持nodejs,c++等原生多语言客户端
多机房、同城双活、异地多活、多可用区等架构 依赖GIT,ZooKeeper等能力支持,官方无明确说明 支持
配置变更推送 依赖RabbitMQ/KAFKA 内置的推送机制,无外部依赖
大规模推送时效 依赖GIT Web Hook等SLA,WEB HOOK在企业级大规模生产能力待验证 工业级、毫秒级
配置变更审计能力 内置的审计机制(审计能力符合国家安全等保三级标准)
推送轨迹 无法查看配置推送到客户端的实时监测 有配置变更推送轨迹帮助监控配置变更推送状况
数据隔离 application,profile,label,git repo等隔离策略 除Spring Cloud提供的隔离级别,还提供多租户,app,data_id,group等多级隔离策略
生产运维成本 高(必须对GIT/RabbitMQ等有足够的知识储备和人才储备) 低(无三方组件依赖)
高可用 N/A(客户自己兜底) 99.99%(阿里云兜底)
安全通信 支持SSL 支持SSL
容灾 2级(存储,server缓存) 3级,多了客户端本地容灾能力

扩展思考 - 为什么不把配置放到应用自身的jar包里?

  • 在我的博文《现代应用架构中的配置管理面临的挑战》 里有长篇幅的侧面论述。

  • 如果测试、生产因为配置打出来的包不一样,如何保证你的测试是有效的?

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

    微服务设计

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

    6.8 服务配置

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

  • 配置漂移

    当应用部署之后运行过程中,尤其是部署在多台服务器上之后,如果使用开发人员或者运维人员手工维护配置文件的方式,日积月累之后,会产生我们所谓的"配置飘移"问题,即由于应用以及依赖的组件的版本变更带来的配置差异,以及不同的团队或者人的多次不同时间点做的不同的修改会导致数据中心中每台机器上的相同的应用的配置在各台机器上或多或少都有细微的差别,而这往往是bug和重大故障隐藏之所。

总结

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

工程下载

本文的样例工程可以从movie-service.tar.gz下载

该工程我们在以下版本环境测试通过:

  • Spring Cloud Edgware.RELEASE
  • Spring Boot 1.5.9.RELEASE
  • HikariCP 2.7.6
  • MySQL 5.7.11
  • ACM 4.2.0
  • ACM Spring Cloud SDK 1.0.1

在你本地运行该工程前,请注意在application.properties里面设置你自己的ACM accessKey和secretKey.

关联阅读

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
13442
分享
相关文章
|
4月前
|
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
155 0
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
154 0
飞算 JavaAI:革新电商订单系统 Spring Boot 微服务开发
在电商订单系统开发中,传统方式耗时约30天,需应对复杂代码、调试与测试。飞算JavaAI作为一款AI代码生成工具,专注于简化Spring Boot微服务开发。它能根据业务需求自动生成RESTful API、数据库交互及事务管理代码,将开发时间缩短至1小时,效率提升80%。通过减少样板代码编写,提供规范且准确的代码,飞算JavaAI显著降低了开发成本,为软件开发带来革新动力。
|
1月前
|
JPA简介:Spring Boot环境下的实践指南
上述内容仅是JPA在Spring Boot环境下使用的冰山一角,实际的实践中你会发现更深更广的应用。总而言之,只要掌握了JPA的规则,你就可以借助Spring Boot无比丰富的功能,娴熟地驾驶这台高性能的跑车,在属于你的程序世界里驰骋。
82 15
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
111 0
基于 Spring Cloud 的微服务架构分析
Spring Cloud 是一个基于 Spring Boot 的微服务框架,提供全套分布式系统解决方案。它整合了 Netflix、Zookeeper 等成熟技术,通过简化配置和开发流程,支持服务发现(Eureka)、负载均衡(Ribbon)、断路器(Hystrix)、API网关(Zuul)、配置管理(Config)等功能。此外,Spring Cloud 还兼容 Nacos、Consul、Etcd 等注册中心,满足不同场景需求。其核心组件如 Feign 和 Stream,进一步增强了服务调用与消息处理能力,为开发者提供了一站式微服务开发工具包。
144 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
本教程介绍ActiveMQ的安装与基本使用。首先从官网下载apache-activemq-5.15.3版本,解压后即可完成安装,非常便捷。启动时进入解压目录下的bin文件夹,根据系统选择win32或win64,运行activemq.bat启动服务。通过浏览器访问`http://127.0.0.1:8161/admin/`可进入管理界面,默认用户名密码为admin/admin。ActiveMQ支持两种消息模式:点对点(Queue)和发布/订阅(Topic)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
109 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
139 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ集成
本文介绍了在 Spring Boot 中集成 ActiveMQ 的详细步骤。首先通过引入 `spring-boot-starter-activemq` 依赖并配置 `application.yml` 文件实现基本设置。接着,创建 Queue 和 Topic 消息类型,分别使用 `ActiveMQQueue` 和 `ActiveMQTopic` 类完成配置。随后,利用 `JmsMessagingTemplate` 实现消息发送功能,并通过 Controller 和监听器实现点对点消息的生产和消费。最后,通过浏览器访问测试接口验证消息传递的成功性。
127 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问