九、Spring Cloud Config分布式配置中心

文章目录

基于上一集

简介

在分布式系统中,由于服务数量非常多,配置文件分散在不同的微服务项目中,管理不方便。为了方便配置文件集中管理,需要分布式配置中心组件。在Spring Cloud中,提供了Spring Cloud Config,它支持配置文件放在配置服务的本地,也支持放在远程Git仓库(GitHub、码云)。

使用Spring Cloud Config配置中心后的架构如下图:

九、Spring Cloud Config分布式配置中心
配置中心本质上也是一个微服务,同样需要注册到Eureka服务注册中心!

Git配置管理

远程Git仓库

知名的Git远程仓库有国外的GitHub和国内的码云(gitee);但是使用GitHub时,国内的用户经常遇到的问题是访问速度太慢,有时候还会出现无法连接的情况。如果希望体验更好一些,可以使用国内的Git托管服务——码云
(gitee.com)。
与GitHub相比,码云也提供免费的Git仓库。此外,还集成了代码质量检测、项目演示等功能。对于团队协作开发,码云还提供了项目管理、代码托管、文档管理的服务。本章中使用的远程Git仓库是码云。

码云

创建远程仓库

首先要使用码云上的私有远程git仓库需要先注册帐号;请先自行访问网站并注册帐号,然后使用帐号登录码云控制台并创建公开仓库。
九、Spring Cloud Config分布式配置中心
九、Spring Cloud Config分布式配置中心

创建配置文件

在新建的仓库中创建需要被统一配置管理的配置文件。
配置文件的命名方式:
{application}-{profile}.yml 或 {application}-{profile}.properties

  • application为应用名称
  • profile用于区分开发环境,测试环境、生产环境等

如user-dev.yml,表示用户微服务开发环境下使用的配置文件。
这里将user-service工程的配置文件application.yml文件的内容复制作为user-dev.yml文件的内容,具体配置如下:

server:
  port: 10010
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      #默认过滤器,对所有路由生效
      default-filters:
        # 响应头过滤器,对输出的响应设置其头部属性名称为X-Response-Default-MyName,值为itcast;
        # 如果有多个参数多则重写一行设置不同的参数
        - AddResponseHeader=X-Response-Default-MyName, itcast

      routes:
        #路由id,可以自定义
        - id: user-service-route
          # 代理的服务地址,lb表示从eureka中获取具体服务
          # 路由配置中uri所用的协议为lb时(以uri: lb://user-service为例),gateway将使用 LoadBalancerClient把
          # user-service通过eureka解析为实际的主机和端口,并进行ribbon负载均衡。
          uri: lb://user-service
