SpringCloud之配置中心Config(高可用)

墨蓝 2022-01-21 03:35 459阅读 0赞

前言

SpringCloud 是微服务中的翘楚,最佳的落地方案。

Spring Cloud Config 是一个解决分布式系统的配置管理方案,它包含了 server 和 client 两个部分。

server 用来获取远程的配置信息(默认为 Git 仓库),并且以接口的形式提供出去;

client 根据 server 提供的接口读取配置文件,以便于初始化自己的应用。

如果配置中心出现了问题,将导致灾难性的后果,因此在生产环境下配置中心都会做集群,来保证高可用。

此处配置高可用实际就是把多个配置中心(指定同一个 Git 远程仓库)注册到注册中心。

源码

GitHub地址:https://github.com/intomylife/SpringCloud

环境

  • JDK 1.8.0 +
  • Maven 3.0 +
  • SpringBoot 2.0.3
  • SpringCloud Finchley.RELEASE

开发工具

  • IntelliJ IDEA

正文

commons 工程

commons 工程 - POM 文件

  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"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <!-- 三坐标 -->
  6. <groupId>com.zwc</groupId>
  7. <artifactId>springcloud-config-eureka-commons</artifactId>
  8. <version>1.0</version>
  9. <!-- 工程名称和描述 -->
  10. <name>springcloud-config-eureka-commons</name>
  11. <description>公用工程</description>
  12. <!-- 打包方式 -->
  13. <packaging>jar</packaging>
  14. <!-- 在 properties下声明相应的版本信息,然后在dependency下引用的时候用 ${} 就可以引入该版本jar包了 -->
  15. <properties>
  16. <!-- 编码 -->
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <!-- jdk -->
  19. <java.version>1.8</java.version>
  20. <!-- SpringBoot -->
  21. <platform-bom.version>Cairo-SR3</platform-bom.version>
  22. <!-- SpringCloud -->
  23. <spring-cloud-dependencies.version>Finchley.RELEASE</spring-cloud-dependencies.version>
  24. </properties>
  25. <!-- 加入依赖 -->
  26. <dependencies>
  27. </dependencies>
  28. <!-- 依赖 jar 包版本管理的管理器 -->
  29. <!-- 如果 dependencies 里的 dependency 自己没有声明 version 元素,那么 maven 就此处来找版本声明。 -->
  30. <!-- 如果有,就会继承它;如果没有就会报错,告诉你没有版本信息 -->
  31. <!-- 优先级:如果 dependencies 里的 dependency 已经声明了版本信息,就不会生效此处的版本信息了 -->
  32. <dependencyManagement>
  33. <dependencies>
  34. <!-- SpringBoot -->
  35. <dependency>
  36. <groupId>io.spring.platform</groupId>
  37. <artifactId>platform-bom</artifactId>
  38. <version>${platform-bom.version}</version>
  39. <type>pom</type>
  40. <scope>import</scope>
  41. </dependency>
  42. <!-- SpringCloud -->
  43. <dependency>
  44. <groupId>org.springframework.cloud</groupId>
  45. <artifactId>spring-cloud-dependencies</artifactId>
  46. <version>${spring-cloud-dependencies.version}</version>
  47. <type>pom</type>
  48. <scope>import</scope>
  49. </dependency>
  50. </dependencies>
  51. </dependencyManagement>
  52. <!-- 插件依赖 -->
  53. <build>
  54. <plugins>
  55. <plugin>
  56. <groupId>org.springframework.boot</groupId>
  57. <artifactId>spring-boot-maven-plugin</artifactId>
  58. </plugin>
  59. </plugins>
  60. </build>
  61. </project>
  • 配置一些共用依赖

commons 工程 - 项目结构

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDAyMjAw_size_16_color_FFFFFF_t_70

配置文件

创建一个 Git 库,里面存放配置文件,文件夹名称为:config-repo;这里模拟不同的环境,所以分别构建了

dev(开发)、uat(测试)以及 online(线上)三种不同的配置文件;此文件夹存在此项目的根目录中

  1. - springcloud-config-eureka
  2. - config-repo
  3. - system-dev.properties
  4. - system-online.properties
  5. - system-uat.properties
  6. + springcloud-config-eureka-commons
  7. + springcloud-config-eureka-service

