一、分布式配置中心

1、为什么使用spring Cloud Config

常规开发中,每个微服务都包含代码和配置。其配置包含服务配置、各类开关和业务配置。如果系统结构中的微服务节点较少,那么常规的代码+配置的开发方式足以解决问题。当系统逐步迭代,其微服务会越来越复杂,慢慢演化成网状依赖结构,这时常规代码+配置的开发方式并不合适了,因为嗨哟啊考虑整体系统的拓展性、伸缩性和耦合性。这些问题中,配置的管理也是非常麻烦的。
如果还是以常规开发形式管理配置,则要承担反复修改编译代码、重启系统、重新打包等的风险。所以,一个可以集中管理,带有版本控制的配置中心应运而生。
Spring Cloud Config就是一个分布式配置中心解决方案。其采用集中管理每个微服务的配置信息,并使用Git等版本仓库统一存储配置内容,实现版本化管理控制。
但是由于分布式配置中心需要结合Git等版本控制,实现起来比正常开发多了一些流程,所以部分公司在技术选型时,可能并不适用SpringCloudConfig

2、优点

  • 提供服务端和客户端支持(Spring cloud config server 和 Spring cloud config client)
  • 集中管理分布式环境中的配置信息(所有配置文件统一放在了gitee中)
  • 基于spring环境提供配置管理,与spring系列框架无缝结合。
  • 可用于任何语言开发环境,基于http协议。

    3、架构

    image.png

    二、在Gitee中创建配置文件

    1、新建仓库

  1. 仓库名称随意。
  2. 是否生成readme文件对SpringCloudConfig没有影响。
  3. 仓库是public还是private也没有影响。
  4. 点击创建按钮即可新建仓库。

image.png

三、创建config-server

步骤一:添加文件application.yml
image.png
步骤二:创建config-server
resources中配置bootstrap.yml文件

  1. spring:
  2. application:
  3. name: config-server
  4. cloud:
  5. config:
  6. server:
  7. git:
  8. uri: https://gitee.com/linkjack/spring-cloud-config-test.git
  9. # username:公开仓库不需要配置
  10. # password:公开仓库不需要配置
  11. server:
  12. port: 1234

步骤三:启动类添加注解@EnableConfigServer
在浏览器地址栏输入http://config-server的ip:config-server端口/name/profile/label进行访问.
name为配置文件名,profile为配置文件,label为git分支类型
如果访问带有profile的配置文件master可以省略,省略后返回json字符串中label属性为null,正常应该为master。

访问:http://localhost:1234/application/master
image.png

四、创建config-client

Config Client对于Spring Cloud Config是客户端,对于Eureka来说可以是Application Server也可以是Application Client。
步骤一:导入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-config</artifactId>
  8. </dependency>
步骤二:配置文件bootstrap.yml配置
spring:
  cloud:
    config:
      name: application
      uri: http://localhost:1234/
      #label: master #默认为主分支master
      #profile: default #默认为default
步骤三:service和serviceimpl中书写业务代码,如:获取端口号
public interface UserService {
    public String demo();
}
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserService userService;
    //@Value("${}")注解从配置文件读取值的用法
    @Value("${server.port}")
    private String port;
    @Override
    public String demo() {
        System.out.println(port);
        return port;
    }
}
步骤四:controller
@RestController
public class MyController {
    @Autowired
    private UserService userService;

    @RequestMapping("/demo01")
    public String demo01(){
        return userService.demo();
    }
}

访问http://localhost:8787/demo01结果打印8787

五、热刷新

Config-client客户端服务应用,在启动的时候,会根据bootstrap配置内容远程访问config-server,获取当时的最新的配置内容。如果config-client运行过程中,Git仓库中的配置内容发生变更,config-client不会自动的加载刷新配置内容。需要认为干预。重启服务,一定会刷新配置。但是重启服务代价太高。这时就可以使用热刷新。
热刷新是指的是服务不重启,不间断对外提供服务,而是重新加载配置内容,初始化应用环境。
因为SpringBoot只有在启动时才加载一次配置文件,所以gitee上配置文件修改了,项目也不会实时跟随变化,既然是SpringBoot的问题,可以使用spring boot提供的Actuator来实现刷新项目的功能。
就需要依赖springbootstarteracuator启动器来实现刷新项目功能。
步骤一:添加actuator启动器

        <!--热刷新启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

步骤二:bootstrap.yml配置文件中增加配置。

spring:
  cloud:
    config:
      name: application
      uri: http://localhost:1234/
      #label: master #默认为主分支master
      #profile: default #默认为default

management:
  endpoints:
    web:
      exposure:
        include: refresh
步骤三:serviceimp中添加注解。注意:不能添加到controller中,否则不生效
public interface UserService {
    public String demo();
}


@Service
@RefreshScope
public class UserServiceImpl implements UserService {
    @Autowired
    private UserService userService;
    @Value("${server.port}")
    private String port;
    @Override
    public String demo() {
        System.out.println(port);
        return port;
    }
}
步骤四:Actuator的refresh需要使用post进行访问,借助postman实现<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22310212/1636812737062-f4924bec-3e79-4dfd-a9d4-06cf33e5c833.png#clientId=ua50496e6-623f-4&from=paste&height=72&id=ud5f4289b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=143&originWidth=632&originalType=binary&ratio=1&size=10747&status=done&style=none&taskId=u43190442-b708-4182-8017-cc6fb2c24e5&width=316)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22310212/1636812751285-2de1a9a4-a246-4d50-9d9e-203cabf15ec8.png#clientId=ua50496e6-623f-4&from=paste&height=630&id=u8fdd8735&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1259&originWidth=1796&originalType=binary&ratio=1&size=134775&status=done&style=none&taskId=u4a7e6f5b-6c0c-4736-9195-b34acf6f913&width=898)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22310212/1636812770619-e4b358a4-010b-48c4-aa31-1f9fdd91fa17.png#clientId=ua50496e6-623f-4&from=paste&height=494&id=ua0f1e492&margin=%5Bobject%20Object%5D&name=image.png&originHeight=988&originWidth=1674&originalType=binary&ratio=1&size=111900&status=done&style=none&taskId=u248c8fbe-c187-4804-85b1-c858bc4128c&width=837)