SpringCloud实战---第十六篇:微服务配置中心Config

举报
老司机张师傅 发表于 2022/07/26 23:25:01 2022/07/26
【摘要】 系列文章目录SpringCloud快速入门到精通各组件原理专栏传送门@TOC 前言 我们学习的知识框架图说起来容易做起来难,一步一步都干完!!!学习一定要自己动手搞一搞,不能只眼会。学习笔记是跟着尚硅谷的视频学的:https://www.bilibili.com/video/BV18E411x7eT?p=1 先构建好基础工程(一篇一篇看过来的不用重新构建)构建基础父工程:构建基础父工程Re...

系列文章目录

SpringCloud快速入门到精通各组件原理
专栏传送门


@TOC


前言

我们学习的知识框架图

在这里插入图片描述
说起来容易做起来难,一步一步都干完!!!
学习一定要自己动手搞一搞,不能只眼会。
学习笔记是跟着尚硅谷的视频学的:https://www.bilibili.com/video/BV18E411x7eT?p=1

先构建好基础工程(一篇一篇看过来的不用重新构建)

构建基础父工程:构建基础父工程
Rest风格微服务:Rest风格微服务
传统分布式方法:传统分布式方法
改造工程,抽取公共模块:改造工程,抽取公共模块
使用Eureka:使用Eureka
Eureka集群: Eureka集群

想偷懒的请下载;gitee上我上传的代码:

https://gitee.com/xiaoZ1712/cloud2021

基础工程构建完成的目录结构:
在这里插入图片描述
启动所有模块,访问

localhost:7001

显示如下,代表基础工程没问题
在这里插入图片描述

话不多说,立马开干


一、关于服务配置中心SpringCloud Config

  • 随着微服务模块的增多,我们的配置文件需要被管理,否则多个分布式模块配置修改和管理起来很不方便,所以需要配置中心来统一管理配置。
  • 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,上百个配置文件的管理…/(ㄒoㄒ)/~~
  • 是什么 SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
  • 动态的配置切换,开发环境、测试环境、生产环境…
  • 公共的配置如数据库连接等等可以统一的放在配置中心,私用的再放在自己的模块(高内聚)
  • 集中管理配置文件
  • 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
  • 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
  • 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
  • 将配置信息以REST接口的形式暴露
  • 与GitHub整合配置:由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持SVN和本地文件),但最推荐的还是Git,而且使用的是http/https访问的形式
  • 官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.1.RELEASE/reference/html/
    在这里插入图片描述

二、Config服务端的配置与测试

在这里插入图片描述

1. 建立git仓库

创建一个git仓库,配置中心服务端(Config基于git来实现)

springcloud-config

在这里插入图片描述

2. 将创建的配置中心clone到本地

创建一个文件夹
在这里插入图片描述
在空文件夹右键,打开git命令行
在这里插入图片描述

输入clone命令,将刚才的git仓库克隆到本地

git clone https://gitee.com/xiaoZ1712/springcloud-config.git

git基本的命令
在这里插入图片描述
在master分支上新建一个config-dev.yml

config:
    test: 1234

在这里插入图片描述

三、新建cloud-config-center-3344

在这里插入图片描述
新建Module模块,它即为Cloud的配置中心模块cloudConfig Center
在这里插入图片描述
模块名

cloud-config-center-3344

pom.xml

<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-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

application.yml,我们将前面创建的git项目的地址配置上去

server:
  port: 3344

spring:
  application:
    name:  cloud-config-center #注册进Eureka服务器的微服务名
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/xiaoZ1712/springcloud-config.git #GitHub上面的git仓库名字
          ####搜索目录
          search-paths:
            - springcloud-config
      ####读取分支
      label: master

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

基础包

com.atguigu.springcloud

主启动类ConfigCenterMain3344

package com.atguigu.springcloud;

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

/**
 * @Author: Daisen.Z
 * @Date: 2022/1/4 13:43
 * @Version: 1.0
 * @Description:
 */
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain3344 {

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

}

windows下修改hosts文件,增加映射

127.0.0.1 config-3344.com

四、测试通过Config微服务是否可以从GitHub上获取配置内容

1. 将EurekaServer7001工程改成单节点

在这里插入图片描述

2. 启动测试

启动7001、3344工程模块
通过3344工程获取git上的配置文件信息
有多种格式可以读取到,我们推荐两种

ip:端口/{分支}/{application}-{profile}.yml
ip:端口/{application}-{profile}.yml

第二种会默认去找3344工程配置文件中配的分支,没有配置则找master分支

