先回顾一下,在之前的Spring Cloud Config的介绍中,我们还留了一个悬念:如何实现对配置信息的实时更新。虽然,我们已经能够通过/refresh
接口和Git仓库的Web
Hook来实现Git仓库中的内容修改触发应用程序的属性更新。但是,若所有触发操作均需要我们手工去维护Web Hook中的应用位置的话,这随着系统的不断扩张,会变的越来越难以维护,而消息代理中间件是解决该问题最为合适的方案。是否还记得我们在介绍消息代理中的特点时有提到过这样一个功能:消息代理中间件可以将消息路由到一个或多个目的地。利用这个功能,我们就能完美的解决该问题,下面我们来说说Spring Cloud Bus中的具体实现方案。
在《Spring
Boot中使用RabbitMQ》一文中,我们已经介绍了关于消息代理、AMQP协议以及RabbitMQ的基础知识和使用方法。下面我们开始具体介绍Spring Cloud Bus的配置,并以一个Spring Cloud Bus与Spring Cloud Config结合的例子来实现配置内容的实时更新。
RabbitMQ实现
下面我们来具体动手尝试整个配置过程:
-
准备工作:这里我们不做新的应用,但需要用到上一章中,我们已经实现的关于Spring Cloud Config的几个工程,若读者对其还不了解,建议先阅读第4章的内容。
-
config-repo:定义在Git仓库中的一个目录,其中存储了应用名为didispace的多环境配置文件,配置文件中有一个from参数。
-
config-server-eureka:配置了Git仓库,并注册到了Eureka的服务端。
-
config-client-eureka:通过Eureka发现Config Server的客户端,应用名为didispace,用来访问配置服务器以获取配置信息。该应用中提供了一个
/from
接口,它会获取config-repo/didispace-dev.properties
中的from属性返回。
-
扩展config-client-eureka应用
-
修改
pom.xml
增加spring-cloud-starter-bus-amqp
模块(注意spring-boot-starter-actuator
模块也是必须的)。
1 2 3 4
|
<dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
|
-
在配置文件中增加关于RabbitMQ的连接和用户信息
1 2 3 4
|
spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=springcloud spring.rabbitmq.password=123456
|
-
启动config-server-eureka,再启动两个config-client-eureka(分别在不同的端口上,比如7002、7003),我们可以在config-client-eureka中的控制台中看到如下内容,在启动时候,客户端程序多了一个
/bus/refresh
请求。
1
|
o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/bus/refresh],methods=[POST]}" onto public void org.springframework.cloud.bus.endpoint.RefreshBusEndpoint.refresh(java.lang.String)
|
-
先访问两个config-client-eureka的
/from
请求,会返回当前config-repo/didispace-dev.properties
中的from属性。
-
接着,我们修改
config-repo/didispace-dev.properties
中的from属性值,并发送POST请求到其中的一个/bus/refresh
。
-
最后,我们再分别访问启动的两个config-client-eureka的
/from
请求,此时这两个请求都会返回最新的config-repo/didispace-dev.properties
中的from属性。
到这里,我们已经能够通过Spring Cloud Bus来实时更新总线上的属性配置了。
原理分析
我们通过使用Spring Cloud Bus与Spring Cloud Config的整合,并以RabbitMQ作为消息代理,实现了应用配置的动态更新。
整个方案的架构如上图所示,其中包含了Git仓库、Config Server、以及微服务“Service A”的三个实例,这三个实例中都引入了Spring Cloud Bus,所以他们都连接到了RabbitMQ的消息总线上。
当我们将系统启动起来之后,“Service A”的三个实例会请求Config Server以获取配置信息,Config Server根据应用配置的规则从Git仓库中获取配置信息并返回。
此时,若我们需要修改“Service A”的属性。首先,通过Git管理工具去仓库中修改对应的属性值,但是这个修改并不会触发“Service A”实例的属性更新。我们向“Service A”的实例3发送POST请求,访问/bus/refresh
接口。此时,“Service
A”的实例3就会将刷新请求发送到消息总线中,该消息事件会被“Service A”的实例1和实例2从总线中获取到,并重新从Config Server中获取他们的配置信息,从而实现配置信息的动态更新。
而从Git仓库中配置的修改到发起/bus/refresh
的POST请求这一步可以通过Git仓库的Web
Hook来自动触发。由于所有连接到消息总线上的应用都会接受到更新请求,所以在Web Hook中就不需要维护所有节点内容来进行更新,从而解决了通过Web Hook来逐个进行刷新的问题。
指定刷新范围
上面的例子中,我们通过向服务实例请求Spring Cloud Bus的/bus/refresh
接口,从而触发总线上其他服务实例的/refresh
。但是有些特殊场景下(比如:灰度发布),我们希望可以刷新微服务中某个具体实例的配置。
Spring Cloud Bus对这种场景也有很好的支持:/bus/refresh
接口还提供了destination
参数,用来定位具体要刷新的应用程序。比如,我们可以请求/bus/refresh?destination=customers:9000
,此时总线上的各应用实例会根据destination
属性的值来判断是否为自己的实例名,若符合才进行配置刷新,若不符合就忽略该消息。
destination
参数除了可以定位具体的实例之外,还可以用来定位具体的服务。定位服务的原理是通过使用Spring的PathMatecher(路径匹配)来实现,比如:/bus/refresh?destination=customers:**
,该请求会触发customers
服务的所有实例进行刷新。
架构优化
既然Spring Cloud Bus的/bus/refresh
接口提供了针对服务和实例进行配置更新的参数,那么我们的架构也相应的可以做出一些调整。在之前的架构中,服务的配置更新需要通过向具体服务中的某个实例发送请求,再触发对整个服务集群的配置更新。虽然能实现功能,但是这样的结果是,我们指定的应用实例就会不同于集群中的其他应用实例,这样会增加集群内部的复杂度,不利于将来的运维工作,比如:我们需要对服务实例进行迁移,那么我们不得不修改Web
Hook中的配置等。所以我们要尽可能的让服务集群中的各个节点是对等的。
因此,我们将之前的架构做了一些调整,如下图所示:
我们主要做了这些改动:
-
在Config Server中也引入Spring Cloud Bus,将配置服务端也加入到消息总线中来。
-
/bus/refresh
请求不在发送到具体服务实例上,而是发送给Config
Server,并通过destination
参数来指定需要更新配置的服务或实例。
通过上面的改动,我们的服务实例就不需要再承担触发配置更新的职责。同时,对于Git的触发等配置都只需要针对Config Server即可,从而简化了集群上的一些维护工作。
本文完整示例:
分享到:
相关推荐
它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复...
本资料旨在提供最全面的Spring Cloud构建微服务架构的知识,帮助开发者深入理解和实践这一强大的框架。 1. **Spring Boot基础** 在开始Spring Cloud之前,了解Spring Boot的基本概念和使用是必要的。Spring Boot...
标题提到的"目前倾力于平台架构的升级,原计划使用springboot+springcloud构建微服务架构",这表明了一个正在或即将进行的项目升级,其核心是将原有的单体架构转变为微服务架构,以提高系统的可扩展性、灵活性和可靠...
使用Spring Cloud构建微服务 Spring Cloud是一个相对比较新的微服务框架,2016年才推出...使用Spring Cloud构建微服务可以快速的构建复杂的分布式系统,并且提供了多种组件和工具来帮助开发者快速的构建微服务架构。
通过以上介绍,我们可以看出Spring Cloud为构建微服务架构提供了丰富的工具和组件,它简化了开发过程,同时也带来了复杂性的挑战。开发者需要理解每个组件的工作原理,并根据实际需求进行选型和配置,以实现高效、...
Spring Cloud的目标是让开发者能够快速地开发出分布式系统的一些通用模式(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性和广播式消息传播、可用性模式、集中化日志记录处理),而无需理解...
根据提供的标题、描述以及部分内容,我们可以总结出关于“Spring Cloud快速构建微服务应用”的一系列重要知识点。接下来将详细解析这些内容。 ### Spring Cloud快速构建微服务应用 #### 一、Spring Cloud简介 ...
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...
这个项目将会展示如何在实际场景中使用 Spring Cloud 构建微服务架构,包括服务注册、服务发现、客户端负载均衡、API 网关等功能的实现。通过对这些组件的深入学习和实践,开发者可以更好地理解和掌握 Spring Cloud ...
Spring Cloud 是一套微服务解决方案,它为开发者提供了在分布式系统(配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)中快速构建一些常见模式的...
- **系统架构**:采用SpringCloud构建微服务架构,每个模块都独立部署,通过API网关实现服务间调用。 - **数据库设计**:根据不同的功能模块设计相应的数据库表结构,例如用户表、招聘表等。 - **接口设计**:定义...
Spring Cloud是一个基于Spring Boot实现的云应用开发工具集合,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...
《深入理解Spring Cloud与微服务构建》是一本专注于讲解如何使用Spring Cloud构建高效、可靠的微服务系统的书籍。Spring Cloud作为目前最流行的微服务框架之一,它提供了大量的工具和服务,帮助开发者快速搭建分布式...
Spring Boot和Spring Cloud是现代Java开发中的两大核心框架,它们为构建微服务架构提供了强大的支持。Spring Boot简化了Spring应用程序的开发过程,通过内置的Web服务器、自动配置和丰富的起步依赖,使得开发者能够...
### Spring Cloud实战指南:构建微服务架构的配置、教程与源代码分析 #### 一、Spring Cloud概述 Spring Cloud是一个全面且系统的框架集合,它基于Spring Boot开发,为分布式系统提供了一系列工具,使得开发者可以...
11. **Spring Boot**:Spring Boot是构建微服务的基础,它简化了Spring应用的初始搭建以及开发过程,提供了一种快速、生产就绪的微服务开发方式。 12. Maven项目结构:这个压缩包中的项目都是基于Maven构建的,...
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具包,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...
本章将深入探讨Spring Cloud的各个关键组件,以及如何利用它们来构建微服务架构。 1. **Eureka**:Eureka是Spring Cloud中的服务注册与发现组件,它允许服务提供者向注册中心注册自己的服务,同时服务消费者可以从...