SpringCloud学到刚好够用之七-配置中心(spring-cloud-config).md

Posted by lizhao on 07-09,2019

SpringCloud学到刚好够用之七-配置中心(spring-cloud-config)

[toc]

总览

spring cloud相关技术栈在现在各个互联网公司的普及率已经很高了,这次去面试,基本面试官都有提到这一块,但是有没有实际接触过,只能遗憾的摇摇头。这里记录下学习过程,将一些踩坑的经验写出来,供大家参考。这个系列只会写到很浅的一部分,如有兴趣深入,可以看"这个系列",将会给大家一个方向哈

基于SpringCloud的Greenwich.SR1,Jdk11,Maven,Idea开发

看的不过瘾

进阶使用

源码分析

简介

分布式配置中心

Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持。配置服务器为各应用的所有环境提供了一个中心化的外部配置。它实现了对服务端和客户端对Spring Environment和PropertySource抽象的映射,所以它除了适用于Spring构建的应用程序,也可以在任何其他语言运行的应用程序中使用。作为一个应用可以通过部署管道来进行测试或者投入生产,我们可以分别为这些环境创建配置,并且在需要迁移环境的时候获取对应环境的配置来运行。

置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。当然他也提供本地化文件系统的存储方式。

使用 spring Cloud 进行集中式配置管理,将以往的配置文件从项目中摘除后放到Git 或svn中集中管理,并在需要变更的时候,可以通知到各应用程序,应用程序刷新配置不需要重启。

基本原理

git 上存放我们的远程配置文件 config-server 连接到 git config-client 连接到config-server 当我们启动config-client 服务的时候,client 会通过连接的 config-server 拿到远程git 上面的配置文件,然后通过 Spring 加载到对象中。

准备活动

  1. 一个eureka
  2. 在git上面搞一个配置项目(建议先直接用我的目录,调通之后自己再去建一个)
  3. 一个config-server
  4. 一个config-client

在git上面搞一个配置项目

我是直接在项目上面https://gitee.com/lizhaoandroid/spring-cloud-learning,添加了一个分支pro007-config-properties,然后建了一个文件夹config-v1,加了几个文件 config-client-dev.properties

foo = foo version 21
democonfigclient.message=hello spring io

结构可以看下:https://gitee.com/lizhaoandroid/spring-cloud-learning/tree/pro007-config-properties/config-v1

配置中心config-server

主要步骤

引入包,spring-cloud-config-server

修改相关配置,spring.cloud.config

启动类添加注解,@EnableConfigServer

上述步骤关键代码及图片

  1. 引入包,spring-cloud-config-server
<?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>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.lizhaoblog.scl</groupId>
  <artifactId>pro007-config-server</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>pro007-config-server</name>
  <description>config-server project for Spring cloud</description>

  <properties>
    <java.version>11</java.version>
    <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-config-server</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-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

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

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

</project>

  1. 修改相关配置,spring.cloud.config
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8768
spring:
  application:
    name: service-config
  cloud:
    config:
      # 配置 项目分支
      label: pro007-config-properties
      server:
        git:
          # 配置 项目地址
          uri: https://gitee.com/lizhaoandroid/spring-cloud-learning
          # 配置 在项目的哪个文件夹
          searchPaths: config-v1
          # username:
          # password:

  1. 启动类添加注解,@EnableConfigServer
package com.lizhaoblog.scl.pro007configserver;

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

@SpringBootApplication
@EnableConfigServer
public class Pro007ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(Pro007ConfigServerApplication.class, args);
    }

}

配置中心config-client

引入包,spring-cloud-config

修改相关配置,端口8769,

添加一个bootstrap.yml远程配置中心,这个东西会读取远程的配置

写一个controller,用于测试,是否加载到了远程配置

上述步骤关键代码及图片

  1. 引入包,spring-cloud-config
<?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>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.lizhaoblog.scl</groupId>
  <artifactId>pro007-config-client</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>pro007-config-client</name>
  <description>config-client project for Spring Boot</description>

  <properties>
    <java.version>11</java.version>
    <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!--表示为web工程-->
    <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>

  </dependencies>

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

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

</project>

  1. 修改相关配置,端口8769,
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8769

  1. 添加一个bootstrap.yml远程配置中心,这个东西会读取远程的配置
spring:
  application:
    name: config-client
  cloud:
    config:
      # 分支
      label: pro007-config-properties
      # 会去读取config-client-dev
      profile: dev
      # 自己项目中的config-server
      uri: http://localhost:8768/

  1. 写一个controller,用于测试,是否加载到了远程配置
/*
 * Copyright (C), 2015-2019
 * FileName: ConfigCientTestController
 * Author:   zhao
 * Date:     2019/4/21 17:41
 * Description: 配置中心客户端测试控制器
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.lizhaoblog.scl.pro007configclient.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 〈一句话功能简述〉<br>
 * 〈配置中心客户端测试控制器〉
 *
 * @author zhao
 * @date 2019/4/21 17:41
 * @since 1.0.0
 */
@RestController
public class ConfigCientTestController {
    @Value("${foo}")
    String foo;

    @RequestMapping(value = "/hi")
    public String hi() {
        return foo;
    }
}

测试

主要步骤

运行eureka,config-server服务

访问http://127.0.0.1:8768/config-client/dev/pro007-config-properties (看总结部分,有网址信息)

运行config-client服务

访问http://127.0.0.1:8769/hi,看下是不是远程的foo值

上述步骤关键代码及图片

  1. 运行eureka,config-server服务
  2. 访问http://127.0.0.1:8768/config-client/dev/pro007-config-properties
{"name":"config-client","profiles":["dev"],"label":"pro007-config-properties","version":"b492b6b3ceb2608d41bb0b1114cc64d345676977","state":null,"propertySources":[{"name":"https://gitee.com/lizhaoandroid/spring-cloud-learning/config-v1/config-client-dev.properties","source":{"foo":"foo version 21","democonfigclient.message":"hello spring io"}}]}
  1. 运行config-client服务
  2. 访问http://127.0.0.1:8769/hi,看下是不是远程的foo值
foo version 21

总结

一般去搜config都会出来这个表

/{application}/{profile}[/{label}
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

当我想要访问https://gitee.com/lizhaoandroid/spring-cloud-learning/tree/pro007-config-properties/config-v1里面的 config-client-dev.properties文件时,可以输入的网址(1和5):

http://127.0.0.1:8768/pro007-config-properties/config-client-dev.properties
http://127.0.0.1:8768/pro007-config-properties/config-client-dev.properties

详细意思:

{label} 分支        pro007-config-properties
{application} 配置前缀  config-client
{profile} 最后一个-后面的内容   dev

广告时间

我是小王,一个喜欢抛转的码人。