service 工程

① 此工程下有四个模块:一个注册中心,二个 server 以及一个 client

② 二个 server 除端口不一致以外,其他代码基本一致

registry-service(注册中心)

registry-service - POM 文件

  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"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <!-- 继承父 -->
  6. <parent>
  7. <groupId>com.zwc</groupId>
  8. <artifactId>springcloud-config-eureka-service</artifactId>
  9. <version>1.0</version>
  10. </parent>
  11. <!-- 三坐标 -->
  12. <groupId>com.zwc</groupId>
  13. <artifactId>springcloud-config-eureka-registry-service</artifactId>
  14. <version>1.0</version>
  15. <!-- 工程名称描述 -->
  16. <name>springcloud-config-eureka-registry-service</name>
  17. <description>注册中心</description>
  18. <!-- 打包方式 -->
  19. <packaging>jar</packaging>
  20. <!-- 在 properties下声明相应的版本信息,然后在dependency下引用的时候用 ${} 就可以引入该版本jar包了 -->
  21. <properties>
  22. </properties>
  23. <!-- 加入依赖 -->
  24. <dependencies>
  25. <!-- commons工程 依赖 -->
  26. <dependency>
  27. <groupId>com.zwc</groupId>
  28. <artifactId>springcloud-config-eureka-commons</artifactId>
  29. <version>1.0</version>
  30. </dependency>
  31. <!-- 服务注册中心 -->
  32. <dependency>
  33. <groupId>org.springframework.cloud</groupId>
  34. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  35. </dependency>
  36. </dependencies>
  37. <!-- 插件依赖 -->
  38. <build>
  39. <plugins>
  40. <plugin>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-maven-plugin</artifactId>
  43. </plugin>
  44. </plugins>
  45. </build>
  46. </project>
  • 主要加入 spring-cloud-starter-netflix-eureka-server 依赖

registry-service - application.yml 配置文件

  1. # 端口
  2. server:
  3. port: 8761
  4. # 应用名称
  5. spring:
  6. application:
  7. name: eureka-server
  8. eureka:
  9. instance:
  10. # 使用 ip 代替实例名
  11. prefer-ip-address: true
  12. # 实例的主机名
  13. hostname: ${spring.cloud.client.ip-address}
  14. # 实例的 ID 规则
  15. instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
  16. client:
  17. # 是否向注册中心注册自己
  18. registerWithEureka: false
  19. # 是否向注册中心获取注册信息
  20. fetchRegistry: false
  21. serviceUrl:
  22. # 注册中心地址
  23. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  • 这里使用了默认的 8761 端口,当然也可以更改,不过在发现调用服务端的注册中心地址端口要与它一致

registry-service - 启动类

  1. package com.zwc;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. @SpringBootApplication
  6. @EnableEurekaServer
  7. public class SpringcloudConfigEurekaRegistryServiceApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(SpringcloudConfigEurekaRegistryServiceApplication.class, args);
  10. }
  11. }
  • 在启动类中添加 @EnableEurekaServer 注解表示此工程是注册中心

registry-server - 启动项目

  1. 项目启动成功后访问 http://localhost:8761/ 即可看到 eureka-server 主页面

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDAyMjAw_size_16_color_FFFFFF_t_70 1

server(获取远程的配置信息)

server - POM 文件

