简介:
在分布式系统中,我们有许多的服务,每个服务的配置文件分散在不同的微服务项目中,管理起来真的是超级的不方便,而且我改变了配置文件如果要配置文件生效的话 需要我们重启项目才能使用更改后的配置文件生效 也是特别的不友好啊,所以为了方便配置文件集中管理,需要分布式配置中心组件。
在springCloud中提供了SpringCloud Config,它支持配置文件放在配置服务的本地,也支持配置文件放在远程仓库Git(GitHub,码云)上面。配置中心的本质其实本身也是个微服务,所以也需要配注册到Eureka服务中心!!!
具体如何实现呢?
别着急,它来了它来了~
实现
首先我们的配置文件是要交给gitee去管理所以第一步当然是去配置我们的远程仓库啦~
gitee配置管理
gitee访问网址:http://gitee.com
1、创建仓库
2、配置仓库名称和路径
因为我之前学习的时候自己已经创建过一个名为config的远程仓库了,所以提示已存在,换一个名字就好了 问题不大的
3、创建配置文件
打开刚刚创建的config远程仓库,新建文件
文件名如何命名?
命名规则:
配置文件的命名方式:{application}-{profile}.yml或{application}-{profile}.properties
application为应用名称
profile用于区分开发环境dev,测试环境test,生产环境pro等
开发环境 user-dev.yml
测试环境 user-test.yml
生产环境 user-pro.yml
看了命名规则所以我们的文件的命名是:user-provider-dev.yml
创建完我们将提供者的配置文件代码复制到user-provider-dev.yml中
server:
port: 18081
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123
application:
name: user-provider
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
instance:
ip-address: 127.0.0.1
prefer-ip-address: true
#若超过90s,eureka服务器还没收到provider发送的http请求,则认为服务停止运行。若关闭了eureka的自我保护机制,则eurekaServer会将无效的服务移除列表
lease-expiration-duration-in-seconds: 90
#服务正常情况下,每个30s,发送一个http请求给eurekaServer,证明自己可以正常运行
lease-renewal-interval-in-seconds: 30
创建完配置文件user-provider-dev.yml文件的gitee仓库目录如下:
搭建微服务配置
实现步骤
1、创建子工程 配置中心 springboot 工程项目 config-server
2、引入相关依赖
3、启动类添加配置中心注解
4、配置application.yml文件
5、启动测试
实现过程
创建子工程 config-server
引入相关依赖
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
创建启动类
在config-server中创建启动类ConfigServerApplication代码如下:
package com.shenwang;
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;
/**
* 启动类
* @author: shenwang
* Date: 2021/7/14
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(com.shenwang.ConfigServerApplication.class,args);
}
}
@EnableDiscoveryclient注解是开启Eureka客户端发现功能
@EnableConfigServer注解是开启配置服务功能
配置application.yml文件
# 注释版本
server:
port: 18085 # 端口号
spring:
application:
name: config-server # 应用名
cloud:
config:
server:
git:
# 配置gitee的仓库地址
uri: https://gitee.com/cn_ahua/config
# Eureka服务中心配置
eureka:
client:
service-url:
# 注册Eureka Server集群
defaultZone: http://127.0.0.1:7001/eureka
# com.guigu 包下的日志级别都为Debug
logging:
level:
com: debug
注意:上述spring.cloud.config.server.git.uri是在码云创建的仓库地址
请及时换成自己的git地址,如果一味的复制,那你访问的会是我git仓库里的配置文件
测试
注意:启动顺序 咱们肯定是要先开启咱们的服务发现 (eureka-server)因为配置中心本身也是服务需要被注册到配置中心。
再启动config-server,紧接着访问 http://localhost:18085/user-provider-dev.yml 效果如下:
可以查看到码云上的文件数据,并且可以在gitee上修改user-provider-dev.yml,然后刷新上述测试地址也能及时更新数据
服务去获取配置中心的配置
目标:改造提供者 eureka-provider工程,配置文件不再由微服务项目提供,而是从配置中心获取
实现步骤:
1、引入配置中心客户端启动依赖
2、修改服务提供者(eureka-provider)配置
3、启动服务,测试效果
引入配置中心客户端启动依赖
<!--spring cloud 配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
修改服务提供者(eureka-provider)配置
删除application.yml文件,新建bootstrap.yml文件
boostrap.yml文件代码如下:
# 注释版本
spring:
cloud:
config:
name: user-provider # 与远程仓库中的配置文件的application保持一致,{application}-{profile}.yml
profile: dev # 远程仓库中的配置文件的profile保持一致
label: master # 远程仓库中的版本保持一致
discovery:
enabled: true # 使用配置中心
service-id: config-server # 配置中心服务id
#向Eureka服务中心集群注册服务
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka
问题来了,为什么这些配置我不能写在application.yml文件中呢,反正都是以yml为后缀有什么区别,over 问的好,下面就是区别:
1、bootstrap.yml文件是SpringBoot的默认配置文件,而且其加载时间相比于application.yml更早。
2、 bootstrap.yml和application.yml都是默认配置文件,但定位不同
3、bootstrap.yml可以理解成系统级别的一些参数配置,一般不会变动
4、application.yml用来定义应用级别的参数
5、搭配spring-cloud-config使用application.yml的配置可以动态替换。
6、bootstrap.yml相当于项目启动的引导文件,内容相对固定
7、application.yml文件是微服务的常规配置参数,变化比较频繁
总结一下:
就是说springboot的配置文件 有application和bootsrap 但application是是用户级别的配置文件,主要用于 Spring Boot 项目的自动化配置。bootstrap是系统级别的配置文件主要用于 Spring Boot 项目的自动化配置。
有以下几个应用场景:使用 Spring Cloud Config 配置中心时,需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;一些固定的不能被覆盖的属性;一些加密/解密的场景。
启动测试:
首先回到gitee在我们的user-provider-dev.yml 添加配置
test:
message: hello world!
添加完之后效果:
在我们的eureka-provider中编写一个controller 用于返回配置中心的配置文件里面的属性用于测试
package com.shenwang.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author: shenwang
* Date: 2021/7/14
*/
@RestController
@RequestMapping(value = "/config")
public class LoadConfigController {
@Value("${test.message}")
private String msg;
/**
* 响应配置文件中的数据
* @return
*/
@RequestMapping(value = "/load")
public String load(){
return msg;
}
}
启动服务中心------》配置中心------》服务提供者
再访问咱们的controller(http://localhost:18081/config/load) 看下能不能拿到这个message的值hello world!
测试成功!!!
但是咱们再修改gitee上的配置 刷新网址 它还是不能拿到最新数据为什么呢?
嗯.......问的好
对于这个问题 用下面这副图来解释:
可以看到 我们配置中心需要发送消息到Spring Cloud Bus 和 消息队列里面才能再次的给到我们的服务,所以说咱们又衍生到了下一个知识点消息总线!!!
如何实现呢:来,佛楼米!
消息总线 springcloud Bus
bus简介
Bus是用轻量的消息代理将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理。
Bus可以为微服务做监控,也可以实现应用程序之间互相通信。Bus可选的消息代理RabbitMQ和Kafka。
广播出去的配置文件服务会进行本地缓存。
具体实现
首先在config-server项目中加入bus相关依赖
<!--消息总线依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<!--RabbitMQ依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
在config-server中的application.yml添加配置
#rabbitmq的配置信息:如下配置的rabbit都是默认配置,其实完全可以不配置
rabbitmq:
virtual-host: /
host: localhost
port: 5672
username: guest
password: guest
#暴露触发消息总线的地址
management:
endpoints:
web:
exposure:
#暴露触发消息总线的地址
include: bus-refresh
看清楚等级结构:
所有的application.yml配置代码如果上面出错直接复制下面代码,可以按照自己需要修改:
# 注释版本
server:
port: 18085 # 端口号
spring:
application:
name: config-server # 应用名
cloud:
config:
server:
git:
# 配置gitee的仓库地址
uri: https://gitee.com/cn_ahua/config
#rabbitmq的配置信息:如下配置的rabbit都是默认配置,其实完全可以不配置
rabbitmq:
virtual-host: /
host: localhost
port: 5672
username: guest
password: guest
#暴露触发消息总线的地址
management:
endpoints:
web:
exposure:
#暴露触发消息总线的地址
include: bus-refresh
# Eureka服务中心配置
eureka:
client:
service-url:
# 注册Eureka Server集群
defaultZone: http://127.0.0.1:7001/eureka
# com.guigu 包下的日志级别都为Debug
logging:
level:
com: debug
改造服务提供者(eureka-provider)
(1)引入依赖
<!--消息总线依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<!--RabbitMQ依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<!--健康监控依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改bootrap.yml文件
# 注释版本
spring:
cloud:
config:
name: user-provider # 与远程仓库中的配置文件的application保持一致,{application}-{profile}.yml
profile: dev # 远程仓库中的配置文件的profile保持一致
label: master # 远程仓库中的版本保持一致
discovery:
enabled: true # 使用配置中心
service-id: config-server # 配置中心服务id
# rabbitmq的配置信息;如下配置的rabbit都是默认值,其实可以完全不配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#向Eureka服务中心集群注册服务
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka
再重新启动
服务中心----》配置中心------》服务提供者
这就完了?不不不不,还需要刷新一下配置
刷新配置
打开postman用post请求访问:http://localhost:18085/actuator/bus-refresh
这里有问会说 ,好麻烦呀,我还不如重启项目呢!
怎么可以有这种想法呢?作为一个程序袁 我们要想到不只是要实现功能,如果后期需要维护怎么办 重启一下服务,导致该时间的用户使用不了怎么办,而且一个项目超级多的服务 就是说服务提供者可能不止一个 可能十个二十个几百个 一个一个打开项目目录去找 是不是也超级麻烦,我们直接在gitee上修改 再刷新就可以实现的功能 就不要去重启项目啦,且不容易出现问题
这也是给自己避免麻烦!!!
我们这样就可以从远程仓库动态获取配置啦 学废了吗孩砸