SpringCloud Config分布式配置中心

SpringCloud Config 分布式配置文件中心

为什么要使用分布式的配置中心

产生背景:在微服务中如果使用传统的方式管理配置文件,配置文件管理起来就会非常麻烦跟复杂,如果有100个服务,那不是要写100application.yml吗。而且,如果生产环境配置文件可能需要发生改变的时候,就得重新打war包,重新读取配置信息到jvm内存中,非常的麻烦,因此就有了分布式的配置中心

什么是分布式配置中心

在微服务中使用同一个服务器管理所有服务的配置文件信息,能够实现后台可管理,当服务器正在运行的时候,如果配置文件需要发生改变。可以实现不需要重启服务器就可以实时更改配置文件信息。

分布式配置中心框架的对比

阿波罗:携程写的分布式配置中心,有专门的图形界面可管理配置文件信息,配置文件信息存放在数据库里面

SpringCloud Config:没有后台可管理分布式配置中心的,配置文件信息存放在版本控制器里面(git | svn

使用Zookeeper实现分布式配置中心:持久节点+事件通知 实现

分布式配置中心原理

分布式配置中心需要哪些组件

  • web管理系统:后台可以使用图形界面管理配置文件,SpringCloud Config中没有图形化界面管理配置文件
  • 存放分布式配置文件服务器(持久存储服务器):SpringCloud Config使用版本控制器存放配置文件信息
  • ConfigServer缓存配置文件服务器(临时缓存存放)
  • ConfigClient读取ConfigServer配置文件信息

思考:为什么要设计一层ConfigServer?

目的是为了缓存git上的配置文件信息

使用

搭建远程git仓库

为了能够存放持久化配置文件信息,这里使用gitee,新建一个仓库就行了

git环境上项目以文件夹进行区分

例如:

member_config会员服务配置文件夹

order_config 订单服务配置文件夹

搭建ConfigServer

Maven依赖

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jx.cloud</groupId>
    <artifactId>springcloud_configServer2.0</artifactId>
    <version>1.0-RELEASE</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- eureka客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!-- config server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置application.yml

server:
  port: 8001
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          # configServer读取git环境的地址
          uri: https://gitee.com/traeric/distribute.git
          username: gitee登录邮箱
          password: gitee密码
          # 读取配置文件的目录名称
          search-paths:
            - gkconfig
      # 读取的分支环境
      label: master
# 注册中心地址
# 为什么要注册到注册中心,因为configClient去访问configServer是通过别名访问的
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8100/eureka

配置文件命名规范以及发布配置文件

git环境上创建配置文件的命名规范:

服务名称-环境.yml

环境大致有:

  公司项目中环境是如何区分的

  • dev   开发环境
  • sit    测试环境
  • pre   预发布环境
  • prd   准生产环境

搭建ConfigClient

Maven依赖

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jx.cloud</groupId>
    <artifactId>springcloud_configClient2.0</artifactId>
    <version>1.0-RELEASE</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- web依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Eureka客户端依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- config client依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
View Code

创建bootstrap.yml文件(替换掉application.yml)

resource目录下建立bootstrap.yml文件

server:
  port: 8002
spring:
  application:
    # 服务名称,必须和git上的配置文件名相同
    # 例如文件名为:test-configClient-sit.yml
    # 那么这里的服务名即:test-configClient
    name: test-configClient
  cloud:
    config:
      # 读取的环境
      profile: sit
      discovery:
        # ConfigServer在注册中心上的名字
        service-id: config-server
        # 开启读取权限
        enabled: true
# 注册中心地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8100/eureka 

从ConfigServer中获取配置信息

虽然配置文件在ConfigServer上,但是使用起来跟配置文件在resource/application.yml中没有什么区别,跟配置文件在resource中一样使用

@RestController
public class TestController {
    @Value("${jxInfo}")
    private String jxInfo;

    @RequestMapping("/getInfo")
    public String getInfo() {
        return jxInfo;
    }
}

然后访问对应的路径即可

配置文件信息实时刷新

默认情况下不能及时的获取实时变更的文件信息

SpringCloud分布式配置中心可以采用手动刷新或者自动刷新

手动刷新:需要人工调用接口,读取最新配置文件(监控中心)

自动刷新:消息总线进行实时通知(SpringCloud Bus

手动刷新和自动刷新都不需要重启服务器

actuator端点刷新数据

Maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在bootstrap.yml中新增开启监控断点

management:
  endpoints:
    web:
      exposure:
        include: "*"   # 监控所有

刷新前提

在需要刷新的Bean上添加@RefreshScope注解

@RestController
@RefreshScope
public class TestController {

手动刷新

在需要刷新的时候只需要使用POST请求/actuator/refresh即可

posted @ 2018-12-09 17:30  Jin同学  阅读(410)  评论(0)    收藏  举报