<八>spring-cloud Hoxton.SR2 配置中心config服务端、客户端的搭建使用

雨点打透心脏的1/2处 2021-09-24 12:58 268阅读 0赞

<八>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的包;

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <modelVersion>4.0.0</modelVersion>
  4. <parent>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-starter-parent</artifactId>
  7. <version>2.2.4.RELEASE</version>
  8. <relativePath /> <!-- lookup parent from repository -->
  9. </parent>
  10. <groupId>com.badger</groupId>
  11. <artifactId>badger-spring-cloud-config-server</artifactId>
  12. <version>0.0.1-SNAPSHOT</version>
  13. <name>badger-spring-cloud-config-server</name>
  14. <description>Demo project for Spring Boot</description>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
  18. <spring-cloud.version>Hoxton.SR2</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-config-server</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. </dependency>
  34. </dependencies>
  35. <dependencyManagement>
  36. <dependencies>
  37. <dependency>
  38. <groupId>org.springframework.cloud</groupId>
  39. <artifactId>spring-cloud-dependencies</artifactId>
  40. <version>${spring-cloud.version}</version>
  41. <type>pom</type>
  42. <scope>import</scope>
  43. </dependency>
  44. </dependencies>
  45. </dependencyManagement>
  46. <build>
  47. <plugins>
  48. <plugin>
  49. <groupId>org.springframework.boot</groupId>
  50. <artifactId>spring-boot-maven-plugin</artifactId>
  51. </plugin>
  52. </plugins>
  53. </build>
  54. </project>

1.2、主类上加注解@EnableConfigServer和eureka的注解@EnableEurekaClient

  1. /** * @EnableConfigServer 开启config服务端的注册 * @author liqi */
  2. @SpringBootApplication
  3. @EnableEurekaClient
  4. @EnableConfigServer
  5. public class ConfigServerApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(ConfigServerApplication.class, args);
  8. }
  9. }

1.3、yaml的配置文件

  1. server:
  2. port: 9500
  3. eureka:
  4. client:
  5. serviceUrl:
  6. defaultZone: http://localhost:8761/eureka/
  7. instance:
  8. instance-id: ${ spring.cloud.client.ip-address}:${ server.port}
  9. prefer-ip-address: true
  10. spring:
  11. application:
  12. name: badger-spring-cloud-config-server
  13. cloud:
  14. config:
  15. server:
  16. git:
  17. uri: https://gitee.com/liqi01/badger-spring-cloud.git
  18. default-label: master

之前的Eureka的配置,就不说了;如果上面的pom文件中,没有加入Eureka,那就不需要配置;

spring-cloud-config的服务端的配置,我们这里主要是使用git的形式,spring.cloud.config.server.git配置,可以详细查看org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentProperties.class配置类,以及父类和父类的抽象类;

  1. @ConfigurationProperties("spring.cloud.config.server.git")
  2. @Validated
  3. @PrivateKeyIsValid
  4. @HostKeyAndAlgoBothExist
  5. @HostKeyAlgoSupported
  6. @KnownHostsFileIsValid
  7. public class MultipleJGitEnvironmentProperties extends JGitEnvironmentProperties {
  8. }

主要使用gitee作为演示的;

1、我使用的公有库,没有权限的,上述的配置,只配置了url;

default-label :表示分支的名称,默认属性就是master,如果是其他的分支,那么填上对应的分支的名称就可以了;

2、如果要使用私有库,并且使用http形式;那么需要配置username以及password 配置样例如下:

  1. spring:
  2. application:
  3. name: badger-spring-cloud-config-server
  4. cloud:
  5. config:
  6. server:
  7. git:
  8. force-pull: true
  9. uri: https://gitee.com/liqi01/badger-spring-cloud.git
  10. default-label: master
  11. username: xxx
  12. password: xxx

**3、如果使用私有库,并且使用SSH;**那么需要配置SSH的私钥;

电脑本机已经有私钥,private-key属性可以不需要配置;如果没有,那么需要把私钥写到配置属性中;

url:配置成SSH形式的;配置样例如下:

  1. spring:
  2. application:
  3. name: badger-spring-cloud-config-server
  4. cloud:
  5. config:
  6. server:
  7. git:
  8. force-pull: true
  9. uri: git@gitee.com:liqi01/badger-spring-cloud.git
  10. default-label: master
  11. private-key: 私钥

2、spring-cloud-config 配置中心server端测试演示

2.1、测试演示

我在https://gitee.com/liqi01/badger-spring-cloud.git这个git地址下,演示的yml的配置文件名称application-dev.yml;文件内容如下:

  1. server:
  2. port: 10001

启动运用;通过url地址访问,得到如下结果

http://localhost:9500/master/application-dev.yml

007S8ZIlgy1ggtyo5hidoj30uu064dgp.jpg

可以看到,能够取到对应的yml文件的内容;

修改git上application-dev.yml文件的端口的值;改成10000后,再继续访问;可以看到端口,也改成了修改后的值;