注:一共有两个 server,但是除端口以外的代码基本上一致,所有这里就列举其中一个

  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"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <!-- 继承父 -->
  6. <parent>
  7. <groupId>com.zwc</groupId>
  8. <artifactId>springcloud-config-eureka-service</artifactId>
  9. <version>1.0</version>
  10. </parent>
  11. <!-- 三坐标 -->
  12. <groupId>com.zwc</groupId>
  13. <artifactId>springcloud-config-eureka-serverfirst-service</artifactId>
  14. <version>1.0</version>
  15. <!-- 工程名称描述 -->
  16. <name>springcloud-config-eureka-serverfirst-service</name>
  17. <description>config server</description>
  18. <!-- 打包方式 -->
  19. <packaging>jar</packaging>
  20. <!-- 在 properties下声明相应的版本信息,然后在dependency下引用的时候用 ${} 就可以引入该版本jar包了 -->
  21. <properties>
  22. </properties>
  23. <!-- 加入依赖 -->
  24. <dependencies>
  25. <!-- commons工程 依赖 -->
  26. <dependency>
  27. <groupId>com.zwc</groupId>
  28. <artifactId>springcloud-config-eureka-commons</artifactId>
  29. <version>1.0</version>
  30. </dependency>
  31. <!-- config server 依赖 -->
  32. <dependency>
  33. <groupId>org.springframework.cloud</groupId>
  34. <artifactId>spring-cloud-config-server</artifactId>
  35. </dependency>
  36. <!-- 提供者消费者 -->
  37. <dependency>
  38. <groupId>org.springframework.cloud</groupId>
  39. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  40. </dependency>
  41. </dependencies>
  42. <!-- 插件依赖 -->
  43. <build>
  44. <plugins>
  45. <plugin>
  46. <groupId>org.springframework.boot</groupId>
  47. <artifactId>spring-boot-maven-plugin</artifactId>
  48. </plugin>
  49. </plugins>
  50. </build>
  51. </project>
  • 加入 spring-cloud-config-server 依赖:config server
  • 加入 spring-cloud-starter-netflix-eureka-client 依赖:提供和注册服务

server - application.yml 配置文件

  1. # 端口
  2. server:
  3. port: 8000
  4. spring:
  5. application:
  6. # 应用名称
  7. name: config-eureka-server
  8. cloud:
  9. config:
  10. server:
  11. git:
  12. # 仓库地址
  13. uri: https://github.com/intomylife/SpringCloud
  14. # 对应 {label} 部分,即 Git 的分支
  15. label: master
  16. # 仓库文件夹名称,多个以逗号分隔
  17. search-paths: springcloud-config-eureka/config-repo
  18. # git 仓库用户名(公开库可以不用填写)
  19. username:
  20. # git 仓库密码(公开库可以不用填写)
  21. password:
  22. eureka:
  23. instance:
  24. # 使用 ip 代替实例名
  25. prefer-ip-address: true
  26. # 实例的主机名
  27. hostname: ${spring.cloud.client.ip-address}
  28. # 实例的 ID 规则
  29. instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
  30. client:
  31. serviceUrl:
  32. # 注册中心地址
  33. defaultZone: http://${eureka.instance.hostname}:8761/eureka/
  • 注意这里 uri 只能写到仓库名
  • 如果配置文件在仓库中多层目录下,那么 search-paths 就从根目录开始写起
  • 注意此处配置注册中心地址的端口为 8761 也就是上面注册中心工程配置的端口

server - 启动类

  1. package com.zwc;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.config.server.EnableConfigServer;
  5. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  6. @SpringBootApplication
  7. @EnableConfigServer
  8. @EnableEurekaClient
  9. public class SpringcloudConfigEurekaServerfirstServiceApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(SpringcloudConfigEurekaServerfirstServiceApplication.class, args);
  12. }
  13. }
  • 添加 @EnableConfigServer 注解表示开启配置中心
  • 添加 @EnableEurekaClient 注解表示此工程可以向注册中心提供服务

server - 启动项目

  1. 项目启动成功后访问:http://localhost:8761/(注册中心)可以看到服务已经被注册进来了

20190608000311638.png

  1. 访问地址:http://localhost:8000/config-repo/dev(获取完整配置信息)

  2. 输出内容:

    {
    “name”:”config-repo”,
    “profiles”:[

    1. "dev"

    ],
    “label”:null,
    “version”:”0d6480b5ba6f7f2be87b3130de8163dcb0af9f5f”,
    “state”:null,
    “propertySources”:[

    ]
    }

  3. 访问地址:http://localhost:8000/system/dev(获取完整配置信息)

  4. 输出内容:

    {
    “name”:”system”,
    “profiles”:[

    1. "dev"

    ],
    “label”:null,
    “version”:”0d6480b5ba6f7f2be87b3130de8163dcb0af9f5f”,
    “state”:null,
    “propertySources”:[

    1. {
    2. "name":"https://github.com/intomylife/SpringCloud/springcloud-config-eureka/config-repo/system-dev.properties",
    3. "source":{
    4. "hello":"I'm dev."
    5. }
    6. }

    ]
    }

  5. 访问地址:http://localhost:8000/system-dev.properties(获取指定配置文件内容)

  6. 输出内容:’hello: I’m dev.’

  7. 启动另一个 server(springcloud-config-eureka-serversecond-service)

  8. 项目启动成功后访问:http://localhost:8761/(注册中心)可以看到服务已经被注册进来了

