美文网首页
SpringCloud Config

SpringCloud Config

作者: zero_93a5 | 来源:发表于2020-05-23 13:41 被阅读0次

    英语好的可以看官方文档: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 发现数据已经跟新

    相关文章

      网友评论

          本文标题:SpringCloud Config

          本文链接:https://www.haomeiwen.com/subject/ikwkahtx.html