Config 组件

  • 一. Config组件介绍
  • 二. Config Server 开发
  • 1.引入依赖
  • 2.开启统一配置中心服务
  • 3.修改配置文件
  • 4.直接启动服务报错
  • 5.创建远程仓库
  • 6.复制仓库地址到配置文件中
  • 7.在统一配置中心服务中修改配置文件指向远程仓库地址
  • 8.再次启动统一配置中心
  • 9.拉取远端配置
  • 10.拉取远端配置规则
  • 11.查看拉取配置详细信息
  • 12.指定分支和本地仓库位置
  • 三. Config Client 开发
  • 1.项目中引入config client依赖
  • 2.编写配置文件
  • 3.远程仓库创建配置文件
  • 4.启动客户端服务进行远程配置拉取测试
  • 四. 手动配置刷新
  • 1.手动配置刷新分析
  • 2.在config client端加入刷新暴露端点
  • 3.在需要刷新代码的类中加入刷新配置的注解
  • 4.在远程配置中加入name并启动测试
  • 5.启动Config_Client项目后直接访问
  • 6.修改远程配置
  • 7.修改之后在访问
  • 8.手动调用刷新配置接口
  • 9.在次访问发现配置已经成功刷新





本次SpringCloud学习使用的环境

Springboot版本---2.2.5.release
SpringCloud版本---Hoxton.SR6
JDK---1.8
IDEA---2018.3


一. Config组件介绍

Config组件官网介绍传送门

微服务 ingress ip 微服务组件_spring

  • config(配置)又称为 统一配置中心顾名思义,就是将配置统一管理,配置统一管理的好处是在日后大规模集群部署服务应用时相同的服务配置一致,日后再修改配置只需要统一修改全部同步,不需要一个一个服务手动维护。

统一配置中心组件流程图

微服务 ingress ip 微服务组件_微服务 ingress ip_02

二. Config Server 开发

1.引入依赖

<!--引入统一配置中心-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-config-server</artifactId>
    </dependency>

2.开启统一配置中心服务

@ServletComponentScan(basePackages = "com.xizi.config")
@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class ConfigServer7878Application {

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

}

微服务 ingress ip 微服务组件_微服务 ingress ip_03

3.修改配置文件

server.port=7878
spring.application.name=config_server
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}

4.直接启动服务报错

没有指定远程仓库的相关配置

微服务 ingress ip 微服务组件_git_04

5.创建远程仓库

我使用Gitee创建一个仓库,GitHub我连不上,需要GitHub去百度找教程

微服务 ingress ip 微服务组件_微服务 ingress ip_05

6.复制仓库地址到配置文件中

https://gitee.com/yin__peng/spring-cloud_config.git

微服务 ingress ip 微服务组件_spring_06

7.在统一配置中心服务中修改配置文件指向远程仓库地址

spring.cloud.config.server.git.uri=https://gitee.com/yin__peng/spring-cloud_config.git

#spring.cloud.config.server.git.username=       私有仓库访问用户名
#spring.cloud.config.server.git.password=				私有仓库访问密码

8.再次启动统一配置中心

微服务 ingress ip 微服务组件_spring_07

9.拉取远端配置

  1. http://localhost:7878/orders-xxxx.properties
  2. http://localhost:7878/orders-xxxx.json
  3. http://localhost:7878/orders-xxxx.yml

微服务 ingress ip 微服务组件_配置文件_08


微服务 ingress ip 微服务组件_配置文件_09

微服务 ingress ip 微服务组件_微服务 ingress ip_10

10.拉取远端配置规则

  • label/name-profiles.yml
    - label 代表去那个分支获取 默认使用master分支
    - name 代表读取那个具体的配置文件文件名称
    - profile 代表读取配置文件环境

微服务 ingress ip 微服务组件_微服务 ingress ip_11

11.查看拉取配置详细信息

微服务 ingress ip 微服务组件_git_12

12.指定分支和本地仓库位置

#一定要是一个空目录,在首次会将该目录清空
spring.cloud.config.server.git.basedir=/D:/IDEA/JavaWorkSpace/SpringCloud/Springcloud_config
#指定使用远程仓库中那个分支中内容
spring.cloud.config.server.git.default-label=master