http://config-3344.com:3344/master/config-dev.yml
http://config-3344.com:3344/config-dev.yml

成功获取,证明从3344配置中心可以成功获取到git仓库中的配置信息了
在这里插入图片描述

五、客户端3355访问配置中心

在这里插入图片描述

1. 新建cloud-config-client-3355

在这里插入图片描述

模块名

cloud-config-client-3355

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">
    <parent>
        <artifactId>cloud2021</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-config-client-3355</artifactId>


    <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

添加bootstrap.yml配置文件
applicaiton.yml是用户级的资源配置项,bootstrap.yml是系统级的,优先级更加高
bootstrap.yml会比application.yml要优先加载
bootstrap.yml
这个配置的意思是我从远端http://localhost:3344找到对应的配置文件,读取配置文件到本地

server:
  port: 3355

spring:
  application:
    name: config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
      uri: http://localhost:3344 #配置中心地址k

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

基础包

com.atguigu.springcloud

主启动类

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @auther zzyy
 * @create 2020-02-21 18:07
 */
@EnableEurekaClient
@SpringBootApplication
public class ConfigClientMain3355
{
    public static void main(String[] args) {
            SpringApplication.run(ConfigClientMain3355.class, args);
    }
}

编写ConfigClientController,完成从注册中心上读取(系统启动会去注册中心加载配置到本地,我们的读取方式和本地一样就可以)

package com.atguigu.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @auther zzyy
 * @create 2020-02-21 18:08
 */
@RestController
public class ConfigClientController
{
    @Value("${config.test}")
    private String configTest;

    @GetMapping("/configInfo")
    public String getConfigInfo()
    {
        return configTest;
    }
}

2. 启动测试

启动7001、3344和3355,访问

http://localhost:3355/configInfo

可以看到,我们的3355工程已经成功的通过3344工程拿到了git上的远端配置
在这里插入图片描述

3. 配置手动挡动态加载

思考一个问题,当生产环境中我们的运维修改了git上的配置文件信息,我们的client端要怎么去知道运维修改了从而跟着重新获取配置呢?
难道每次重启客户端?这可是噩梦操作!!!

我们将工程改造成支持手动挡重新加载配置
给3355的pom中添加可视化监控依赖(我们的工程中已经添加过)

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

修改3355的配置文件,配置暴漏一个监控点

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

在这里插入图片描述
在Controller上添加自动刷新的注解

@RefreshScope

在这里插入图片描述
这样,这个Controller就具备手动刷新的能力了,我们可以再测试一下
分别访问3344和3355

http://config-3344.com:3344/config-dev.yml
http://localhost:3355/configInfo

访问结果正常
在这里插入图片描述
接着修改下git上面的配置信息
在这里插入图片描述
再次访问两个接口,会发现3344上面的改变了,3355还是没有改变,这就说明3355还是木牛动态加载
????黑人问好?????
3344改变了是因为3344是直接做的git映射,每次访问时直接访问的是git上的文件,所以会随着改变
但是3355我们做了动态加载配置之后为什么还是不会改变呢?
Config Client端提供的是手动刷新,但是不需要重启服务,我们访问一个接口即可刷新缓存。
这个接口必须使用post方式进行请求,可以使用postman或者url进行请求来刷新配置信息。

http://localhost:3355/actuator/refresh

在这里插入图片描述
再次访问3355接口,获取配置信息

http://localhost:3355/configInfo

发现已经成功刷新
在这里插入图片描述


总结

  • 随着微服务模块的增多,我们的配置文件需要被管理,否则多个分布式模块配置修改和管理起来很不方便,所以需要配置中心来统一管理配置。
  • SpringCloudConfig的原理是访问git上发布的配置文件工程,类似于跳转访问获取文件内容,然后客户端微服务工程中可以通过SpringCloudConfig配置中心来访问加载读取指定的配置文件。
  • Config Client端使用bootstrap.yml加载配置文件,bootstrap.yml配置文件比application.yml配置文件优先级要高,会优先加载,所以会优先加载远端配置中心的配置,然后再加载我们本地的application.yml配置信息,因此本地的会将先加载的远端的相同配置覆盖掉,这点大家可以自己测试一下。
  • Config客户端可以开启手动刷新,使用POST访问http://localhost:3355/actuator/refresh接口即可告知客户端更新配置信息。
  • 留下一个思考题,虽然手动挡的去刷新微服务可行,我们也不用重启微服务了,但是大量的微服务一个个手动刷新显然也不太可取,有没有更好的方式让我们全局的去推送消息,通知相关的微服务更新配置呢?敬请期待下篇。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。