<八>spring-cloud Hoxton.SR2 配置中心config服务端、客户端的搭建使用
<八>spring-cloud Hoxton.SR2 配置中心config服务端、客户端的搭建使用
文章目录
- <八>spring-cloud Hoxton.SR2 配置中心config服务端、客户端的搭建使用
- 1、spring-cloud-config 配置中心server端项目搭建
- 1.1、搭建新的项目`badger-spring-cloud-config-server`,pom文件如下
- 1.2、主类上加注解`@EnableConfigServer`和eureka的注解`@EnableEurekaClient`
- 1.3、yaml的配置文件
- 2、spring-cloud-config 配置中心server端测试演示
- 2.1、测试演示
- 2.2、配置文件获取规则
- 3、spring-cloud-config 配置中心使用端client端项目搭建
- 3.1、搭建新的项目`badger-spring-cloud-config-client`,pom文件如下
- 3.2、主类上eureka的注解`@EnableEurekaClient`
- 3.3、bootstrap.yml配置文件
- 4、spring-cloud-config 配置中心client端测试演示
- 4.1、演示
- 4.2、遇到的问题
- 4.3、手动刷新配置中心客户端获取的文件内容;
- 4.4、再次测试演示
- 1、访问配置中心服务端,得到最新的配置(10000端口)
- 2、访问客户端;得到当前的应用的端口(10000端口);
- 3、修改git上的`application-dev.yml`文件的端口,改成10001;
- 4、再次访问配置中心服务端,得到最新的配置(10001端口);已经拿到最新的文件内容;
- 5、再次访问客户端;得到当前的应用的端口(10000端口);还是历史文件的内容,没有被刷新;
- 6、使用post请求,调用
- 7、再次访问客户端;得到当前的应用的端口(10001端口);
- 8、还有问题;
- 9、自动刷新;下一章说吧
本地项目的基础环境
环境 | 版本 |
---|---|
jdk | 1.8.0_201 |
maven | 3.6.0 |
Spring-boot | 2.2.4.RELEASE |
Spring-cloud | Hoxton.SR2 |
《<一>spring-cloud Hoxton.SR2版 服务注册与发现–eureka搭建以及集群搭建》
《<二>spring-cloud Hoxton.SR2 负载均衡ribbon搭建使用》
《<三>spring-cloud Hoxton.SR2 负载均衡openfeign搭建使用》
《<四>spring-cloud Hoxton.SR2 断路器hystrix搭建使用》
《<五>spring-cloud Hoxton.SR2 hystrix Dashboard监控搭建使用》
《<六>spring-cloud Hoxton.SR2 网关组件zuul搭建使用》
《<七>spring-cloud Hoxton.SR2 网关组件gateway搭建使用》
具体代码信息,可以查看《码云》
文档信息,可以参考《spring-cloud中文网》;《spring官网》
1、spring-cloud-config 配置中心server端项目搭建
1.1、搭建新的项目badger-spring-cloud-config-server
,pom文件如下
主要是新增注册中心eureka的包spring-cloud-starter-netflix-eureka-client
,配置中心config-server的包spring-cloud-config-server
;当然,如果应用不需要注册到Eureka中,也不需要加入Eureka的包;
<?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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.badger</groupId>
<artifactId>badger-spring-cloud-config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>badger-spring-cloud-config-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<spring-cloud.version>Hoxton.SR2</spring-cloud.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>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2、主类上加注解@EnableConfigServer
和eureka的注解@EnableEurekaClient
/** * @EnableConfigServer 开启config服务端的注册 * @author liqi */
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
1.3、yaml的配置文件
server:
port: 9500
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
instance-id: ${ spring.cloud.client.ip-address}:${ server.port}
prefer-ip-address: true
spring:
application:
name: badger-spring-cloud-config-server
cloud:
config:
server:
git:
uri: https://gitee.com/liqi01/badger-spring-cloud.git
default-label: master
之前的Eureka的配置,就不说了;如果上面的pom文件中,没有加入Eureka,那就不需要配置;
spring-cloud-config的服务端的配置,我们这里主要是使用git
的形式,spring.cloud.config.server.git
配置,可以详细查看org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentProperties.class
配置类,以及父类和父类的抽象类;
@ConfigurationProperties("spring.cloud.config.server.git")
@Validated
@PrivateKeyIsValid
@HostKeyAndAlgoBothExist
@HostKeyAlgoSupported
@KnownHostsFileIsValid
public class MultipleJGitEnvironmentProperties extends JGitEnvironmentProperties {
}
主要使用gitee
作为演示的;
1、我使用的公有库,没有权限的,上述的配置,只配置了url
;
default-label
:表示分支的名称,默认属性就是master
,如果是其他的分支,那么填上对应的分支的名称就可以了;
2、如果要使用私有库,并且使用http形式;那么需要配置username
以及password
配置样例如下:
spring:
application:
name: badger-spring-cloud-config-server
cloud:
config:
server:
git:
force-pull: true
uri: https://gitee.com/liqi01/badger-spring-cloud.git
default-label: master
username: xxx
password: xxx
**3、如果使用私有库,并且使用SSH
;**那么需要配置SSH的私钥;
电脑本机已经有私钥,private-key
属性可以不需要配置;如果没有,那么需要把私钥写到配置属性中;
url
:配置成SSH形式的;配置样例如下:
spring:
application:
name: badger-spring-cloud-config-server
cloud:
config:
server:
git:
force-pull: true
uri: git@gitee.com:liqi01/badger-spring-cloud.git
default-label: master
private-key: 私钥
2、spring-cloud-config 配置中心server端测试演示
2.1、测试演示
我在https://gitee.com/liqi01/badger-spring-cloud.git
这个git地址下,演示的yml
的配置文件名称application-dev.yml
;文件内容如下:
server:
port: 10001
启动运用;通过url地址访问,得到如下结果
http://localhost:9500/master/application-dev.yml
可以看到,能够取到对应的yml文件的内容;
修改git上application-dev.yml
文件的端口的值;改成10000
后,再继续访问;可以看到端口,也改成了修改后的值;
2.2、配置文件获取规则
具体取文件的规则如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
application:表示文件的名字;对应上述的application
;
profile:表示运行的环境,对应上述的dev
;
label:表示分支的名字,对应上述的master
;
上述的访问形式,使用的/{label}/{application}-{profile}.yml
;
如果为默认分支(master
);则分支,可以省略/{application}-{profile}.yml
3、spring-cloud-config 配置中心使用端client端项目搭建
3.1、搭建新的项目badger-spring-cloud-config-client
,pom文件如下
主要是新增注册中心eureka的包spring-cloud-starter-netflix-eureka-client
,配置中心config-server的包spring-cloud-config
;当然,如果应用不需要注册到Eureka中,也不需要加入Eureka的包;
<?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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.badger</groupId>
<artifactId>badger-spring-cloud-config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>badger-spring-cloud-config-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<spring-cloud.version>Hoxton.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.2、主类上eureka的注解@EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient
@RestController
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
@Value("${server.port}")
String port;
@Value("${spring.cloud.client.ip-address}")
String address;
@GetMapping("/demo")
public String demo() {
return "我的地址是-->" + address + ":" + port;
}
}
3.3、bootstrap.yml配置文件
server:
port: 9501
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
instance-id: ${ spring.cloud.client.ip-address}:${ server.port}
prefer-ip-address: true
spring:
application:
name: badger-spring-cloud-config-client
cloud:
config:
label: master
name: application
profile: dev
uri:
- http://localhost:9500
如果配置文件名字叫application.yml
,那么通过config加载的配置文件,不生效;启动的端口,还是上述配置文件中的9051
;
需要把配置文件名称改成bootstrap.yml
;优先级要高于application.yml
;
label:分支名称
name:配置文件的名称;
profile:运行环境;
uri:配置中心的地址;
4、spring-cloud-config 配置中心client端测试演示
4.1、演示
启动应用badger-spring-cloud-config-client
;可以看到,从配置中心已经读取到了端口10000
,并且已经启动了
直接访问url,也可以看到具体的内容信息
http://localhost:10000/demo
我的地址是-->172.16.2.54:10000
;
4.2、遇到的问题
修改git上application-dev.yml
文件的端口的值;改回10001
后;
1、配置中心服务端
再继续访问配置中心config-server应用;
http://localhost:9500/application-dev.yml
可以看到文件内容端口信息,已经改回到了10001
了;可以确认,git上的配置文件,已经改成功了;并且配置中心,也已经拿到最新的文件内容;
2、配置中心客户端
客户端,后台并没有刷新;访问下面地址后,跟上述结果一致,没有变化;
http://localhost:10000/demo
说明,客户端获取的配置文件,没有刷新;
4.3、手动刷新配置中心客户端获取的文件内容;
- 在主的启动类上,新增注解
@RefreshScope
(spring-cloud原生注解,支持动态刷新); - 修改git上
application-dev.yml
文件的端口的值;改回10000
(上面测试的时候,改成了10001); pom文件,新增监控
actuator
的jar包
org.springframework.boot
spring-boot-starter-actuator
bootstrap.yml文件,新增监控的配置,暴露所有的监控点可以被访问;
management:
endpoints:web:
exposure:
include: '*'
重启应用;获取的git的文件的端口是10000;
@SpringBootApplication
@EnableEurekaClient
@RestController
@RefreshScope
public class ConfigClientApplication {public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
@Value("${server.port}")
String port;
@Value("${spring.cloud.client.ip-address}")
String address;
@GetMapping("/demo")
public String demo() {
return "我的地址是-->" + address + ":" + port;
}
}
4.4、再次测试演示
1、访问配置中心服务端,得到最新的配置(10000端口)
http://localhost:9500/application-dev.yml
2、访问客户端;得到当前的应用的端口(10000端口);
http://localhost:10000/demo
3、修改git上的application-dev.yml
文件的端口,改成10001;
4、再次访问配置中心服务端,得到最新的配置(10001端口);已经拿到最新的文件内容;
http://localhost:9500/application-dev.yml
5、再次访问客户端;得到当前的应用的端口(10000端口);还是历史文件的内容,没有被刷新;
http://localhost:10000/demo
6、使用post请求,调用
curl -X POST "http://localhost:10000/actuator/refresh"
7、再次访问客户端;得到当前的应用的端口(10001端口);
http://localhost:10000/demo
可以看到,浏览器的内容,端口已经改变了,变成了10001;说明已经成功了;已经手动把内容更新到最新了;
8、还有问题;
浏览器的内容,是刷新了~但是容器的端口,还是通过10000
访问,没有变成10001;查看了下应用的日志;刷新的时候,只是更新了内容,但是容器没有动态发布;所以,端口也没有变化;
也很好理解:springboot 容器启动的时候,先是自动装配一些组件(例如:redis、DataSource、内置Tomcat……);再装配的时候,第一次拉去了配置中心的文件,初始化了一些配置(Tomcat配置的端口),并把整个项目启动成功;如果有修改了配置中心文件的内容,容器没有刷新,那么容器还是原来的容器,只是对应的配置属性在内存里更新了;那么同样的,针对其他的组件(redis连接属性、DataSource连接池等)配置中心更新了IP地址或者认证的密码;客户端,只是会拿到最新的数据,存储在内存里,而不会针对组件生效;还是需要重启服务器,第一次拉取文件的时候,才会生效;
9、自动刷新;下一章说吧
具体代码信息,可以查看《码云》
还没有评论,来说两句吧...