2.2、配置文件获取规则

具体取文件的规则如下:

  1. /{application}/{profile}[/{label}]
  2. /{application}-{profile}.yml
  3. /{label}/{application}-{profile}.yml
  4. /{application}-{profile}.properties
  5. /{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的包;

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <modelVersion>4.0.0</modelVersion>
  4. <parent>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-starter-parent</artifactId>
  7. <version>2.2.4.RELEASE</version>
  8. <relativePath /> <!-- lookup parent from repository -->
  9. </parent>
  10. <groupId>com.badger</groupId>
  11. <artifactId>badger-spring-cloud-config-client</artifactId>
  12. <version>0.0.1-SNAPSHOT</version>
  13. <name>badger-spring-cloud-config-client</name>
  14. <description>Demo project for Spring Boot</description>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
  18. <spring-cloud.version>Hoxton.SR2</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-config</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.cloud</groupId>
  31. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-test</artifactId>
  36. <scope>test</scope>
  37. </dependency>
  38. </dependencies>
  39. <dependencyManagement>
  40. <dependencies>
  41. <dependency>
  42. <groupId>org.springframework.cloud</groupId>
  43. <artifactId>spring-cloud-dependencies</artifactId>
  44. <version>${spring-cloud.version}</version>
  45. <type>pom</type>
  46. <scope>import</scope>
  47. </dependency>
  48. </dependencies>
  49. </dependencyManagement>
  50. <build>
  51. <plugins>
  52. <plugin>
  53. <groupId>org.springframework.boot</groupId>
  54. <artifactId>spring-boot-maven-plugin</artifactId>
  55. </plugin>
  56. </plugins>
  57. </build>
  58. </project>

3.2、主类上eureka的注解@EnableEurekaClient

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @RestController
  4. public class ConfigClientApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(ConfigClientApplication.class, args);
  7. }
  8. @Value("${server.port}")
  9. String port;
  10. @Value("${spring.cloud.client.ip-address}")
  11. String address;
  12. @GetMapping("/demo")
  13. public String demo() {
  14. return "我的地址是-->" + address + ":" + port;
  15. }
  16. }

3.3、bootstrap.yml配置文件

  1. server:
  2. port: 9501
  3. eureka:
  4. client:
  5. serviceUrl:
  6. defaultZone: http://localhost:8761/eureka/
  7. instance:
  8. instance-id: ${ spring.cloud.client.ip-address}:${ server.port}
  9. prefer-ip-address: true
  10. spring:
  11. application:
  12. name: badger-spring-cloud-config-client
  13. cloud:
  14. config:
  15. label: master
  16. name: application
  17. profile: dev
  18. uri:
  19. - 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,并且已经启动了

007S8ZIlgy1ggu0m2dy9sj30zy06ytad.jpg

直接访问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:

    1. web:
    2. exposure:
    3. include: '*'
  • 重启应用;获取的git的文件的端口是10000;

    @SpringBootApplication
    @EnableEurekaClient
    @RestController
    @RefreshScope
    public class ConfigClientApplication {

    1. public static void main(String[] args) {
    2. SpringApplication.run(ConfigClientApplication.class, args);
    3. }
    4. @Value("${server.port}")
    5. String port;
    6. @Value("${spring.cloud.client.ip-address}")
    7. String address;
    8. @GetMapping("/demo")
    9. public String demo() {
    10. return "我的地址是-->" + address + ":" + port;
    11. }

    }

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请求,调用

  1. curl -X POST "http://localhost:10000/actuator/refresh"

007S8ZIlgy1ggu32991dcj31fg03ojua.jpg

7、再次访问客户端;得到当前的应用的端口(10001端口);

http://localhost:10000/demo

007S8ZIlgy1ggu2dn9ugqj30oo0660th.jpg

可以看到,浏览器的内容,端口已经改变了,变成了10001;说明已经成功了;已经手动把内容更新到最新了;

8、还有问题;

浏览器的内容,是刷新了~但是容器的端口,还是通过10000访问,没有变成10001;查看了下应用的日志;刷新的时候,只是更新了内容,但是容器没有动态发布;所以,端口也没有变化;

也很好理解:springboot 容器启动的时候,先是自动装配一些组件(例如:redis、DataSource、内置Tomcat……);再装配的时候,第一次拉去了配置中心的文件,初始化了一些配置(Tomcat配置的端口),并把整个项目启动成功;如果有修改了配置中心文件的内容,容器没有刷新,那么容器还是原来的容器,只是对应的配置属性在内存里更新了;那么同样的,针对其他的组件(redis连接属性、DataSource连接池等)配置中心更新了IP地址或者认证的密码;客户端,只是会拿到最新的数据,存储在内存里,而不会针对组件生效;还是需要重启服务器,第一次拉取文件的时候,才会生效

9、自动刷新;下一章说吧

具体代码信息,可以查看《码云》

发表评论

表情:
评论列表 (有 0 条评论,268人围观)

还没有评论,来说两句吧...

相关阅读