SpringCloud Config

英语好的可以看官方文档:Spring Cloud Config

中文版:Spring Cloud Config


SpringCloud-config必须用git或者svn来获取配置并不友好,但是基本能满足绝大部分场景。


讲解Zookeeper的时候其实实现过分布式的配置中心,springcloudconfig的核心作用其实就是在于对配置进行管理


虽然springcloud使用springboot进行开发,节省了大量的配置文件,但每个服务依然有自己的application.yml配置文件,而且每个服务一般都有负载均衡,所以,这么依赖对于配置文件的统一管理就非常有必要了。





上图是springcloudconfig总体结构图。

左边这一块我们很熟悉,最开始有个eureka,它通过配置文件application.yml启动,在这个配置文件里面会指定端口,实例名,注册地址等


对于服务提供商来说,它也需要把相关信息写到application.yml文件中,比如数据库配置,端口,项目名称等,其中最重要的就就是要指定eureka的具体位置


这是前面反复说过的,但现在是基于cloudConfig的配置中心,最开始启动eureka的时候,eureka的具体配置就不是写死在eureka的application.yml文件中了,这个时候也会有application.yml(bootstrap.yml)配置文件,只是这里的配置指定的时候config的配置中心,在eureka启动的时候读取【配置中心】的配置,并启动


对于服务提供商也是同样的道理,以产品服务为例,它的application.yml文件也不在指定具体的配置,真实需要访问的数据库,端口等信息也是在启动的时候直接从【配置中心】读取。


所以说config配置中心在其中占据非常重要的位置,但config里面的配置从哪来呢?其实是从git服务器里面来的,开发者需要把相关的配置上传到git服务器,这里的git服务器可以自己搭建,也可以直接用github,后面项目为了方便就直接使用github了。


1.1. 准备github账号

  https://github.com/  注册就不说了





获得git的地址



输入用户名密码:把新建的仓库信息下载倒本地


这在里我放倒了f盘的config目录中。


1.2. 配置中心搭建

有了git服务器之后,接下来就要准备配置中心了


【microcloud-config】 新建一个配置中心的服务提供模块,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">

    <parent>

        <artifactId>springcloud</artifactId>

        <groupId>enjoy</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>


    <artifactId>microcloud-config</artifactId>


    <dependencies>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-config-server</artifactId>

        </dependency>

        <dependency>

            <groupId>enjoy</groupId>

            <artifactId>microcloud-security</artifactId>

        </dependency>

    </dependencies>


</project>


引入springcloudserver的同时,这分布式配置中心也不是谁都能访问的,所以增加了安全验证模块。

应该还记得这时候的用户名密码为:admin/enjoy



【microcloud-config】 新增application.yml配置文件,增加git连接配置信息

server:

  port: 7101


spring:

  application:

    name: microcloud-config

  cloud:

    config:

      server:

        git:

          uri: https://github.com/enjoyeud/microconfig.git


【microcloud-config】 新增启动类

package cn.enjoy;


import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.config.server.EnableConfigServer;


@SpringBootApplication

@EnableConfigServer

public class ConfigApp {

    public static void main(String[] args) {

        SpringApplication.run(ConfigApp.class,args);

    }

}



这些工作准备完成后,为了测试【microcloud-config】是能正确运行的,还需要上传个配置文件到github

【GITHUB】 上传一个application.yml

spring:

   profiles:

      active:

      - dev

---

spring:

  profiles: dev

  application:

      name: microconfig-test-dev

---

spring:

 profiles: default

 application:

      name: microconfig-test-default





准备好配置文件后启动【microcloud-config】

访问形式访问路径

1/{application}-{profile}.ym

lhttp://localhost:7101/application-dev.yml

http://localhost:7101/application-default.yml

http://localhost:7101/application-beta.yml 

2/{application}/{profile}[/{label}]

http://localhost:7101/application/dev/master

http://localhost:7101/application/default/master

3/{label}/{application}-{profile}.yml