20190608001357600.png

  1. 访问地址:http://localhost:8001/config-repo/uat(获取完整配置信息)

  2. 输出内容:

    {
    “name”:”config-repo”,
    “profiles”:[

    1. "uat"

    ],
    “label”:null,
    “version”:”0d6480b5ba6f7f2be87b3130de8163dcb0af9f5f”,
    “state”:null,
    “propertySources”:[

    ]
    }

  3. 访问地址:http://localhost:8001/system/uat(获取完整配置信息)

  4. 输出内容:

    {
    “name”:”system”,
    “profiles”:[

    1. "uat"

    ],
    “label”:null,
    “version”:”0d6480b5ba6f7f2be87b3130de8163dcb0af9f5f”,
    “state”:null,
    “propertySources”:[

    1. {
    2. "name":"https://github.com/intomylife/SpringCloud/springcloud-config-eureka/config-repo/system-uat.properties",
    3. "source":{
    4. "hello":"I'm uat."
    5. }
    6. }

    ]
    }

  5. 访问地址:http://localhost:8001/system-uat.properties(获取指定配置文件内容)

  6. 输出内容:’hello: I’m uat.’

  7. 证明两个 server 都已经成功从远程仓库中获取到了配置信息

注:接口访问有如下规则:

  1. /{application}/{profile}[/{label}]
  2. /{application}-{profile}.yml
  3. /{label}/{application}-{profile}.yml
  4. /{application}-{profile}.properties
  5. /{label}/{application}-{profile}.properties

client(读取注册中心的 server 中的配置信息)

client - POM 文件

  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"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <!-- 继承父 -->
  6. <parent>
  7. <groupId>com.zwc</groupId>
  8. <artifactId>springcloud-config-eureka-service</artifactId>
  9. <version>1.0</version>
  10. </parent>
  11. <!-- 三坐标 -->
  12. <groupId>com.zwc</groupId>
  13. <artifactId>springcloud-config-eureka-client-service</artifactId>
  14. <version>1.0</version>
  15. <!-- 工程名称描述 -->
  16. <name>springcloud-config-eureka-client-service</name>
  17. <description>config client</description>
  18. <!-- 打包方式 -->
  19. <packaging>jar</packaging>
  20. <!-- 在 properties下声明相应的版本信息,然后在dependency下引用的时候用 ${} 就可以引入该版本jar包了 -->
  21. <properties>
  22. </properties>
  23. <!-- 加入依赖 -->
  24. <dependencies>
  25. <!-- commons工程 依赖 -->
  26. <dependency>
  27. <groupId>com.zwc</groupId>
  28. <artifactId>springcloud-config-eureka-commons</artifactId>
  29. <version>1.0</version>
  30. </dependency>
  31. <!-- config 依赖 -->
  32. <dependency>
  33. <groupId>org.springframework.cloud</groupId>
  34. <artifactId>spring-cloud-starter-config</artifactId>
  35. </dependency>
  36. <!-- 提供者消费者 -->
  37. <dependency>
  38. <groupId>org.springframework.cloud</groupId>
  39. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  40. </dependency>
  41. </dependencies>
  42. <!-- 插件依赖 -->
  43. <build>
  44. <plugins>
  45. <plugin>
  46. <groupId>org.springframework.boot</groupId>
  47. <artifactId>spring-boot-maven-plugin</artifactId>
  48. </plugin>
  49. </plugins>
  50. </build>
  51. </project>
  • 加入 spring-cloud-starter-config 依赖:config client
  • 加入 spring-cloud-starter-netflix-eureka-client 依赖:提供和注册服务

