产生背景
在微服务中,如果使用传统的方式进行管理配置文件,配置文件管理器非常复杂。如果生产环境配置文件,可能需要发生改变的时候,重新打war包,重新读取配置信息,缓存到JVM内存中。
什么是分布式配置中心
在微服务中,使用同一个服务器管理所有服务配置文件信息,能够实现后台可管理,当服务器正在运行的时候,如果配置文件需要发生改变,可以实现不需要重启服务器,实时更改配置文件信息。
分布式配置中心框架
- 阿波罗,携程分布式配置中心,有图形界面可管理配置文件信息,配置文件信息存放到数据库中
- SpringCloud Config没有后台可管理的分布式配置中心,配置文件信息存放在版本控制器里(git|svn)
- 使用Zookeeper实现分布式配置中心,持久节点+事件通知
Config架构
设计一层ConfigServer服务器的目的就是缓存git上配置文件信息
Config搭建
Git环境搭建
使用码云环境搭建git服务器端
码云环境地址:https://gitee.com/JBL_lun/Config
Eureka服务搭建
1、pom文件引入
<!-- 管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--SpringCloud eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
2、配置文件
###服务端口号
server:
port: 8100
##定义服务名称
spring:
application:
name: app-lun-eureka
eureka:
instance:
###注册中心ip地址
hostname: 127.0.0.1
client:
serviceUrl:
##注册地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
####因为自己是注册中心,是否需要将自己注册给自己的注册中心(集群的时候是需要是为true)
register-with-eureka: false
###因为自己是注册中心, 不需要去检索服务信息
fetch-registry: false
# 测试时关闭自我保护机制,保证不可用服务及时踢出
server:
# 测试时关闭自我保护机制,保证不可用服务及时踢出
enable-self-preservation: false
### ##剔除失效服务间隔
eviction-interval-timer-in-ms: 2000
2、启动项
@SpringBootApplication
// @EnableEurekaServer 表示开启EurekaServer服务 开启注册中心
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
ConfigServer搭建
1、pom文件引入
<!-- 管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--spring-cloud 整合 config-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- SpringBoot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
2、配置文件
###服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
spring:
application:
####注册中心应用名称
name: config-server
cloud:
config:
server:
git:
###git环境地址
uri: https://gitee.com/JBL_lun/Config.git
####搜索目录
search-paths:
- config
####读取分支
label: master
####端口号
server:
port: 8888
3、启动项
@SpringBootApplication
//@EnableConfigServer 开启分布式配置中心服务器端
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
4、访问http://127.0.0.1:8888/config-client-dev.properties,就能查看到提交到码云上的配置文件了
ConfigServer搭建
1、pom文件引入
<!-- 管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<!-- SpringBoot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
2、配置文件
spring:
application:
####注册中心应用名称
name: config-client
cloud:
config:
####读取后缀
profile: dev
####读取config-server注册地址
discovery:
service-id: config-server
enabled: true
##### eureka服务注册地址
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
server:
port: 8882
3、启动项
@SpringBootApplication
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
4、获取配置文件信息
@RestController
public class IndexController {
//冒号后面为默认值,如果找不到返回默认值
@Value("${lunInfo:defultValue}")
private String name;
@RequestMapping("/name")
private String name() {
return name;
}
}
动态刷新数据
在SpringCloud中有手动刷新配置文件和实时刷新配置文件两种方式:
- 手动方式采用actuator端点刷新数据
- 实时刷新采用SpringCloud Bus消息总线
actuator端点刷新数据
1、pom文件新增
<!-- actuator监控中心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、配置文件新增
management:
endpoints:
web:
exposure:
include: "*"
3、在需要刷新的Bean上添加@RefreshScope注解
@RestController
//当配置更改时,标有@RefreshScope的Bean将得到特殊处理来生效配置
@RefreshScope
public class IndexController {
//冒号后面为默认值,如果找不到返回默认值
@Value("${lunInfo:defultValue}")
private String name;
@RequestMapping("/name")
private String name() {
return name;
}
}
4、手动刷新
http://127.0.0.1:8882/actuator/refresh 启动刷新器 从cofnig server读取