http://localhost:7101/master/application-default.yml

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


1.3. 简单的客户端

 现在已经成功的搭建好了配置中心,但这个时候如果只通过url的访问形式其实没什么太多的意义,最终还是需要把github相关信息加载到客户端上进行访问

 新增加一个【microcloud-config-client】模块,这模块讲读取github里面的信息,也不做其他的事情,只是显示一下。


新建【microcloud-config-client】,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">

    <parent>

        <artifactId>springcloud</artifactId>

        <groupId>enjoy</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>


    <artifactId>microcloud-config-client</artifactId>

    <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>

    </dependencies>

</project>


【github】上传一个新的配置文件microcloud-config-client.yml,后面就通过程序来读取这个配置

spring:

   profiles:

      active:

        - dev

---

server:

  port: 8201


spring:

  profiles: dev

  application:

      name: microconfig-test-client


eureka:

 client:

  service-url:

    defaultZone: http://admin:enjoy@localhost:7001/eureka

---

server:

  port: 8102


spring:

  profiles: beta

  application:

      name: microconfig-test-client


eureka:

 client:

  service-url:

    defaultZone: http://admin:enjoy@localhost:7001/eureka






【microcloud-config-client】新建bootstrap.yml文件,这文件读取配置中心的配置

spring:

 cloud:

  config:

    name: microcloud-config-client # 定义要读取的资源文件的名称

    profile: dev # 定义profile的 名称

    label: master # 定义配置文件所在的分支

    uri: http://localhost:7101 # SpringCloudConfig的服务地址

    username: admin # 连接的用户名

    password: enjoy # 连接的密码


可能有些人奇怪,为什么不直接把相关信息写道application.yml文件之中,其实这是一种规范

l“application.yml”:对应的是用户级的资源配置项;

l“bootstrap.yml”:对应的是系统级的资源配置,其优先级更高


【microcloud-config-client】新建application.yml文件,这文件只是简单的配置一个应用名称

spring:

 application:

  name: microcloud-config-client # 编写应用的名称


【microcloud-config-client】新建一个controller,这个controller显示从服务器下载到的配置文件

package cn.enjoy.controller;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;


@RestController

public class ConfigClientController {

    @Value("${spring.application.name}")

    private String applicationName;

    @Value("${eureka.client.serviceUrl.defaultZone}")

    private String eurekaServers;

    @RequestMapping("/config")

    public String getConfig() {

        return "ApplicationName = " + this.applicationName + "、EurekaServers = "

                + this.eurekaServers;

    }

}


【microcloud-config-client】 新建一个启动类

package cn.enjoy;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication

public class ConfigClientApp {

    public static void main(String[] args) {

        SpringApplication.run(ConfigClientApp.class,args);

    }

}



启动配置中心,访问,确认配置通过url是能正常访问的。

http://localhost:7101/microcloud-config-client-beta.yml


启动【microcloud-config-client】发现tomcat启动了,占用的端口就是dev的8201,访问

http://localhost:8201/config

这个时候简单的客户端已经搭建完成。


1.4. Eureka与服务提供商读取配置


有了上面这些基础,接下来就可以完成这个图的功能了,这里依然简化一下,只考虑product产品服务与eureka


eureka与product服务的配置信息要求去配置中心获取,所以在正式部署项目之前,先准备两个配置,上传到github之中


microcloud-config-eureka-client.yml,这个是eureka的配置文件,这里就没有考虑eureka的高可用了

spring:

  profiles:

    active:

      - dev

---

server:

 port: 7001

eureka:

  server:

    eviction-interval-timer-in-ms: 1000   #设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)

    enable-self-preservation: false #设置为false表示关闭保护模式

  client:

    fetch-registry: false

    register-with-eureka: false

    service-url:

        defaultZone: http://admin:enjoy@localhost:7001/eureka

  instance: # eureak实例定义

    hostname: localhost # 定义 Eureka 实例所在的主机名称