client - application.yml 配置文件

  1. # 端口
  2. server:
  3. port: 8002
  4. spring:
  5. application:
  6. # 应用名称
  7. name: config-eureka-client

client - bootstrap.yml 配置文件(注意)

  1. spring:
  2. cloud:
  3. config:
  4. # 对应 {label} 部分,即 Git 的分支
  5. label: master
  6. # 对应 {application} 部分
  7. name: system
  8. # 对应 {profile} 部分
  9. profile: dev
  10. discovery:
  11. # 开启 Config 服务发现与注册
  12. enabled: true
  13. # 指定 server
  14. service-id: config-eureka-server
  15. eureka:
  16. instance:
  17. # 使用 ip 代替实例名
  18. prefer-ip-address: true
  19. # 实例的主机名
  20. hostname: ${spring.cloud.client.ip-address}
  21. # 实例的 ID 规则
  22. instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
  23. client:
  24. serviceUrl:
  25. # 注册中心地址
  26. defaultZone: http://${eureka.instance.hostname}:8761/eureka/
  • bootstrap.yml 配置文件加载先于 application.yml 配置文件
  • 与 Spring Cloud Config 相关的属性必须配置在 bootstrap.yml 中
  • 这里就不是直接指定 server 地址了,而是 server 的应用名(spring.application.name)
  • 从注册中心的 server 中读取 dev(开发)环境的配置文件信息
  • 注意此处配置注册中心地址的端口为 8761 也就是上面注册中心工程配置的端口

client - controller 前端控制器

  1. package com.zwc.client.controller;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. /**
  6. * @ClassName HelloController
  7. * @Desc TODO 读取 git 配置文件
  8. * @Date 2019/6/2 16:54
  9. * @Version 1.0
  10. */
  11. @RestController
  12. public class HelloController {
  13. @Value("${hello}")
  14. private String hello;
  15. /*
  16. * @ClassName HelloController
  17. * @Desc TODO 读取 git 配置文件
  18. * @Date 2019/6/2 16:56
  19. * @Version 1.0
  20. */
  21. @RequestMapping("/hello")
  22. public String hello() {
  23. return this.hello;
  24. }
  25. }
  • 直接使用 @Value 注解就可以从注册中心的 server 中读取到对应的配置信息

client - 启动类

  1. package com.zwc;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  5. @SpringBootApplication
  6. @EnableEurekaClient
  7. public class SpringcloudConfigEurekaClientServiceApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(SpringcloudConfigEurekaClientServiceApplication.class, args);
  10. }
  11. }
  • 添加 @EnableEurekaClient 注解表示此工程可以向注册中心提供服务

client - 启动项目

  1. 项目启动成功后访问:http://localhost:8761/(注册中心)可以看到服务已经被注册进来了

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDAyMjAw_size_16_color_FFFFFF_t_70 2

  1. 访问地址:http://localhost:8002/hello

  2. 输出内容:’I’m dev.’

  3. 证明 client 已经成功从注册中心的 server 中读取到了配置信息

  4. 此时当 client 已经启动完毕后,配置文件就已经全部读取到了,所以即使停止其中一个 server 或者停止

    全部 server,client 依然可以读取到配置文件。此处高可用应该是指在 client 启动时能保证有 server 可

service 工程 - 项目结构

20190608002713608.png

把多工程项目使用 IntelliJ IDEA 打开

  1. 把项目从 GitHub 中下载到你的本地
  2. 打开 IntelliJ IDEA
  3. 点击 File -> Open
  4. 打开你下载到本地的项目目录
  5. springcloud-config-eureka -> springcloud-config-eureka-service(选择打开此工程)
  6. 打开 service 工程后
  7. 再次点击 File -> Project Structrue
  8. 选择 Modules,点击 ‘+’ 符号
  9. 点击 Import Module
  10. 还是打开你下载到本地的项目目录
  11. springcloud-config-eureka -> springcloud-config-eureka-commons -> pom.xml
  12. 点击 OK
  13. 点击 Next,Finish
  14. 点击 Apply,OK

希望能够帮助到你

over

发表评论

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

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

相关阅读