SpringCloud Finchley 实战入门(基于springBoot 2.0.3)【八 config 微服务配置中心】

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: spring cloud configspring cloud config是spring cloud团队创建的一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的配置支持。

spring cloud config

spring cloud config是spring cloud团队创建的一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的配置支持。他分为服务端和客户端两部分。其中服务端也称为分布式式配置中心,它是一个独立的微服务应用,用来连接配置仓库的并为客户端提供获取配置信息,加密、解密等访问接口。而客户端则是微服务架构中的各个微服务应用和基础设施。

入门实例

这里我们会创建一个基于Git存储的分布式配置中心,并且在客户端演示如何通过配置指定的微服务应用所属的配置中心,以及让其能够通过配置中心获取配置信息并绑定到代码中。

说先我们在github上面先创建一个配置文件存储的仓库"config-repo",创建完成后新建spring_cloud_in_action/config-repo的目录。
在config-repo目录下面新建"didispace.properties"、
"didispace-dev.properties"、"didispace-prod.properties"、"didispace-test.properties";
然后在这4个文件中均设置一个from属性,并且为每个配置文件设置不同的值:

from=git-default-2.0
from=git-dev-2.0
from=git-prod-2.0
from=git-test-2.0
img_b222c11922a1099eb4fa7e3239a77435.png
1532672579949.png

对应对应github上面的目录:


img_a45ea5ff6f207732777fb42e16f44f32.png
1532672654269.png

到这里,我们配置文件的仓库就已经配置好了。我们继续回到spring cloud的项目中;
建一个spring boot的module,并且命名为"";创建的过程中,我们选择eureka-server和config的组件依赖。


img_b2458a6f8efb20c8d4eff42cef1a0319.png
1532672208369.png

pom.xml如下:

<?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.example</groupId>
    <artifactId>eureka-config-git</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-config-git</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.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-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.yml配置:

spring:
  application:
    name: config-server-git
  cloud:
    config:
      server:
        git:
          uri: https://github.com/ChinPangLung/config-repo #git仓库的地址;file://${user.name}/config-repo这是本地文件路径配置的方式,只限于用于开发使用
          searchPaths: spring_cloud_in_action/config-repo
          username: XXXXXXX  #这里对应仓库地址的账号密码
          password: XXXXXXX
      discovery:
        enabled: true
server:
  port: 7001
eureka:
  client:
      serviceUrl:
        defaultZone: http://peer1:8762/eureka/,http://peer2:8763/eureka/

spring.cloud.config.server.git.uri 表示我们上面再GitHub上创建的config-repo仓库地址
spring.cloud.config.server.git.searchPaths 表示配置文件存放查询的地址
spring.cloud.config.server.git.username 表示我们的github的账号 (大家修改成自己对应的账号密码就行了)
spring.cloud.config.server.git.password 表示我们github的密码

项目的主类添加@EnableConfigServer注解

@SpringBootApplication
@EnableConfigServer
public class EurekaConfigGitApplication {

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

到这里我们的配置服务中心就已经基本的搭建完成,在eureka注册中心,启动的情况下,我们运行该项目,如果没有报错,那就说明我们的配置是没有问题的。

完成了这些准备工作之后,我们就可以通过浏览器、POSTMAN或CURL等工具直接来访问到我们的配置内容了。访问配置信息的URL与配置文件的映射关系如下:

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties
    上面的url会映射{application}-{profile}.properties对应的配置文件,其中{label}对应Git上不同的分支,默认为master。我们可以尝试构造不同的url来访问不同的配置内容,比如,要访问master分支,didisapce应用的dev环境,就可以访问这个url:http://localhost:7001/didispace/dev/master
    可以得到以下的返回:
    img_ed12f74796739e014edc4cbb7857cbe1.png
    1532674051553.png

完成了上述的验证后,我们就可以创建一个客户端来映射服务配置中心的配置了。
创建一个spring boot的module,命名为"eureka-config-client"


img_057313936a9dcb401f6a71ff98d1716e.png
1532674210897.png
<?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.example</groupId>
    <artifactId>eureka-config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-config-client</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.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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-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.yml配置:

spring:
  application:
    name: config-client
server:
  port: 7002

创建一个"bootstrap.yml"文件,配置如下:

spring:
  cloud:
    config:
      profile: dev #dev开发环境配置文件,test测试环境配置文件,pro正式环境文件
      label: master #git仓库对应的分支名称 config-label-test
#      uri: http://localhost:7001/ #config-server
      name: didispace
      discovery:
        serviceId: config-server-git #基于服务注册发现的方式查找
        enabled: true
eureka:
  client:
      serviceUrl:
        defaultZone: http://peer1:8762/eureka/,http://peer2:8763/eureka/
#注册中心eureka.client.service-url.defaultZone = 一定要放在boostrap文件中,不然启动会报错

在项目的中类中写一个from接口:

@SpringBootApplication
@RestController
@RefreshScope
public class EurekaConfigClientApplication {

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

    @Value("${from}")
    private String from;

    @RequestMapping(value = "from")
    public String getFrom() {
        return this.from;
    }
}

启动项目,然后访问http://localhost:7002/from可以得到以下的返回:

img_3a59bed16e65f84e56917003a914fd01.png
1532674897020.png

这个数据就是config-client项目获取服务配置中心里对应指向的GitHub仓库配置文件的值。
而且我们观察"eureka-config-git"项目控制台的输出


img_dfe9512d9cb0bfb3d2e68bfa7842cec4.png
1532675044524.png

我们可以知道,服务配置中心在获取GitHub上面的配置文件返回config-client时,同时会缓存一分数据在本地的。这样就算因为其他的问题导致配置服务中心获取不到GitHub仓库的数据时,config-client也能有缓存的数据返回。

这样我们就完成了分布式配置中心的搭建了。其实上面的config-client我们在实际的开发中,就是相当于一个具体的微服务实例应用了。

github 项目源码

下面一篇我们将搭建spring cloud bus 服务总线。

目录
相关文章
|
16天前
|
Java 应用服务中间件 数据库连接
SpringBoot入门(2) - SpringBoot HelloWorld
SpringBoot入门(2) - SpringBoot HelloWorld
33 2
SpringBoot入门(2) - SpringBoot HelloWorld
|
27天前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
43 4
SpringBoot入门(4) - 添加内存数据库H2
|
17天前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
63 5
|
16天前
|
前端开发 Java 数据库
SpringBoot入门(3) - 对Hello world进行MVC分层
SpringBoot入门(3) - 对Hello world进行MVC分层
31 4
|
17天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
28 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
27天前
|
Java 应用服务中间件 数据库连接
SpringBoot入门(2) - SpringBoot HelloWorld
SpringBoot入门(2) - SpringBoot HelloWorld
19 2
SpringBoot入门(2) - SpringBoot HelloWorld
|
30天前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
31 2
SpringBoot入门(4) - 添加内存数据库H2
|
30天前
|
前端开发 Java 数据库
SpringBoot入门(3) - 对Hello world进行MVC分层
SpringBoot入门(3) - 对Hello world进行MVC分层
35 1
SpringBoot入门(3) - 对Hello world进行MVC分层
|
30天前
|
Java 应用服务中间件 数据库连接
SpringBoot入门(2) - SpringBoot HelloWorld
SpringBoot入门(2) - SpringBoot HelloWorld
20 1
 SpringBoot入门(2) - SpringBoot HelloWorld
|
22天前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
61 13
下一篇
无影云桌面