spring:

  profiles: dev

  security:

    user:

      name: admin

      password: enjoy

  application:

    name: microcloud-config-eureka-client

---

server:

 port: 7002

eureka:

  server:

    eviction-interval-timer-in-ms: 1000   #设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)

    enable-self-preservation: false #设置为false表示关闭保护模式

  client:

    fetch-registry: false

    register-with-eureka: false

    service-url:

        defaultZone: http://admin:enjoy@localhost:7002/eureka

  instance: # eureak实例定义

    hostname: localhost # 定义 Eureka 实例所在的主机名称

spring:

  profiles: beta

  security:

    user:

      name: admin

      password: enjoy

  application:

    name: microcloud-config-eureka-client


microcloud-config-product-client.yml,这个事对于产品服务这个服务提供商提供者的配置文件

spring:

  profiles:

    active:

      - dev

---

server:

 port: 8080

mybatis:

 mapper-locations: # 所有的mapper映射文件

 - classpath:mapping/*.xml

spring:

 datasource:

   type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型

   driver-class-name: com.mysql.jdbc.Driver # 配置MySQL的驱动程序类

   url: jdbc:mysql://localhost:3306/springcloud?serverTimezone=GMT%2B8 # 数据库连接地址

   username: root # 数据库用户名

   password: root1234% # 数据库连接密码

 application:

   name: microcloud-config-product-client

 profiles: dev


logging:

  level:

    cn.enjoy.mapper: debug


eureka:

  client: # 客户端进行Eureka注册的配置

    service-url:

      defaultZone: http://admin:enjoy@localhost:7001/eureka

  instance:

    instance-id: microcloud-config-product-client

    prefer-ip-address: true

    lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)

    lease-expiration-duration-in-seconds: 5  # 如果现在超过了5秒的间隔(默认是90秒)


info:

  app.name: microcloud-provider-product

  company.name: enjoy

  build.artifactId: $project.artifactId$

  build.modelVersion: $project.modelVersion$


management:

  endpoints:

    web:

      exposure:

        include: '*'



---

server:

 port: 8081

mybatis:

 mapper-locations: # 所有的mapper映射文件

 - classpath:mapping/*.xml

spring:

 datasource:

   type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型

   driver-class-name: com.mysql.jdbc.Driver # 配置MySQL的驱动程序类

   url: jdbc:mysql://localhost:3306/springcloud?serverTimezone=GMT%2B8 # 数据库连接地址

   username: root # 数据库用户名

   password: root1234% # 数据库连接密码

 application:

   name: microcloud-config-product-client

 profiles: beta


logging:

  level:

    cn.enjoy.mapper: debug


eureka:

  client: # 客户端进行Eureka注册的配置

    service-url:

      defaultZone: http://admin:enjoy@localhost:7002/eureka

  instance:

    instance-id: microcloud-config-product-client

    prefer-ip-address: true

    lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)

    lease-expiration-duration-in-seconds: 5  # 如果现在超过了5秒的间隔(默认是90秒)


info:

  app.name: microcloud-config-product-client

  company.name: enjoy

  build.artifactId: $project.artifactId$

  build.modelVersion: $project.modelVersion$


management:

  endpoints:

    web:

      exposure:

        include: '*'


有了这两个配置文件,接下来就可以搭建eureka服务和product服务了


1.4.1. eureka配置

复制【microcloud-eureka】一份,修改成为【microcloud-config-eureka-client】,


【microcloud-config-eureka-client】 修改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">

    <parent>

        <artifactId>springcloud</artifactId>

        <groupId>enjoy</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>


    <artifactId>microcloud-config-eureka-client</artifactId>


    <properties>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    </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-netflix-eureka-server</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-security</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-config</artifactId>

        </dependency>

    </dependencies>


</project>


【microcloud-config-eureka-client】创建bootstrap.yml文件,读取配置中心eureka的配置

spring:

  cloud:

     config:

       uri:  http://localhost:7101

       name: microcloud-config-eureka-client

       profile:  beta

       label:  master

       username: admin

       password: enjoy


【microcloud-config-eureka-client】 修改application.yml,删除不需要的配置

spring:

  application:

    name: microcloud-config-eureka-client


由于使用的是beta,它里面指定的eureka的端口是7002

重启后访问:localhost:7002


1.4.2. product服务配置

复制【microcloud-provider-product】项目为【microcloud-config-product-client】


【microcloud-config-product-client】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">

    <parent>

        <artifactId>springcloud</artifactId>

        <groupId>enjoy</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>

    <version>1.0.0</version>



    <artifactId>microcloud-config-product-client</artifactId>

    <dependencies>

        <dependency>

            <groupId>enjoy</groupId>

            <artifactId>microcloud-api</artifactId>

        </dependency>

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

        </dependency>

        <dependency>

            <groupId>com.alibaba</groupId>

            <artifactId>druid</artifactId>

        </dependency>

        <dependency>

            <groupId>org.mybatis.spring.boot</groupId>

            <artifactId>mybatis-spring-boot-starter</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-jetty</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-devtools</artifactId>

        </dependency>


        <!--<dependency>-->

            <!--<groupId>org.springframework.boot</groupId>-->

            <!--<artifactId>spring-boot-starter-security</artifactId>-->

        <!--</dependency>-->

        <dependency>

            <groupId>enjoy</groupId>

            <artifactId>microcloud-security</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-actuator</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-config</artifactId>

        </dependency>


    </dependencies>


</project>


【microcloud-config-product-client】新增bootstrap.yml 文件,配置如下

spring:

  cloud:

    config:

      uri:  http://localhost:7101

      name: microcloud-config-product-client

      profile:  beta

      label:  master

      username: admin

      password: enjoy


【microcloud-config-product-client】 修改application.yml文件

spring:

 application:

    name: microcloud-config-product-client


启动product服务,访问eureka,现在产品服务已经添加上去了。



1.5. Config配置中心高可用

现在不管是erueka还是服务提供者都是基于SpringCloudConfig获取配置文件的,这个时候配置中心就至关重要了,但在真实的项目环境中,难免SpringCloudConfig会出现各种问题,这个时候就需要考虑config的高可用机制了。


其实解决方式也很简单,把SpringCloudConfig注册到Eureka就搞定了,这个时候用户访问的时候不是直接从配置中心获取配置,而是通过eureka中获取配置中心的地址,再从配置中心获取具体服务的参数就行。



复制【microcloud-eureka】一份,修改成为【microcloud-ha-config-eureka】,这个eureka不注册具体的业务服务,只是负责config配置中心的负载均衡使用


【microcloud-ha-config-eureka】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">

    <parent>

        <artifactId>springcloud</artifactId>

        <groupId>enjoy</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>microcloud-ha-config-eureka</artifactId>

    <properties>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    </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-netflix-eureka-server</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-security</artifactId>

        </dependency>

    </dependencies>


</project>


【microcloud-ha-config-eureka】 修改application.yml文件

server:

 port: 7301

eureka:

  server:

    eviction-interval-timer-in-ms: 1000   #设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)

    enable-self-preservation: false #设置为false表示关闭保护模式

  client:

    fetch-registry: false

    register-with-eureka: false

    service-url:

        defaultZone: http://admin:enjoy@localhost:7301/eureka

  instance: # eureak实例定义

    hostname: localhost # 定义 Eureka 实例所在的主机名称

spring:

  security:

    user:

      name: admin

      password: enjoy

  application:

    name: microcloud-ha-config-eureka


启动类如下

package cn.enjoy;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;


@SpringBootApplication

@EnableEurekaServer

public class HaConfigEurekaApp {

    public static void main(String[] args) {

        SpringApplication.run(HaConfigEurekaApp.class,args);

    }

}



【microcloud-config】再复制两份,总共3个配置中心,分别为【microcloud-config2】【microcloud-config3】


【microcloud-config】【microcloud-config2】【microcloud-config3】 修改pom文件

增加eureka的支持

 <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

        </dependency>


【microcloud-config】【microcloud-config2】【microcloud-config3】修改application.yml文件,增加eureka的注册地址

server:

  port: 7101


spring:

  application:

    name: microcloud-config

  cloud:

    config:

      server:

        git:

          uri: https://github.com/enjoyeud/microconfig.git


eureka:

 client:

  service-url:

    defaultZone: http://admin:enjoy@localhost:7301/eureka

 instance:

  prefer-ip-address: true # 在地址栏上使用IP地址进行显示

  instance-id: microcloud-config1



启动eureka并启动三个配置中心后



【microcloud-config-client】 修改pom文件,增加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 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>

        <artifactId>springcloud</artifactId>

        <groupId>enjoy</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>microcloud-config-client</artifactId>

    <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>

    </dependencies>

</project>


【microcloud-config-client】 修改bootstrap.yml文件,增加eureka相关配置

spring:

 cloud:

  config:

    name: microcloud-config-client # 定义要读取的资源文件的名称

    profile: dev # 定义profile的 名称

    label: master # 定义配置文件所在的分支

    #uri: http://localhost:7101 # SpringCloudConfig的服务地址

    username: admin # 连接的用户名

password: enjoy # 连接的密码

discovery:

      enabled: true   # 通过配置中心加载配置文件

      service-id: MICROCLOUD-CONFIG   # 在eureka之中注册的服务ID


eureka:

 client:

  service-url:

    defaultZone: http://admin:enjoy@localhost:7301/eureka


访问:http://localhost:8201/config



1.6. 自动刷新

 在整个SpringCloudConfig设计之中,我们已经实现了配置的统一管理,但其实还有一个问题,就是自动刷新。

  尝试修改一下【github】 microcloud-config-client.yml文件

spring:

   profiles:

      active:

        - dev

---

server:

  port: 8201


spring:

  profiles: dev

  application:

      name: microconfig-test-client2


eureka:

 client:

  service-url:

    defaultZone: http://admin:enjoy@localhost:7001/eureka

---

server:

  port: 8102


spring:

  profiles: beta

  application:

      name: microconfig-test-client2


eureka:

 client:

  service-url:

    defaultZone: http://admin:enjoy@localhost:7001/eureka



这里的修改非常简单,只是修改了下应用名称,提交后

访问:http://localhost:8201/config


发现配置并没有修改,一直要重启【microcloud-config-client】后才会发现配置已经修改成功,其实这对大多数应用没有什么问题,如果你定时要关注这个小问题也是有办法处理的,在springcloud里面可以借助消息总线SpringCloudBus解决这问题。


ESB(企业服务总线)在一开始讲springcloud的时候就讲过,在springcloud中就是使用springcloudbus解决这问题的


基于总线的设计其实是借鉴了硬件的思想,编写的一个程序都需要用到CPU,内存,硬盘等资源,每一个硬件资源的接口都不同,所以需要借助驱动程序,这个驱动程序就类似于设计模式里面的适配器模式。通过这种设计,举例来说,在程序运行中可能需要用到CPU的资源,但由于不同的CPU通过驱动程序已经对硬件完全兼容了。


虽然这样一来CPU,内存,硬盘对系统是可以识别了,但这些硬件资源一般都不是由程序自己去访问,而是由系统的内核来处理,由操作系统来统一调度各种硬件资源。


这其实就是消息总线的一种体现,操作系统就是这个总线,在架构中,消息中线是一个中枢系统。


springcloudbus是基于SpringCloudStream的,SpringCloudStream的作用其实也是一种适配器模式的体现,消息中间件由很多,比如activemq,rabbitmq ,kafka,不同的消息中间件都会由使用上的差异,而SpringCloudStream就是为了屏蔽各种消息中间件的差异而存在的,具体的SpringCloudStream我们后面会单独拿来说


再来看个图


与之前的架构不一样的地方在于增加了消息总线,消息总线连接了config配置中心和各个配置中心的消费方,当配置提交到github的时候,可以借助/bus/refresh刷新,config配置中心再将变更的消息通知到其他的客户端


【github】 修改配置microcloud-config-client.yml

spring:

   profiles:

      active:

        - dev

---

server:

  port: 8201


spring:

  profiles: dev

  application:

      name: microconfig-test-client2


eureka:

 client:

  serviceUrl:

    defaultZone: http://admin:enjoy@localhost:7301/eureka

  register-with-eureka: false


info:

  app.name: microcloud-config-client-dev

  company.name: enjoy

---

server:

  port: 8102


spring:

  profiles: beta

  application:

      name: microconfig-test-client2


eureka:

 client:

  serviceUrl:

    defaultZone: http://admin:enjoy@localhost:7301/eureka

  register-with-eureka: false


info:

  app.name: microcloud-config-client-dev

  company.name: enjoy



启动rabbitmq




登陆查看 http://localhost:15672



1.6.1. 准备bus配置中心

   新建立一个模块【microcloud-config-bus】,这模块是配置中心的升级版,作用也是配置中心。

【microcloud-config-bus】 修改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">

    <parent>

        <artifactId>springcloud</artifactId>

        <groupId>enjoy</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>


    <artifactId>microcloud-config-bus</artifactId>


    <dependencies>

        <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.cloud</groupId>

            <artifactId>spring-cloud-config-server</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>

    </dependencies>


</project>


【microcloud-config-bus】 修改application.yml文件,配置上git目录,一样连接上eureka,要和消息中间件通讯,所以RabbitMQ的连接信息也配置上

server:

  port: 7201

spring:

  cloud:

    config:

      server:

        git:

          uri: https://github.com/enjoyeud/microconfig.git

    bus:

      trace:

        enabled: true

  rabbitmq:

    host: localhost

    port: 5672    # RabbitMQ的监听端口

    username: enjoy  # 用户名

    password: 5428325 # 密码

  application:

    name: microcloud-config-bus


eureka:

 client:

  serviceUrl:

    defaultZone: http://admin:enjoy@localhost:7301/eureka

 instance:

    prefer-ip-address: true # 在地址栏上使用IP地址进行显示

    instance-id: microcloud-config-bus

management:

  endpoints:

    web:

      exposure:

        include: "*"



新增启动类

package cn.enjoy;


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

@EnableConfigServer

@EnableEurekaClient

public class ConfigBusApp {

    public static void main(String[] args) {

        SpringApplication.run(ConfigBusApp.class,args);

    }

}



先启动eureka,再启动ConfigBusApp  之后访问:


http://localhost:7301/

发现新的注册中心已经注册上去了。



1.6.2.  准备新的客户端

新建立microcloud-config-bus-client模块,这模块是注册中心的客户端,从注册中心获取数据,职责和【microcloud-config-client】一样,可用基于他拷贝修改,只是增加bus相关的功能。

【microcloud-config-bus-client】 修改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">

    <parent>

        <artifactId>springcloud</artifactId>

        <groupId>enjoy</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>


    <artifactId>microcloud-config-bus-client</artifactId>

    <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.cloud</groupId>

            <artifactId>spring-cloud-starter-bus-amqp</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-actuator</artifactId>

        </dependency>

    </dependencies>



</project>


【microcloud-config-bus-client】bootstrap.yml 增加rabbitmq相关信息,另外的配置和前面一样,需要从eureka找到注册中心,也需要找具体配置文件信息

spring:

  cloud:

    config:

      name: microcloud-config-client # 定义要读取的资源文件的名称

      profile: dev # 定义profile的 名称

      label: master # 定义配置文件所在的分支

      #uri: http://localhost:7101 # SpringCloudConfig的服务地址

      username: admin # 连接的用户名

      password: enjoy # 连接的密码

      discovery:

        enabled: true

        service-id: MICROCLOUD-CONFIG-BUS


  rabbitmq:

    host: localhost

    port: 5672    # RabbitMQ的监听端口

    username: enjoy  # 用户名

    password: 5428325 # 密码


eureka:

 client:

  serviceUrl:

    defaultZone: http://admin:enjoy@localhost:7301/eureka

  register-with-eureka: false



修改application.yml文件

spring:

 application:

  name: microcloud-config-client # 编写应用的名称

【microcloud-config-bus-client】 建立一个配置文件的映射类,这类是为了演示使用,里面的属性和github的属性一一对应,同时增加@RefreshScope,代表这个类是可用基于rabbitmq自动刷新的。

package cn.enjoy.config;


import org.springframework.beans.factory.annotation.Value;

import org.springframework.cloud.context.config.annotation.RefreshScope;

import org.springframework.stereotype.Component;


@Component

@RefreshScope

public class InfoConfig {

    @Value("${info.app.name}")

    private String appName ;

    @Value("${info.company.name}")

    private String companyName ;


    public String getAppName() {

        return appName;

    }


    public void setAppName(String appName) {

        this.appName = appName;

    }


    public String getCompanyName() {

        return companyName;

    }


    public void setCompanyName(String companyName) {

        this.companyName = companyName;

    }


    @Override

    public String toString() {

        return "InfoConfig{" +

                "appName='" + appName + '\'' +

                ", companyName='" + companyName + '\'' +

                '}';

    }

}



【microcloud-config-bus-client】修改ConfigClientController

package cn.enjoy.controller;


import cn.enjoy.config.InfoConfig;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.cloud.context.config.annotation.RefreshScope;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;


import javax.annotation.Resource;


@RestController


public class ConfigClientController {


    @Value("${spring.application.name}")

    private String applicationName;

    @Value("${eureka.client.serviceUrl.defaultZone}")

    private String eurekaServers;


    @Resource

    private InfoConfig infoConfig;


    @RequestMapping("/config")

    public String getConfig() {

        return "ApplicationName = " + this.applicationName + "、EurekaServers = "

                + this.eurekaServers+"、infos = " +infoConfig.toString();

    }

}



新增启动类

package cn.enjoy;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;


@SpringBootApplication

@EnableEurekaClient

public class ConfigClientBusApp {

    public static void main(String[] args) {

        SpringApplication.run(ConfigClientBusApp.class,args);

    }

}

启动后访问

http://localhost:8201/config,这时候已经能获得配置中心的数据


1.6.3. 测试自动刷新

 其实这里的自动刷新只能说是半自动的。

【github】microcloud-config-client.yml,随便修改里面的内容,提交

spring:

   profiles:

      active:

        - dev

---

server:

  port: 8201


spring:

  profiles: dev

  application:

      name: microconfig-test-client2


eureka:

 client:

  serviceUrl:

    defaultZone: http://admin:enjoy@localhost:7301/eureka

  register-with-eureka: false


info:

  app.name: microcloud-config-client-dev

  company.name: enjoy

---

server:

  port: 8102


spring:

  profiles: beta

  application:

      name: microconfig-test-client2


eureka:

 client:

  serviceUrl:

    defaultZone: http://admin:enjoy@localhost:7301/eureka

  register-with-eureka: false


info:

  app.name: microcloud-config-client-beta

  company.name: enjoybeta



【microcloud-config-bus-client】 刷新客户端

http://localhost:8201/config

这个时候信息并没自动刷新,数据还是以前的,这是以为对应消息中间件来说,还需要给他发个消息,代表数据已经更新了。


【microcloud-config-bus】使用postman发生一条post刷新的指令

http://localhost:7201/actuator/bus-refresh




访问http://localhost:15672,发现消息队列里面已经有消息传递了。



【microcloud-config-bus-client】 刷新客户端

http://localhost:8201/config 发现数据已经跟新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351