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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 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 服务总线。

目录
相关文章
|
2月前
|
存储 JavaScript 开发工具
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
本次的.HarmonyOS Next ,ArkTS语言,HarmonyOS的元服务和DevEco Studio 开发工具,为开发者提供了构建现代化、轻量化、高性能应用的便捷方式。这些技术和工具将帮助开发者更好地适应未来的智能设备和服务提供方式。
74 8
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
|
3月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
92 3
|
7月前
|
负载均衡 Java 开发者
Spring Cloud实战:构建分布式系统解决方案
Spring Cloud实战:构建分布式系统解决方案
|
8月前
|
程序员 测试技术 Docker
黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day3 全网最全
黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day3 全网最全(1)
536 1
|
8月前
|
JSON Java Spring
实战SpringCloud响应式微服务系列教程(第八章)构建响应式RESTful服务
实战SpringCloud响应式微服务系列教程(第八章)构建响应式RESTful服务
|
3月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
214 6
|
3月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
85 1
|
2月前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
294 69
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
5月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
5月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1