英语好的可以看官方文档:Spring Cloud Config
SpringCloud-config必须用git或者svn来获取配置并不友好,但是基本能满足绝大部分场景。
讲解Zookeeper的时候其实实现过分布式的配置中心,springcloudconfig的核心作用其实就是在于对配置进行管理
虽然springcloud使用springboot进行开发,节省了大量的配置文件,但每个服务依然有自己的application.yml配置文件,而且每个服务一般都有负载均衡,所以,这么依赖对于配置文件的统一管理就非常有必要了。
上图是springcloudconfig总体结构图。
左边这一块我们很熟悉,最开始有个eureka,它通过配置文件application.yml启动,在这个配置文件里面会指定端口,实例名,注册地址等
对于服务提供商来说,它也需要把相关信息写到application.yml文件中,比如数据库配置,端口,项目名称等,其中最重要的就就是要指定eureka的具体位置
这是前面反复说过的,但现在是基于cloudConfig的配置中心,最开始启动eureka的时候,eureka的具体配置就不是写死在eureka的application.yml文件中了,这个时候也会有application.yml(bootstrap.yml)配置文件,只是这里的配置指定的时候config的配置中心,在eureka启动的时候读取【配置中心】的配置,并启动
对于服务提供商也是同样的道理,以产品服务为例,它的application.yml文件也不在指定具体的配置,真实需要访问的数据库,端口等信息也是在启动的时候直接从【配置中心】读取。
所以说config配置中心在其中占据非常重要的位置,但config里面的配置从哪来呢?其实是从git服务器里面来的,开发者需要把相关的配置上传到git服务器,这里的git服务器可以自己搭建,也可以直接用github,后面项目为了方便就直接使用github了。
1.1. 准备github账号
https://github.com/ 注册就不说了
获得git的地址
输入用户名密码:把新建的仓库信息下载倒本地
这在里我放倒了f盘的config目录中。
1.2. 配置中心搭建
有了git服务器之后,接下来就要准备配置中心了
【microcloud-config】 新建一个配置中心的服务提供模块,pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>enjoy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>microcloud-config</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>enjoy</groupId>
<artifactId>microcloud-security</artifactId>
</dependency>
</dependencies>
</project>
引入springcloudserver的同时,这分布式配置中心也不是谁都能访问的,所以增加了安全验证模块。
应该还记得这时候的用户名密码为:admin/enjoy
【microcloud-config】 新增application.yml配置文件,增加git连接配置信息
server:
port: 7101
spring:
application:
name: microcloud-config
cloud:
config:
server:
git:
uri: https://github.com/enjoyeud/microconfig.git
【microcloud-config】 新增启动类
package cn.enjoy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class ConfigApp {
public static void main(String[] args) {
SpringApplication.run(ConfigApp.class,args);
}
}
这些工作准备完成后,为了测试【microcloud-config】是能正确运行的,还需要上传个配置文件到github
【GITHUB】 上传一个application.yml
spring:
profiles:
active:
- dev
---
spring:
profiles: dev
application:
name: microconfig-test-dev
---
spring:
profiles: default
application:
name: microconfig-test-default
准备好配置文件后启动【microcloud-config】
访问形式访问路径
1/{application}-{profile}.ym
lhttp://localhost:7101/application-dev.yml
http://localhost:7101/application-default.yml
http://localhost:7101/application-beta.yml
2/{application}/{profile}[/{label}]
http://localhost:7101/application/dev/master
http://localhost:7101/application/default/master
3/{label}/{application}-{profile}.yml
http://localhost:7101/master/application-default.yml
http://localhost:7101/master/application-dev.yml
1.3. 简单的客户端
现在已经成功的搭建好了配置中心,但这个时候如果只通过url的访问形式其实没什么太多的意义,最终还是需要把github相关信息加载到客户端上进行访问
新增加一个【microcloud-config-client】模块,这模块讲读取github里面的信息,也不做其他的事情,只是显示一下。
新建【microcloud-config-client】,pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>enjoy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>microcloud-config-client</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
【github】上传一个新的配置文件microcloud-config-client.yml,后面就通过程序来读取这个配置
spring:
profiles:
active:
- dev
---
server:
port: 8201
spring:
profiles: dev
application:
name: microconfig-test-client
eureka:
client:
service-url:
defaultZone: http://admin:enjoy@localhost:7001/eureka
---
server:
port: 8102
spring:
profiles: beta
application:
name: microconfig-test-client
eureka:
client:
service-url:
defaultZone: http://admin:enjoy@localhost:7001/eureka
【microcloud-config-client】新建bootstrap.yml文件,这文件读取配置中心的配置
spring:
cloud:
config:
name: microcloud-config-client # 定义要读取的资源文件的名称
profile: dev # 定义profile的 名称
label: master # 定义配置文件所在的分支
uri: http://localhost:7101 # SpringCloudConfig的服务地址
username: admin # 连接的用户名
password: enjoy # 连接的密码
可能有些人奇怪,为什么不直接把相关信息写道application.yml文件之中,其实这是一种规范
l“application.yml”:对应的是用户级的资源配置项;
l“bootstrap.yml”:对应的是系统级的资源配置,其优先级更高
【microcloud-config-client】新建application.yml文件,这文件只是简单的配置一个应用名称
spring:
application:
name: microcloud-config-client # 编写应用的名称
【microcloud-config-client】新建一个controller,这个controller显示从服务器下载到的配置文件
package cn.enjoy.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigClientController {
@Value("${spring.application.name}")
private String applicationName;
@Value("${eureka.client.serviceUrl.defaultZone}")
private String eurekaServers;
@RequestMapping("/config")
public String getConfig() {
return "ApplicationName = " + this.applicationName + "、EurekaServers = "
+ this.eurekaServers;
}
}
【microcloud-config-client】 新建一个启动类
package cn.enjoy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConfigClientApp {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApp.class,args);
}
}
启动配置中心,访问,确认配置通过url是能正常访问的。
http://localhost:7101/microcloud-config-client-beta.yml
启动【microcloud-config-client】发现tomcat启动了,占用的端口就是dev的8201,访问
这个时候简单的客户端已经搭建完成。
1.4. Eureka与服务提供商读取配置
有了上面这些基础,接下来就可以完成这个图的功能了,这里依然简化一下,只考虑product产品服务与eureka
eureka与product服务的配置信息要求去配置中心获取,所以在正式部署项目之前,先准备两个配置,上传到github之中
microcloud-config-eureka-client.yml,这个是eureka的配置文件,这里就没有考虑eureka的高可用了
spring:
profiles:
active:
- dev
---
server:
port: 7001
eureka:
server:
eviction-interval-timer-in-ms: 1000 #设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)
enable-self-preservation: false #设置为false表示关闭保护模式
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://admin:enjoy@localhost:7001/eureka
instance: # eureak实例定义
hostname: localhost # 定义 Eureka 实例所在的主机名称
spring:
profiles: dev
security:
user:
name: admin
password: enjoy
application:
name: microcloud-config-eureka-client
---
server:
port: 7002
eureka:
server:
eviction-interval-timer-in-ms: 1000 #设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)
enable-self-preservation: false #设置为false表示关闭保护模式
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://admin:enjoy@localhost:7002/eureka
instance: # eureak实例定义
hostname: localhost # 定义 Eureka 实例所在的主机名称
spring:
profiles: beta
security:
user:
name: admin
password: enjoy
application:
name: microcloud-config-eureka-client
microcloud-config-product-client.yml,这个事对于产品服务这个服务提供商提供者的配置文件
spring:
profiles:
active:
- dev
---
server:
port: 8080
mybatis:
mapper-locations: # 所有的mapper映射文件
- classpath:mapping/*.xml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型
driver-class-name: com.mysql.jdbc.Driver # 配置MySQL的驱动程序类
url: jdbc:mysql://localhost:3306/springcloud?serverTimezone=GMT%2B8 # 数据库连接地址
username: root # 数据库用户名
password: root1234% # 数据库连接密码
application:
name: microcloud-config-product-client
profiles: dev
logging:
level:
cn.enjoy.mapper: debug
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://admin:enjoy@localhost:7001/eureka
instance:
instance-id: microcloud-config-product-client
prefer-ip-address: true
lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
info:
app.name: microcloud-provider-product
company.name: enjoy
build.artifactId: $project.artifactId$
build.modelVersion: $project.modelVersion$
management:
endpoints:
web:
exposure:
include: '*'
---
server:
port: 8081
mybatis:
mapper-locations: # 所有的mapper映射文件
- classpath:mapping/*.xml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型
driver-class-name: com.mysql.jdbc.Driver # 配置MySQL的驱动程序类
url: jdbc:mysql://localhost:3306/springcloud?serverTimezone=GMT%2B8 # 数据库连接地址
username: root # 数据库用户名
password: root1234% # 数据库连接密码
application:
name: microcloud-config-product-client
profiles: beta
logging:
level:
cn.enjoy.mapper: debug
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://admin:enjoy@localhost:7002/eureka
instance:
instance-id: microcloud-config-product-client
prefer-ip-address: true
lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
info:
app.name: microcloud-config-product-client
company.name: enjoy
build.artifactId: $project.artifactId$
build.modelVersion: $project.modelVersion$
management:
endpoints:
web:
exposure:
include: '*'
有了这两个配置文件,接下来就可以搭建eureka服务和product服务了
1.4.1. eureka配置
复制【microcloud-eureka】一份,修改成为【microcloud-config-eureka-client】,
【microcloud-config-eureka-client】 修改pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>enjoy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>microcloud-config-eureka-client</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
</project>
【microcloud-config-eureka-client】创建bootstrap.yml文件,读取配置中心eureka的配置
spring:
cloud:
config:
uri: http://localhost:7101
name: microcloud-config-eureka-client
profile: beta
label: master
username: admin
password: enjoy
【microcloud-config-eureka-client】 修改application.yml,删除不需要的配置
spring:
application:
name: microcloud-config-eureka-client
由于使用的是beta,它里面指定的eureka的端口是7002
重启后访问:localhost:7002
1.4.2. product服务配置
复制【microcloud-provider-product】项目为【microcloud-config-product-client】
【microcloud-config-product-client】pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>enjoy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<version>1.0.0</version>
<artifactId>microcloud-config-product-client</artifactId>
<dependencies>
<dependency>
<groupId>enjoy</groupId>
<artifactId>microcloud-api</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-security</artifactId>-->
<!--</dependency>-->
<dependency>
<groupId>enjoy</groupId>
<artifactId>microcloud-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
</project>
【microcloud-config-product-client】新增bootstrap.yml 文件,配置如下
spring:
cloud:
config:
uri: http://localhost:7101
name: microcloud-config-product-client
profile: beta
label: master
username: admin
password: enjoy
【microcloud-config-product-client】 修改application.yml文件
spring:
application:
name: microcloud-config-product-client
启动product服务,访问eureka,现在产品服务已经添加上去了。
1.5. Config配置中心高可用
现在不管是erueka还是服务提供者都是基于SpringCloudConfig获取配置文件的,这个时候配置中心就至关重要了,但在真实的项目环境中,难免SpringCloudConfig会出现各种问题,这个时候就需要考虑config的高可用机制了。
其实解决方式也很简单,把SpringCloudConfig注册到Eureka就搞定了,这个时候用户访问的时候不是直接从配置中心获取配置,而是通过eureka中获取配置中心的地址,再从配置中心获取具体服务的参数就行。
复制【microcloud-eureka】一份,修改成为【microcloud-ha-config-eureka】,这个eureka不注册具体的业务服务,只是负责config配置中心的负载均衡使用
【microcloud-ha-config-eureka】pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>enjoy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>microcloud-ha-config-eureka</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
</project>
【microcloud-ha-config-eureka】 修改application.yml文件
server:
port: 7301
eureka:
server:
eviction-interval-timer-in-ms: 1000 #设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)
enable-self-preservation: false #设置为false表示关闭保护模式
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://admin:enjoy@localhost:7301/eureka
instance: # eureak实例定义
hostname: localhost # 定义 Eureka 实例所在的主机名称
spring:
security:
user:
name: admin
password: enjoy
application:
name: microcloud-ha-config-eureka
启动类如下
package cn.enjoy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class HaConfigEurekaApp {
public static void main(String[] args) {
SpringApplication.run(HaConfigEurekaApp.class,args);
}
}
【microcloud-config】再复制两份,总共3个配置中心,分别为【microcloud-config2】【microcloud-config3】
【microcloud-config】【microcloud-config2】【microcloud-config3】 修改pom文件
增加eureka的支持
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
【microcloud-config】【microcloud-config2】【microcloud-config3】修改application.yml文件,增加eureka的注册地址
server:
port: 7101
spring:
application:
name: microcloud-config
cloud:
config:
server:
git:
uri: https://github.com/enjoyeud/microconfig.git
eureka:
client:
service-url:
defaultZone: http://admin:enjoy@localhost:7301/eureka
instance:
prefer-ip-address: true # 在地址栏上使用IP地址进行显示
instance-id: microcloud-config1
启动eureka并启动三个配置中心后
【microcloud-config-client】 修改pom文件,增加eureka的支持
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>enjoy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>microcloud-config-client</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
【microcloud-config-client】 修改bootstrap.yml文件,增加eureka相关配置
spring:
cloud:
config:
name: microcloud-config-client # 定义要读取的资源文件的名称
profile: dev # 定义profile的 名称
label: master # 定义配置文件所在的分支
#uri: http://localhost:7101 # SpringCloudConfig的服务地址
username: admin # 连接的用户名
password: enjoy # 连接的密码
discovery:
enabled: true # 通过配置中心加载配置文件
service-id: MICROCLOUD-CONFIG # 在eureka之中注册的服务ID
eureka:
client:
service-url:
defaultZone: http://admin:enjoy@localhost:7301/eureka
访问:http://localhost:8201/config
1.6. 自动刷新
在整个SpringCloudConfig设计之中,我们已经实现了配置的统一管理,但其实还有一个问题,就是自动刷新。
尝试修改一下【github】 microcloud-config-client.yml文件
spring:
profiles:
active:
- dev
---
server:
port: 8201
spring:
profiles: dev
application:
name: microconfig-test-client2
eureka:
client:
service-url:
defaultZone: http://admin:enjoy@localhost:7001/eureka
---
server:
port: 8102
spring:
profiles: beta
application:
name: microconfig-test-client2
eureka:
client:
service-url:
defaultZone: http://admin:enjoy@localhost:7001/eureka
这里的修改非常简单,只是修改了下应用名称,提交后
访问:http://localhost:8201/config
发现配置并没有修改,一直要重启【microcloud-config-client】后才会发现配置已经修改成功,其实这对大多数应用没有什么问题,如果你定时要关注这个小问题也是有办法处理的,在springcloud里面可以借助消息总线SpringCloudBus解决这问题。
ESB(企业服务总线)在一开始讲springcloud的时候就讲过,在springcloud中就是使用springcloudbus解决这问题的
基于总线的设计其实是借鉴了硬件的思想,编写的一个程序都需要用到CPU,内存,硬盘等资源,每一个硬件资源的接口都不同,所以需要借助驱动程序,这个驱动程序就类似于设计模式里面的适配器模式。通过这种设计,举例来说,在程序运行中可能需要用到CPU的资源,但由于不同的CPU通过驱动程序已经对硬件完全兼容了。
虽然这样一来CPU,内存,硬盘对系统是可以识别了,但这些硬件资源一般都不是由程序自己去访问,而是由系统的内核来处理,由操作系统来统一调度各种硬件资源。
这其实就是消息总线的一种体现,操作系统就是这个总线,在架构中,消息中线是一个中枢系统。
springcloudbus是基于SpringCloudStream的,SpringCloudStream的作用其实也是一种适配器模式的体现,消息中间件由很多,比如activemq,rabbitmq ,kafka,不同的消息中间件都会由使用上的差异,而SpringCloudStream就是为了屏蔽各种消息中间件的差异而存在的,具体的SpringCloudStream我们后面会单独拿来说
再来看个图
与之前的架构不一样的地方在于增加了消息总线,消息总线连接了config配置中心和各个配置中心的消费方,当配置提交到github的时候,可以借助/bus/refresh刷新,config配置中心再将变更的消息通知到其他的客户端
【github】 修改配置microcloud-config-client.yml
spring:
profiles:
active:
- dev
---
server:
port: 8201
spring:
profiles: dev
application:
name: microconfig-test-client2
eureka:
client:
serviceUrl:
defaultZone: http://admin:enjoy@localhost:7301/eureka
register-with-eureka: false
info:
app.name: microcloud-config-client-dev
company.name: enjoy
---
server:
port: 8102
spring:
profiles: beta
application:
name: microconfig-test-client2
eureka:
client:
serviceUrl:
defaultZone: http://admin:enjoy@localhost:7301/eureka
register-with-eureka: false
info:
app.name: microcloud-config-client-dev
company.name: enjoy
启动rabbitmq
1.6.1. 准备bus配置中心
新建立一个模块【microcloud-config-bus】,这模块是配置中心的升级版,作用也是配置中心。
【microcloud-config-bus】 修改pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>enjoy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>microcloud-config-bus</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
【microcloud-config-bus】 修改application.yml文件,配置上git目录,一样连接上eureka,要和消息中间件通讯,所以RabbitMQ的连接信息也配置上
server:
port: 7201
spring:
cloud:
config:
server:
git:
uri: https://github.com/enjoyeud/microconfig.git
bus:
trace:
enabled: true
rabbitmq:
host: localhost
port: 5672 # RabbitMQ的监听端口
username: enjoy # 用户名
password: 5428325 # 密码
application:
name: microcloud-config-bus
eureka:
client:
serviceUrl:
defaultZone: http://admin:enjoy@localhost:7301/eureka
instance:
prefer-ip-address: true # 在地址栏上使用IP地址进行显示
instance-id: microcloud-config-bus
management:
endpoints:
web:
exposure:
include: "*"
新增启动类
package cn.enjoy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigBusApp {
public static void main(String[] args) {
SpringApplication.run(ConfigBusApp.class,args);
}
}
先启动eureka,再启动ConfigBusApp 之后访问:
发现新的注册中心已经注册上去了。
1.6.2. 准备新的客户端
新建立microcloud-config-bus-client模块,这模块是注册中心的客户端,从注册中心获取数据,职责和【microcloud-config-client】一样,可用基于他拷贝修改,只是增加bus相关的功能。
【microcloud-config-bus-client】 修改pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>enjoy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>microcloud-config-bus-client</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
【microcloud-config-bus-client】bootstrap.yml 增加rabbitmq相关信息,另外的配置和前面一样,需要从eureka找到注册中心,也需要找具体配置文件信息
spring:
cloud:
config:
name: microcloud-config-client # 定义要读取的资源文件的名称
profile: dev # 定义profile的 名称
label: master # 定义配置文件所在的分支
#uri: http://localhost:7101 # SpringCloudConfig的服务地址
username: admin # 连接的用户名
password: enjoy # 连接的密码
discovery:
enabled: true
service-id: MICROCLOUD-CONFIG-BUS
rabbitmq:
host: localhost
port: 5672 # RabbitMQ的监听端口
username: enjoy # 用户名
password: 5428325 # 密码
eureka:
client:
serviceUrl:
defaultZone: http://admin:enjoy@localhost:7301/eureka
register-with-eureka: false
修改application.yml文件
spring:
application:
name: microcloud-config-client # 编写应用的名称
【microcloud-config-bus-client】 建立一个配置文件的映射类,这类是为了演示使用,里面的属性和github的属性一一对应,同时增加@RefreshScope,代表这个类是可用基于rabbitmq自动刷新的。
package cn.enjoy.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@Component
@RefreshScope
public class InfoConfig {
@Value("${info.app.name}")
private String appName ;
@Value("${info.company.name}")
private String companyName ;
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
@Override
public String toString() {
return "InfoConfig{" +
"appName='" + appName + '\'' +
", companyName='" + companyName + '\'' +
'}';
}
}
【microcloud-config-bus-client】修改ConfigClientController
package cn.enjoy.controller;
import cn.enjoy.config.InfoConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class ConfigClientController {
@Value("${spring.application.name}")
private String applicationName;
@Value("${eureka.client.serviceUrl.defaultZone}")
private String eurekaServers;
@Resource
private InfoConfig infoConfig;
@RequestMapping("/config")
public String getConfig() {
return "ApplicationName = " + this.applicationName + "、EurekaServers = "
+ this.eurekaServers+"、infos = " +infoConfig.toString();
}
}
新增启动类
package cn.enjoy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientBusApp {
public static void main(String[] args) {
SpringApplication.run(ConfigClientBusApp.class,args);
}
}
启动后访问
http://localhost:8201/config,这时候已经能获得配置中心的数据
1.6.3. 测试自动刷新
其实这里的自动刷新只能说是半自动的。
【github】microcloud-config-client.yml,随便修改里面的内容,提交
spring:
profiles:
active:
- dev
---
server:
port: 8201
spring:
profiles: dev
application:
name: microconfig-test-client2
eureka:
client:
serviceUrl:
defaultZone: http://admin:enjoy@localhost:7301/eureka
register-with-eureka: false
info:
app.name: microcloud-config-client-dev
company.name: enjoy
---
server:
port: 8102
spring:
profiles: beta
application:
name: microconfig-test-client2
eureka:
client:
serviceUrl:
defaultZone: http://admin:enjoy@localhost:7301/eureka
register-with-eureka: false
info:
app.name: microcloud-config-client-beta
company.name: enjoybeta
【microcloud-config-bus-client】 刷新客户端
这个时候信息并没自动刷新,数据还是以前的,这是以为对应消息中间件来说,还需要给他发个消息,代表数据已经更新了。
【microcloud-config-bus】使用postman发生一条post刷新的指令
http://localhost:7201/actuator/bus-refresh
访问http://localhost:15672,发现消息队列里面已经有消息传递了。
【microcloud-config-bus-client】 刷新客户端
http://localhost:8201/config 发现数据已经跟新
网友评论