SpringCloud Config分布式配置中心

概述

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的!

SpringCloud提供了ConfigServer来解决这个问题,设想如果我们每一个微服务都自己带着一个application.yml,那么如果有上百个微服务呢......

是什么?

SpringCloud Config为微服务架构中的微服务提供了集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置

怎么用?

SpringCloud Config分为客户端和服务端两部分

服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息、加密、解密信息等访问接口

客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息,配置服务器默认采用git来存储配置信息,这样有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便管理和访问配置内容!

Config服务端配置与测试

1.在GitHub上新建一个名为springcloud-config的新Repository(需要是public的仓库,private的访问不了)

2.本地硬盘目录上新建git仓库并添加远程仓库、拉取远程仓库最新内容

CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/cloud2021
# echo "# springcloud-config" >> README.md

CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/cloud2021
# git init
Initialized empty Git repository in E:/Git/cloud2021/.git/

CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/cloud2021 (master)
# git add README.md
warning: LF will be replaced by CRLF in README.md.
The file will have its original line endings in your working directory

CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/cloud2021 (master)
# git commit -m "first commit"
[master (root-commit) b9a4cae] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/cloud2021 (master)
# git remote add springcloud-config git@github.com:chenstudyJava/springcloud-config.git

CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/cloud2021 (master)
# git push springcloud-config master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 226 bytes | 226.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:chenstudyJava/springcloud-config.git
 * [new branch]      master -> master

远程仓库上创建下面这三个文件,文件暂时不输入内容

3.新建工程模块cloud-config-center-3344,它即为Cloud的配置中心模块cloudConfig Center

4.pom文件

<dependencies>
    <!--config server-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <!--eureka client(通过微服务名实现动态路由)-->
    <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>

5.yml文件

server:
  port: 3344

spring:
  application:
    name: cloud-config-center # 注册进Eureka服务器的微服务名
  cloud:
    config:
      server:
        git:
          uri: https://github.com/chenstudyJava/springcloud-config.git  # git的仓库地址,这里我用ssh连接出错了,还没找到原因
          search-paths:   # 搜索目录
            - springcloud-config
      label: master   # 读取的分支


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

6.主启动类

package com.IT.springcloud;

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

@EnableConfigServer
@SpringBootApplication
public class ConfigCenterMain3344 {

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

}

7.在GitHub中的配置文件中加入(点击这个文件,然后点击笔形状的按钮进行编辑)

#config-dev.yml
config:
  info: "master branch,springcloud-config/config-dev.yml version=1"
  


#config-prod.yml
config:
  info: "master branch,springcloud-config/config-prod.yml version=1"



#config-test.yml
config:
  info: "master branch,springcloud-config/config-test.yml version=1"

8.启动7001,3344,然后在浏览器输入:localhost:3344/master/config-dev.yml(成功获取到github上的配置文件内容)

config:
  info: master branch,springcloud-config/config-dev.yml version=1

Config客户端配置与测试

1.新建工程模块cloud-config-client-3355

2.pom文件

 <dependencies>
        <!--区别:config server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <!--eureka client(通过微服务名实现动态路由)-->
        <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>

3.bootstrap.yml

server:
  port: 3355

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

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

4.主启动类

@EnableEurekaClient
@SpringBootApplication
public class ConfigClientMain3355 {

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

}

5.业务类

package com.IT.springcloud.controller;

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

@RestController
public class ConfigClientController {

    @Value("${config.info}")	// spring的@Value注解
    private String configInfo;

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

}

6.测试

启动7001,3344,3355

浏览器地址栏输入:localhost:3355/configInfo,拿到结果

master branch,springcloud-config/config-dev.yml version=1

动态刷新问题

  • Linux运维修改Github上的配置文件内容,提交成为一个新的版本
  • 刷新3344,发现ConfigServer配置中心立刻响应,版本更新
  • 刷新3355,发现ConfigClient客户端没有任何响应,版本未更新
  • 3355没有变化,除非自己重启或者重新加载
  • 难道每次运维修改配置文件,客户端都需要重启吗??

如何解决动态刷新问题?

  • 修改3355模块
  • pom引入actuator监控
  • 修改yml,暴露监控端口
  • 加上注解@RefreshScope,业务类Controller修改
  • 重启3355
  • 关键一步:需要运维人员手动发送post请求,刷新3355

1.config客户端3355在pom中添加依赖(上面已经加了)

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

2.然后在bootstrap.yml中添加

server:
  port: 3355

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

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

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

3.在ConfigClientController类上加上@RefreshScope注解

4.重启3355

5.修改GitHub上文件的版本号(改为2),然后访问3344和3355

浏览器地址栏输入:localhost:3344/master/config-dev.yml

config:
  info: master branch,springcloud-config/config-dev.yml version=2

浏览器地址栏输入:localhost:3355/configInfo,还是没有更新

master branch,springcloud-config/config-dev.yml version=1

6.打开终端,输入curl -X POST "http://localhost:3355/actuator/refresh"

7.刷新:localhost:3355/configInfo,返回结果

master branch,springcloud-config/config-dev.yml version=2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小馒头爱学Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值