- 集中配置管理,一个微服务架构中可能有成百上千个微服务,所以集中配置管理是很重要的。
- 不同环境不同配置,比如数据源配置在不同环境(开发,生产,测试)中是不同的。
- 运行期间可动态调整。例如,可根据各个微服务的负载情况,动态调整数据源连接池大小等
- 配置修改后可自动更新。如配置内容发生变化,微服务可以自动更新配置
一、Spring Cloud Config简介
- HTTP,为外部配置提供基于资源的API(键值对,或者等价的YAML内容)
- 属性值的加密和解密(对称加密和非对称加密)
- 通过使用@EnableConfifigServer在Spring boot应用中非常简单的嵌入。
- 绑定Confifig服务端,并使用远程的属性源初始化Spring环境
- 属性值的加密和解密(对称加密和非对称加密)
简单的来说:SpringCloudConfig就是我们配置中心,在单体应用中,配置文件不多,可以很方便处理。但是对于微服务架构来说,每个微服务就有:测试环境、生产环境、线上环境等。而微服务项目又有多个,所以呢,我们可以采用配置中心来进行统一管理。
看一张小图:
我们的配置文件实际上放在码云或者github上,我们搭建一个配置服务拿到远端的配置,然后发给微服务。
二、搭建一个小项目
在码云上搭建一个仓库,然后放两个配置文件!!
搭建一个项目:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
server:
port: 9999 #服务端口
spring:
application:
name: config-server #指定服务名
cloud:
config:
server:
git:
uri: https://gitee.com/Zesystem/config-resposity.git
username: 码云账号
password: 码云密码
skip-ssl-validation: true
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class,args);
}
}
直接启动就可可以了!!获取到对应的配置信息
微服务配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--引入EurekaClient-->
<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-config</artifactId>
</dependency>
</dependencies>
bootstrap.xml
spring:
cloud:
config:
name: application #应用名称,需要对应git中配置文件名称的前半部分
profile: pro #开发环境
label: master #git中的分支
uri: http://localhost:9999 #config-server的请求地址
启动程序(还有注册中心哦):
这样是可以访问的。说明配置成功!!!
但是这样依然无法解决这样一个问题:我们在码云上面更改配置文件信息,项目不会立即更新,需要重新启动项目,这样非常不友好!!我们看怎么来解决。
三、配置手动刷新
造成不能立即更新的原因是微服务有缓存,当你更改之后不会再次请求git拿取最新值。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改配置服务(开放请求刷新端点)
management:
endpoints:
web:
exposure:
include: refresh
在git上修改完配置文件之后,需要先访问localhost:9001/actuator/refresh。这样配置就刷新了,可以访问最新的数据。
四、高可用
我们可以构建多个config-server,将信息放到注册中心,然后微服务从注册中心中获取,而不是从config-server中直接获取
config-service
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</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-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改配置注册到注册中心
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:9000/eureka/
instance:
preferIpAddress: true
instance-id: ${spring.cloud.client.ip-address}:${server.port} #spring.cloud.client.ip-address:获取ip地址
修改配置微服务信息
测试是没问题的,大家可以看一下项目源代码就好!
五、连接消息总线
-
提交代码触发post请求给bus/refresh
-
server端接收到请求并发送给Spring Cloud Bus
-
Spring Cloud bus接到消息并通知给其它客户端
-
其它客户端接收到通知,请求Server端获取最新配置
-
全部客户端均获取到最新的配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
server:
port: 9999 #服务端口
spring:
application:
name: config-server #指定服务名
cloud:
config:
server:
git:
uri: https://gitee.com/Zesystem/config-resposity.git
username:
password:
skip-ssl-validation: true
rabbitmq:
host: 127.0.0.1
port: 5672
username: user
password: password
management:
endpoints:
web:
exposure:
include: refresh
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:9000/eureka/
instance:
preferIpAddress: true
instance-id: ${spring.cloud.client.ip-address}:${server.port} #spring.cloud.client.ip-address:获取ip地址
boostrap.xml配置:
spring:
cloud:
config:
name: application #应用名称,需要对应git中配置文件名称的前半部分
profile: pro #开发环境
label: master #git中的分支
# uri: http://localhost:9999 #config-server的请求地址
#通过注册中心获取config-server配置
discovery:
enabled: true #开启服务发现
service-id: config-server
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/
instance:
prefer-ip-address: true #使用ip地址注册
instance-id: ${spring.cloud.client.ip-address}:${server.port}
码云上面的配置修改:
源码:[email protected]:Zesystem/SpringCloudConfig.git