应用场景
1.集中配置管理(一处修改,处处生效)
2.不同环境不同配置(开发dev,测试test,生产prod)
3.运行期间可动态调整
4.如果配置内容发生变化,微服务可以自动更新配置分布式配置管理
Server:提供配置文件的存储、以接口的形式将配置文件的内容提供出去,通过使用@EnableConfigServer注解在Spring Boot应用中实现非常简单的嵌入
Client:通过接口获取配置数据并初始化自己的应用
创建config的服务端
1.创建一个config的项目
2.导入jar包
<dependencies> <!-- Eureka Client客户端依赖引入 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- Config配置中心服务端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies>
3.创建启动类
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.config.server.EnableConfigServer; @EnableConfigServer//开启config服务端的功能 @EnableDiscoveryClient//开启Eureka客户端的功能 @SpringBootApplication public class ConfigApplication9400 { public static void main(String[] args) { SpringApplication.run(ConfigApplication9400.class,args); } }
4.创建配置文件
到服务中心注册:application.properties
server.port=9400 eureka.client.service-url.defaultZone= http://LEQCloudEurekaServerA:9200/eureka,http://LEQCloudEurekaServerB:9201/eureka eureka.instance.prefer-ip-address=true eureka.instance.instance-id=${spring.cloud.client.ipaddress}:${spring.application.name}:${server.port}:@project.version@ spring.application.name=leq-service-config
配置配置信息application.yml
spring: cloud: config: server: git: #用于配置git仓库信息 uri,用户名,密码,分支 uri: git仓库的https地址 username: git账户的昵称 password: git账户的登录密码 search-paths: - spring-cloud-config # 仓库的名称 label: master #读取的分支
4.重启config的项目,在浏览器访问以下地址
http://localhost:9400/master/application-dev.yml
可以看大我们在git上面上传的文件,将这个项目作为 config的服务端
创建config的服务端
1.在page项目下导入依赖
<!-- Config配置中心客户端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> </dependency>
2.创建config的客户端调用类
import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("config") public class ConfigController { @Value("${mysql.user}") private String mysqlUser; @Value("${person.name}") private String personName; @RequestMapping("getConfig") public String getREmoteConfig(){ return "mysql.user:"+mysqlUser+",person.name:"+personName; } }
3.创建配置文件bootstrap.yml
server: port: 9100 spring: application: name: leq-service-page datasource: url: jdbc:mysql://192.168.117.130:3333/qf_sc?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC username: root password: 0216 cloud: config: #config客户端配置和ConfigServer通信,并告知ConfigServer希望获取的配置信息在哪个⽂件中 name: application profile: dev # 后缀名称 label: master # 分⽀名称 uri: http://localhost:9400 # ConfigServer配置中⼼地址 eureka: client: service-url: # Eureka Server的路径 defaultZone: http://LEQCloudEurekaServerA:9200/eureka,http://LEQCloudEurekaServerB:9201/eureka instance: # 使⽤ip注册,否则会使⽤主机名注册(此处考虑到对⽼版本的兼容,新版本经过实验都是ip) prefer-ip-address: true # ⾃定义实例显示格式,加上版本号,便于多版本管理,注意是ip-address早期版本是ipAddress instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@ hystrix: command: default: circuitBreaker: # 强制打开熔断器,如果该属性设置为true,强制断路器进入打开状态,将会拒绝所有的请求,默认false关闭的 forceOpen: false # 触发熔断错误比例阈值,默认值50% errorThresholdPercentage: 50 # 熔断后休眠时长,默认值5秒 sleepWindowInMilliseconds: 3000 # 熔断触发最小请求次数,默认值是20 requestVolumeThreshold: 2 execution: isolation: thread: # 熔断超时设置,默认为1秒 timeoutInMilliseconds: 2000 # Spring Boot中暴露健康检查等断点接⼝ management: endpoints: web: exposure: include: "*" # 暴露健康接⼝的细节 endpoint: health: show-details: always # 针对的被调⽤⽅微服务名称,不加就是全局⽣效 qf-service-product: ribbon: # 请求连接超时时间 ConnectTimeout: 2000 # 请求处理超时时间 ReadTimeout: 10000 # 对所有操作都进⾏重试 OkToRetryOnAllOperations: true # MaxAutoRetries: 0 # 对当前选中实例重试次数,不包括第⼀次调⽤ MaxAutoRetriesNextServer: 0 # 切换实例的重试次数 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载策略调整 # 开启Feign的熔断功能 feign: hystrix: enabled: true # true 开启Feign中继承Hystrix 熔断器功能 compression: request: enabled: true # 默认不开启 mime-types: text/html,application/xml,application/json # 设置压缩的数据类型,设置为默认值 min-request-size: 2048 # 设置触发压缩的⼤⼩下限,2048为默认值 response: enabled: true # 默认不开启
4.重启page项目,访问刚刚写的接口,可以看到数据,但是我们在git修改完数据后,并不会实时更新,只有服务类更新了,这就需要我们在添加一个注解
5.实现实时刷新
1)在配置文件中添加暴露健康检查断点的配置
management: endpoints: web: exposure: include: "*"
2)添加注解 @RefreshScope//手动刷新(获取最新的Config Server中的数据)
6.重启page项目,更改git文件中的内容并重新访问接口
然后我们访问刚刚的接口发现并没有更新,这是因为要更新还需要添加一个触发条件,注意该请求必须是post请求
http://localhost:9100/actuator/refresh
当发送完该请求后我们就会惊奇的发型我们的文件实时更新了,是不是很神奇,这是手动更新,下一篇我们将介绍如何进行自动更新