配置中心(spring cloud config)服务化和高可用
本文中示例代码的引用版本:
org.springframework.boot 版本 :2.1.0.RELEASE
org.springframework.cloud 版本:Greenwich.M1
示例代码-码云 https://gitee.com/sharps/springcloud
第五章中介绍,客户端都是直接调用配置中心的server端来获取配置文件信息。这样就存在了一个问题,客户端和服务端的耦合性太高,如果server端要做集群,客户端只能通过原始的方式来路由,server端改变IP地址的时候,客户端也需要修改配置,不符合springcloud服务治理的理念。springcloud提供了这样的解决方案,我们只需要将server端当做一个服务注册到eureka中,client端去eureka中去获取配置中心server端的服务既可。
第一步:创建eureka服务注册中心
新建module:0601spring-cloud-eureka
从0401spring-cloud-eureka复制该版本服务注册中心包含security权限认证
在server端和client端改造的时候需要做相应修改
第二步:server端改造
新建module:0602spring-cloud-config-server-node1、0602spring-cloud-config-server-node2 从0502spring-cloud-config-server复制
1、添加依赖
<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>
需要多引入spring-cloud-starter-netflix-eureka-client包,来添加对eureka的支持。
2、配置文件
node1和node2分别设置
server:
port: 8001 #node1设置8001,node2设置8003
spring:
application:
name: spring-cloud-config-server
cloud:
config:
server:
git:
uri: https://gitee.com/sharps/springcloud.git # 配置git仓库的地址
search-paths: config-repo# git仓库地址下的相对地址,可以配置多个,用,分割。
username: username# git仓库的账号
password: userpassword# git仓库的密码
security:
user:
name: admin
password: 123qwe
eureka:
client:
serviceUrl:
defaultZone: http://admin:123qwe@localhost:8000/eureka/ # 注册中心eurka地址 增加了eureka注册中心的配置 增加security 认证
3、启动类
启动类添加@EnableDiscoveryClient激活对配置中心的支持
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
public class SpringCloudConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigServerApplication.class, args);
}
}
这样server端的改造就完成了。先启动eureka注册中心,在启动server端(node1,node2),在浏览器中访问:http://localhost:8000/ 就会看到server端已经注册了到注册中心了。
按照上篇的测试步骤对server端进行测试服务正常。
第三步:client客户端改造
新建module:0604spring-cloud-config-client从0503spring-cloud-config-client复制
1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</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>
需要多引入spring-cloud-starter-netflix-eureka-client包,来添加对eureka的支持。
2、配置文件
修改:application.properties
spring.application.name=spring-cloud-config-client
server.port=8002
#spring-boot 2.1.0.RELEASE actuator 配置
management.endpoint.health.show-details=always
#Default: ["health", "info"] Endpoint IDs that should be included or '*' for all.
management.endpoints.web.exposure.include=*
修改:bootstrap.properties
spring.cloud.config.name=test-config
spring.cloud.config.profile=dev
#非服务注册中心式,直接指向server端地址的配置
#spring.cloud.config.uri=http://localhost:8001/
spring.cloud.config.label=master
#开启Config服务发现支持
spring.cloud.config.discovery.enabled=true
#指定server端的name,也就是server端spring.application.name的值
spring.cloud.config.discovery.serviceId=spring-cloud-config-server
# 注册中心eurka地址 增加了eureka注册中心的配置 增加security 认证
eureka.client.serviceUrl.defaultZone=http://admin:123qwe@localhost:8000/eureka/
主要是去掉了spring.cloud.config.uri直接指向server端地址的配置,增加了最后的三个配置:
- spring.cloud.config.discovery.enabled :开启Config服务发现支持
- spring.cloud.config.discovery.serviceId :指定server端的name,也就是server端spring.application.name的值
- eureka.client.serviceUrl.defaultZone :指向配置中心的地址
3、启动类
启动类添加@EnableDiscoveryClient激活对配置中心的支持
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigClientApplication.class, args);
}
}
启动client端,在浏览器中访问:http://localhost:8000/ 就会看到server端和client端都已经注册了到注册中心了。
第四步:高可用测试
为了模拟生产集群环境,我们改动server端的端口为8003,再启动一个server端来做服务的负载,提供高可用的server端支持。
如上图就可发现会有两个server端同时提供配置中心的服务,防止某一台down掉之后影响整个系统的使用。
我们先单独测试服务端,分别访问:http://localhost:8001/test-config/dev、http://localhost:8003/test-config/dev返回信息:
{
"name": "test-config",
"profiles": [
"dev"
],
"label": null,
"version": "89e8db7c264360c68fbf4cb18035b80faa844920",
"state": null,
"propertySources": [
{
"name": "https://gitee.com/sharps/springcloud.git/config-repo/test-config-dev.properties",
"source": {
"test.hello": "hello im dev success!"
}
}
]
}
说明两个server端都正常读取到了配置信息。
再次访问:http://localhost:8002/hello,返回:hello im dev success!。说明客户端已经读取到了server端的内容,我们随机停掉一台server端的服务,再次访问http://localhost:8002/hello,返回:hello im dev success!,说明达到了高可用的目的。
项目节点
06spring-cloud-config-eureka
---->0601spring-cloud-eureka 说明:服务注册中心
---->0602spring-cloud-config-server-node1 说明:提供配置文件的存储、以接口的形式将配置文件的内容提供出去。
---->0603spring-cloud-config-server-node2 说明:提供配置文件的存储、以接口的形式将配置文件的内容提供出去。
---->0604spring-cloud-config-client 说明:通过接口获取数据、并依据此数据初始化自己的应用。