#          uri: http://127.0.0.1:9091
          # 路由断言,可以配置映射路径
          predicates:
            - Path=/**
          filters:
            # 添加请求路径的前缀   浏览器地址栏                      最终实际地址
#            PrefixPath=/user http://localhost:10010/8 --》http://localhost:9091/user/8
#            PrefixPath=/user/abc http://localhost:10010/8 --》http://localhost:9091/user/abc/8
#            - PrefixPath=/user

            # 表示过滤1个路径,2表示两个路径,以此类推
#            通过 StripPrefix=1 来指定了路由要去掉的前缀个数。如:路径 /api/user/1 将会被代理到 /user/1 。
#            也就是:             浏览器地址栏                          最终实际地址
#            StripPrefix=1 http://localhost:10010/api/user/8 --》http://localhost:9091/user/8
#            StripPrefix=2 http://localhost:10010/api/user/8 --》http://localhost:9091/8
            - StripPrefix=1
            # 自定义过滤器
            - MyParam=name
      # 解决访问跨域问题
      globalcors:
        corsConfigurations:
          '[/**]':
          #allowedOrigins: * # 这种写法或者下面的都可以,*表示全部
            allowedOrigins:
              - "http://docs.spring.io"
            allowedMethods:
              - GET

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true


# Gateway中也集成了hystrix和ribbon,修改其配置
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000
ribbon:
  ConnectTimeout: 1000
  ReadTimeout: 2000
  MaxAutoRetries: 0
  MaxAutoRetriesNextServer: 0

创建 user-dev.yml ;
内容来自 user-service\src\main\resources\application.yml (方便后面测试userservice项目的配置),可以如下:
九、Spring Cloud Config分布式配置中心
九、Spring Cloud Config分布式配置中心
九、Spring Cloud Config分布式配置中心

  • test.name.hzh2用于后面测试能否获取最新配置信息

创建完user-dev.yml配置文件之后,gitee中的仓库如下:
九、Spring Cloud Config分布式配置中心

搭建配置中心微服务

  • 创建配置中心微服务工程:
    九、Spring Cloud 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>heima-springcloud</artifactId>
        <groupId>com.itheima</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>config-server</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
    </dependencies>
</project>
  • 启动类
    创建配置中心工程 config-server 的启动类;
    config-server\src\main\java\com\itheima\config\ConfigServerApplication.java 如下:
package com.itheima.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer//开启配置服务
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

  • 配置文件
    创建配置中心工程 config-server 的配置文件;
    config-server\src\main\resources\application.yml 如下:
server:
  port: 12000
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/hzh_start/heima-config.git
  rabbitmq:
    host: 106.15.50.230
    port: 5672
    username: guest
    password: guest

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

注意上述的 spring.cloud.config.server.git.uri 则是在码云创建的仓库地址;可修改为你自己创建的仓库地址

  • 启动测试
    启动eureka注册中心和配置中心;然后访问http://localhost:12000/user-dev.yml ,查看能否输出在码云存储管理的user-dev.yml文件。并且可以在gitee上修改user-dev.yml然后刷新上述测试地址也能及时到最新数据。

九、Spring Cloud Config分布式配置中心

获取配置中心配置

前面已经完成了配置中心微服务的搭建,下面我们就需要改造一下用户微服务 user-service ,配置文件信息不再由微服务项目提供,而是从配置中心获取。如下对 user-service 工程进行改造。

  • 添加依赖
    在 user-service 工程中的pom.xml文件中添加如下依赖:
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-config</artifactId>
	<version>2.1.1.RELEASE</version>
</dependency>
  • 修改配置
  1. 删除 user-service 工程的
    user-service\src\main\resources\application.yml 文件(因为该文件从配置中心获取)
  2. 创建 user-service 工程 user-service\src\main\resources\bootstrap.yml 配置文件
spring:
  cloud:
    config:
      # 要与仓库中配置文件的application名一致
      name: user
      # 要与仓库中配置文件的profile名一致
      profile: dev
      # 要与仓库中配置文件所属版本(分支)一样
      label: master
      discovery:
        # 使用配置中心
        enabled: true
        # 注册在eureka的配置中心服务名
        service-id: config-server
eureka:
  client:
    service-url:
      defaultZone:  http://127.0.0.1:10086/eureka


user-service 工程修改后结构:
九、Spring Cloud Config分布式配置中心

  • bootstrap.yml文件也是Spring Boot的默认配置文件,而且其加载的时间相比于application.yml更早。
  • application.yml和bootstrap.yml虽然都是Spring Boot的默认配置文件,但是定位却不相同。bootstrap.yml可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。application.yml 可以用来定义应用级别的参数,如果搭配 spring cloud config 使用,application.yml 里面定义的文件可以实现动态替换。
  • 总结就是,bootstrap.yml文件相当于项目启动时的引导文件,内容相对固定。application.yml文件是微服务的一些常规配置参数,变化比较频繁。

启动测试

启动注册中心 eureka-server 、配置中心 config-server 、用户服务 user-service ,如果启动没有报错其实已经使用上配置中心内容,可以到注册中心查看,也可以检验 user-service 的服务。
九、Spring Cloud Config分布式配置中心
前面已经完成了将微服务中的配置文件集中存储在远程Git仓库,并且通过配置中心微服务从Git仓库拉取配置文件,当用户微服务启动时会连接配置中心获取配置信息从而启动用户微服务。如果我们更新Git仓库中的配置文件,那用户微服务并不可以及时接收到新的配置信息并更新。需要使用Spring Cloud Bus服务总线来及时更新配置信息

Spring Cloud Bus服务总线

Spring Cloud Bus是用轻量的消息代理将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理。也就是消息总线可以为微服务做监控,也可以实现应用程序之间相互通信。 Spring Cloud Bus可选的消息代理有RabbitMQ和Kafka。

使用了Bus之后:
九、Spring Cloud Config分布式配置中心

  • 改造配置中心
  1. 在 config-server 项目的pom.xml文件中加入Spring Cloud Bus相关依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-bus</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
        </dependency>
  1. 在 config-server 项目修改application.yml文件如下:
server:
  port: 12000
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/hzh_start/heima-config.git
  rabbitmq:
    host: 106.15.50.230
    port: 5672
    username: guest
    password: guest

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

management:
  endpoints:
    web:
      exposure:
        # 暴露触发消息总线的地址
        include: bus-refresh


  • 改造用户服务
  1. 在用户微服务 user-service 项目的pom.xml中加入Spring Cloud Bus相关依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-bus</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
  1. 修改 user-service 项目的bootstrap.yml如下:
spring:
  cloud:
    config:
      # 要与仓库中配置文件的application名一致
      name: user
      # 要与仓库中配置文件的profile名一致
      profile: dev
      # 要与仓库中配置文件所属版本(分支)一样
      label: master
      discovery:
        # 使用配置中心
        enabled: true
        # 注册在eureka的配置中心服务名
        service-id: config-server
  # 配置rabbitmq相关
  rabbitmq:
    host: 106.15.50.230
    port: 5672
    username: guest
    password: guest

eureka:
  client:
    service-url:
      defaultZone:  http://127.0.0.1:10086/eureka


  1. 改造用户微服务 user-service 项目的UserController
    九、Spring Cloud Config分布式配置中心
  • 测试
    前面已经完成了配置中心微服务和用户微服务的改造,下面来测试一下,当我们修改了Git仓库中的配置文件,用户微服务是否能够在不重启的情况下自动更新配置信息。
    测试步骤:
    第一步:依次启动注册中心 eureka-server 、配置中心 config-server 、用户服务 user-service
    第二步:访问用户微服务http://localhost:9091/user/8;查看IDEA控制台输出结果
    第三步:修改Git仓库中配置文件 user-dev.yml 的 test.name 内容
    第四步:使用Postman或者RESTClient工具发送POST方式请求访问地址http://127.0.0.1:12000/actuator/bus-refresh
    九、Spring Cloud Config分布式配置中心
    第五步:访问用户微服务系统控制台查看输出结果

测试结果:使用了Spring Cloud Bus后能在不重启应用的情况下,获取到配置中心中最新的配置信息

说明:
1、Postman或者RESTClient是一个可以模拟浏览器发送各种请求(POST、GET、PUT、DELETE等)的工具
2、请求地址http://127.0.0.1:12000/actuator/bus-refresh中 /actuator是固定的,/bus-refresh对应的是配置中心config-server中的application.yml文件的配置项include的内容
3、请求http://127.0.0.1:12000/actuator/bus-refresh地址的作用是访问配置中心的消息总线服务,消息总线服务接收到请求后会向消息队列中发送消息,各个微服务会监听消息队列。当微服务接收到队列中的消息后,会重新从配置中心获取最新的配置信息。

Spring Cloud 体系技术综合应用概览

九、Spring Cloud Config分布式配置中心

上一篇:SpringBoot项目配置文件外置


下一篇:httprunner进行接口测试