springcloud微服务系列教程(六) 分布式配置中心 Spring Cloud Config

前言

在分布式系统中,存在着多个服务,服务之间的调用也比较频繁,为了方便管理服务的配置信息,需要建立一个分布式的配置中心来统一管理,springcloud中就存在这样的组件,它就是spring cloud config。

spring cloud config支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。一般来说,分布式系统的配置信息都是集中放在git仓库中进行管理, 通过加入spring cloud config组件,我们可以建立一个config server的服务来实现对远程配置文件的维护管理,然后各个微服务在通过config server来获取配置信息,这时的微服务就相当于config的客户端。

为了方便展示效果,本文中的两个例子就命名为config server 和config client。

创建config server

老规矩,先创建一个父工程,名称是config,然后新建一个module工程config server,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">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.yeya</groupId>
   <artifactId>config</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>config</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.3.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </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.RELEASE</spring-cloud.version>
   </properties>

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

在入口Application类加上@EnableConfigServer注解,表明开启配置服务器的功能

@EnableConfigServer
@SpringBootApplication
public class ConfigApplication {

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

在配置文件application.yml中配置如下信息:

#服务名称
spring:
  application:
    name:config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/Taoxj/sc_properties/   #git远程仓库的地址
          search-paths: /**            #仓库配置文件的路径,这里默认全部都可以访问
          username:                       #git账户的用户名
          password:                       #git账户的密码
      label: master                       #配置仓库的分支
#端口
server:
  port: 1211

git仓库的地址是笔者在GitHub上建立的公开仓库https://github.com/Taoxj/sc_properties,因为是公开仓库,所以不用设置账户名和密码,大家可以直接访问。

在远程仓库的config文件夹下有两个文件,分别是config-client -dev.propertiesconfig-client -test.properties ,两个配置文件中内容为:

age = 18
user = yeya
test-name = yeya-test 

启动工程,在浏览器打开http://localhost:1113/label/dev,可以看到网页显示结果为:
这里写图片描述
说明我们成功访问到了远程配置信息,访问的信息是config-client -dev.properties中的内容。

配置服务中心http请求地址和资源文件映射如下:

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

我们可以在浏览器中访问http://localhost:1211/label/test,这时访问到的就是config-client -test.properties的信息了。

创建config client工程

创建子工程,名称为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">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.yeya</groupId>
   <artifactId>config</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>config</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.3.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </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.RELEASE</spring-cloud.version>
   </properties>

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

在配置文件bootstrap.yml配置好如下信息:

server:
  port: 1113
spring:
  application:
    name: config-client
  cloud:
    config:
      label: master
      profile: dev                                
      uri: http://localhost:1112/   

label:远程分支
profile:dev 指开发环境配置文件,若为test则为测试环境,pro为生产环境,这里我们读取开发环境配置文件中的信息
uri:配置服务中心的地址
配置成功后,在启动类中加入一个接口来访问配置dev文件中的user属性信息

@SpringBootApplication
@RestController
public class ConfigApplication {

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

   @Value("${user}")
   String user;

   @RequestMapping("/user")
   public String home() {
      return "user:" + user;
   }
}

启动工程, 在浏览器输入http://localhost:1112/user,可以看到成功输出字符串

yeya 

证明config-client可以通过config-server来访问远程仓库的配置信息,项目的架构图如下:
这里写图片描述

注意bootstrap.yml与application.yml执行顺序

最后,在这里要说明以下,config-client的配置文件名记得要改成bootstrap.yml,笔者之前不知道这个问题,就照着application.yml上配置信息,然后发现config-client总是启动失败,报如下的信息:
这里写图片描述
log提示我们的错误是因为 “${user}” 注入失败,说明代码没有从Git地址上获取到这个key的信息,楼主尝试过很多种方法,包括了重建git仓库,或者是配置信息加入用户名和密码等等,这些方法试过之后都没有解决问题,后来上网查了一下,才知道原来spring cloud的配置文件存在优先级的加载顺序的。

根据网上的资料,bootstrap.yml的优先级高于application.yml,
bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等。
application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。

bootstrap.yml 先于 application.yml 加载,所以,启动config-client项目的时候,为了取得配置信息,需要一些提早或引导的配置,所以,一般在config组件中是把配置信息放在bootstrap.yml中,系统会默认优先加载其中的信息,这样就可以保证要获取的key注入成功。

本文源码地址:https://github.com/Taoxj/SpringCloudDemo/tree/master/config

猜你喜欢

转载自blog.csdn.net/yeyazhishang/article/details/81461223