rabbitmq 的安装,启动,这里就不多说了,这里主要是介绍在git 仓库上有你的配置仓库,现在通过消息广播的形式,达到这样的效果:
git上的配置信息更改之后,可以在不重启服务的情况下,让服务读取到新的配置内容!
现在上例子:
1:创建config-server 服务用于从git 仓库上拉取信息
配置如下:
spring.application.name=config-server server.port=2007 spring.cloud.config.server.git.uri=你的Git地址 spring.cloud.config.server.git.search-paths={application} spring.cloud.config.server.git.username=你的Git账户 spring.cloud.config.server.git.password=你的Git密码 eureka.client.service-url.defaultZone=http://localhost:1111/eureka/ spring.rabbitmq.host=localhost spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.rabbitmq.port=5672 management.security.enabled=false
pom如下:
xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>com.yycgroupId> <artifactId>config-serverartifactId> <version>0.0.1-SNAPSHOTversion> <packaging>jarpackaging> <name>config-servername> <description>Demo project for Spring Bootdescription> <parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>1.5.10.RELEASEversion> <relativePath/> parent> <properties> <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding> <java.version>1.8java.version> properties> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-bus-amqpartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-eurekaartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-config-serverartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starterartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> dependency> dependencies> <build> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> plugin> plugins> build> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-dependenciesartifactId> <version>Dalston.SR5version> <type>pomtype> <scope>importscope> dependency> dependencies> dependencyManagement> project>
启动类的注解需要加上@EnableConfigServer注解 启动配置服务 从git上拉配置信息
2:创建config-client项目 从config-server 获取配置信息 相当于我们平时的各种微服务,这里单拿一个出来做介绍!
配置:用的yml 格式 这个配置文件一定要使用bootstrap.yml或者bootstrap.properties
下面这段是百度的:////
说明:其实yml和properties文件是一样的原理,主要是说明application和bootstrap的加载顺序。且一个项目上要么yml或者properties,二选一的存在。
Bootstrap.yml(bootstrap.properties)在application.yml(application.properties)之前加载,就像application.yml一样,但是用于应用程序上下文的引导阶段。它通常用于“使用Spring Cloud Config Server时,应在bootstrap.yml中指定spring.application.name和spring.cloud.config.server.git.uri”以及一些加密/解密信息。技术上,bootstrap.yml由父Spring ApplicationContext加载。父ApplicationContext被加载到使用application.yml的之前。
例如,当使用Spring Cloud时,通常从服务器加载“real”配置数据。为了获取URL(和其他连接配置,如密码等),您需要一个较早的或“bootstrap”配置。因此,您将配置服务器属性放在bootstrap.yml中,该属性用于加载实际配置数据(通常覆盖application.yml [如果存在]中的内容)。
当然,在一些情况上不用那么区分这两个文件,你只需要使用application文件即可,把全部选项都写在这里,效果基本是一致的,在不考虑上面的加载顺序覆盖的问题上。
spring: application: name: config-client rabbitmq: host: localhost password: guest username: guest port: 5672 cloud: config: label: master uri: http://localhost:2007/ profile: test discovery: enabled: true service-id: config-server fail-fast: true name: config-client eureka: client: service-url: defaultZone: http://127.0.0.1:1111/eureka/ server: port: 2008
pom文件:
xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>com.yycgroupId> <artifactId>config-clientartifactId> <version>0.0.1-SNAPSHOTversion> <packaging>jarpackaging> <name>config-clientname> <description>Demo project for Spring Bootdescription> <parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>1.5.10.RELEASEversion> <relativePath/> parent> <properties> <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding> <java.version>1.8java.version> <spring-cloud.version>Dalston.SR5spring-cloud.version> properties> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-bus-amqpartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-configartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-eurekaartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starterartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> dependency> dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-dependenciesartifactId> <version>${spring-cloud.version}version> <type>pomtype> <scope>importscope> dependency> dependencies> dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> plugin> plugins> build> project>
测试controller
@RestController @RefreshScope //必须的否则不能动态获取配置的值 public class HelloController { @Value("${yang}") String yang; @RequestMapping("/yang") public String sang() { return this.yang; } }
现在我们服务配置提供者和消费者已经写完了 接下来在git上新建一个项目,把配置文件上传上去 比如:
码云上有个项目 文件夹的名称是config-client
然后启动eureka, rabbitmq, config-server,config-client
访问http://localhost:2008/yang 得到内容,然后修改git仓库的内容,因为我上面启动的时候用的是test所以改变test文件,然后发送请求http://localhost:2007/bus/refresh/ 注意:这是个post请求,所以使用postman进行访问!然后你再访问http://localhost:2008/yang 你会发现内容已经变了
3:这里面存在的坑:
一开始如果你的配置文件不写这个配置的话:
management.security.enabled=false
你会发现你访问不了http://localhost:2007/bus/refresh/ 地址,报错如下
可是有的小伙伴也发现了,我的依赖里面没有加spring-boot-starter-actuator依赖啊!
但是是有的,只是在这个里面:
也就是说你引用的
<dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-config-serverartifactId> dependency>这个依赖里面是有的!因此暂时先加上
management.security.enabled=false