1、Config Server从git获取配置信息
Config Server可以从git仓库中读取配置文件,Server暴露Http Api接口,Config Client通过调用接口来读取配置。
1.1、建立Config Server
建立一个工程名为:config-server的spring boot工程,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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.hzlitai</groupId>
<artifactId>eureka-memo</artifactId>
<version>1.1-SNAPSHOT</version>
</parent>
<groupId>com.hzlitai</groupId>
<artifactId>config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在程序的启动类增加注解,代码如下:
package com.hzlitai.configserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
工程的配置文件application.yml代码如下:
spring:
cloud:
config:
server:
git:
uri: https://e.coding.net/zhuheliang/springcloud/SpringcloudConfig
#native:
#search-locations: classpath:/shared
username: username
password: 123456
default-label: master
profiles:
active: remote
application:
name: config-server
server:
port: 5001
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka
在coding创一个springcloud项目,然后新建SpringcloudConfig代码仓库,将配置文件直接提交到仓库中。
1.2、构建Config Client
新建一个名为:config-client的springboot项目,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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.hzlitai</groupId>
<artifactId>eureka-memo</artifactId>
<version>1.1-SNAPSHOT</version>
</parent>
<groupId>com.hzlitai</groupId>
<artifactId>config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在resources下面新建一个bootstrap.yml,这个文件先于application.yml执行,添加如下代码:
spring:
application:
name: config-client
cloud:
config:
fail-fast: true
discovery:
enabled: true
serviceId: config-server
profiles:
active: dev
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka
management:
endpoints:
web:
exposure:
include: "*"
在application.yml文件里添加如下代码:
server:
port: 8771
启动文件代码如下:
package com.hzlitai.configclient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@EnableEurekaClient
@SpringBootApplication
@RestController
@RefreshScope
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
@Value("${foo}")
String foo;
@RequestMapping(value = "/foo")
public String hi(){
return foo;
}
}
以上代码就实现了客户端读取git上面的配置信息,如果Server要做高可用,可以开启多个Server实例,Client会随机获取Server的实例(负载均衡)。
2、使用Spring Cloud Bus刷新配置
客户端一般是多个实例部署,如果git上的配置文件修改过之后,就需要将配置文件修改同步给每个客户端实例,可以使用Spring Cloud Bus去刷新配置。
在之前的代码进行改造,修改config-client工程,pom增加RabbitMQ实现Spring Cloud Bus的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
连接RabbitMQ的配置,并去掉安全验证如下:
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: "*"
最后需要在启动类上加如下配置:
@RefreshScope
依次启动工程,其中config-client开启两个实例,修改远程git配置文件,通过idea提供的REST Client工具发送Post请求:
地址是:http://localhost:8771/actuator/bus-refresh或 http://localhost:8772/actuator/bus-refresh,即可刷新服务名config-client所有的服务实例。