微服务 ingress ip 微服务组件_微服务 ingress ip_13

配置文件会自动拉取到本地上

微服务 ingress ip 微服务组件_spring_14

三. Config Client 开发

1.项目中引入config client依赖

<!--引入config client-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>

2.编写配置文件

spring.application.name=config_client
#开启统一配置中心服务
spring.cloud.config.discovery.enabled=true
#指定统一配置服务中心的服务唯一标识
spring.cloud.config.discovery.service-id=config-server
#指定从仓库的那个分支拉取配置
spring.cloud.config.label=master
#指定拉取配置文件的名称
spring.cloud.config.name=clients
#指定拉取配置文件的环境
spring.cloud.config.profile=dev

3.远程仓库创建配置文件

clients.properties [用来存放公共配置]

spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}

微服务 ingress ip 微服务组件_git_15

clients-dev.properties

server.port=7880

微服务 ingress ip 微服务组件_spring_16

clients-prod.properties [用来存放生产相关配置]

server.port=7879

微服务 ingress ip 微服务组件_微服务 ingress ip_17

4.启动客户端服务进行远程配置拉取测试

@直接启动过程中发现无法启动直接报错

报错原因

  • 项目中目前使用的是application.properties启动项目,使用这个配置文件在springboot项目启动过程中不会等待远程配置拉取,直接根据配置文件中内容启动,因此当需要注册中心,服务端口等信息时,远程配置还没有拉取到,所以直接报错

解决方案

  • 应该在项目启动时先等待拉取远程配置,拉取远程配置成功之后再根据远程配置信息启动即可,为了完成上述要求springboot官方提供了一种解决方案,就是在使用统一配置中心时应该将微服务的配置文件名修改为bootstrap.(properties|yml),bootstrap.properties作为配置启动项目时,会优先拉取远程配置,远程配置拉取成功之后根据远程配置启动当前应用。

再次启动服务

微服务 ingress ip 微服务组件_git_18

创建Client接口进行测试

微服务 ingress ip 微服务组件_git_19

两个服务都在Consul注册中

微服务 ingress ip 微服务组件_配置文件_20

四. 手动配置刷新

1.手动配置刷新分析

  • 在生产环境中,微服务可能非常多,每次修改完远端配置之后,不可能对所有服务进行重新启动,这个时候需要让修改配置的服务能够刷新远端修改之后的配置,从而不要每次重启服务才能生效,进一步提高微服务系统的维护效率。在springcloud中也为我们提供了手动刷新配置和自动刷新配置两种策略,这里我们先试用手动配置文件刷新。

2.在config client端加入刷新暴露端点

web端点暴露为了调用刷新接口

# 开启所有web端点暴露  
    management.endpoints.web.exposure.include=*

微服务 ingress ip 微服务组件_spring_21

3.在需要刷新代码的类中加入刷新配置的注解

package com.xizi.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;

@RestController
@RefreshScope
public class ClientController {

    @Value("${server.port}")
    private int port;

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

    @GetMapping("/client/init")
    public String init(){
//        return "当前服务的端口为:"+port;
        return "当前服务的姓名为:"+name;
    }
}

注解一定要加,不然接口刷新失效

微服务 ingress ip 微服务组件_spring_22

4.在远程配置中加入name并启动测试

这里的Rabbitmq配置是在后面Bus组件中使用,这里不用管

微服务 ingress ip 微服务组件_配置文件_23

5.启动Config_Client项目后直接访问

http://localhost:7880/client/init

微服务 ingress ip 微服务组件_微服务 ingress ip_24

微服务 ingress ip 微服务组件_spring_25

6.修改远程配置

微服务 ingress ip 微服务组件_spring_26

7.修改之后在访问

发现并没有自动刷新配置,必须调用刷新配置接口才能刷新配置

微服务 ingress ip 微服务组件_微服务 ingress ip_27

8.手动调用刷新配置接口

http://localhost:7880/actuator/refresh

调用Post请求,使用PostMan工具进行测试

微服务 ingress ip 微服务组件_微服务 ingress ip_28

9.在次访问发现配置已经成功刷新

微服务 ingress ip 微服务组件_微服务 ingress ip_29