三整合分布式配置中心SpringCloudConfig

一、什么是配置?

配置其实是独立于程序的可配变量,同一份程序在不同的配置下会表现不同的行为

配置的演进

在这里插入图片描述

单机单体应用:传统的开发模式,所有服务由一个应用提供,拥有一个配置,修改需要重启应用  多机单体应用(集群部署):将同一单体应用多方部署,修改配置需要批量修改,全部重启  微服务模式:整体应用由多个独立服务提供功能,修改配置可单独修改重启服务,不影响别的服务运行

二、什么是分布式配置中心

分布式配置中心实际上就是将所有分布式服务的配置集中管理的一个组件,该组件至少提供了配置集中管理以及动态配置功能。

分布式配置中心的特点

1.集中化管理配置,所有服务配置到一个中央组件中  2.运行时动态修改配置,运行时修改配置无需重启应用,实时下发配置到各个服务  3.实时刷新配置

三、为什么需要分布式配置中心

由上述配置演进的三个阶段,我们可以看到一些基本问题:

1.配置杂乱繁复。如集群或微服务,某个节点或服务一旦有环境或某些配置不一致,将产生难以估量的问题

2.不同环境的配置需要分开管理。(一般开发环境,测试环境,正式环境的配置都有所区别,而没有集中管理的配置导致每次部署到不同环境都需要更换或指向不同的环境配置)

3.对集群部署的应用,一次性需要修改多个节点的应用配置,极易出现故障

4.每次修改配置都需要重新启动服务/应用,影响用户体验

综上所述,一个集统一配置,动态配置和实时刷新特性于一身的分布式配置中心就解决了上述问题。

四、分布式配置中心工作原理

如上所述,分布式配置中心必须具备三个特性:统一配置、动态配置、实时刷新  目前市面上的分布式配置中心解决方案主要有百度的disconf, 阿里的diamond,携程的disconf等,以及Spring Cloud自家的Spring Cloud Config  由于Spring Cloud Config能够与Spring Cloud无缝整合,此处以Spring Cloud Config为例了解分布式配置中心的工作原理:

Spring Cloud Config是一个基于http协议的远程配置实现方式,与Spring Cloud Eureka的策略有异曲同工之妙,Spring Cloud Config组件内部也设立了Config Server(配置中心)和Config Client(客户端)两个角色

在这里插入图片描述

Config Server: 分布式配置中心,统一配置管理的地方。默认使用git仓库管理配置文件也可以使用本地文件,同时为客户端提供配置获取接口;

Config Client: 客户端,也就是我们应用中的业务服务。应用启动/需要的时候从配置中心获取配置,同时可以本地缓存以提高性能。

五、实践整合分布式配置中心SpringCloud Config

为简单起见,本Demo使用本地文件作为配置管理文件

1.第一步:在父工程下创建分布式配置中心工程:springcloud-config

引入父工程

<parent>
   <artifactId>com.springcloud</artifactId>
   <groupId>com.springcloud</groupId>
   <version>1.0-SNAPSHOT</version>
</parent>

引入依赖 spring-cloud-config-server

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-config-server</artifactId>
</dependency>

完整的pom如下:

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

    <groupId>com.service</groupId>
    <artifactId>com.cloud</artifactId>
    <version>com.service</version>

    <dependencies>
        <!--配置服务端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <!--作为web项目存在-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--断路器依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

        <!--eureka 客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

    <!-- 添加spring-boot的maven插件,不能少,打jar包时得用 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2、第二步:在resource目录下创建bootstrap.yml配置文件,作为springcloud-config工程的配置文件,同时创建configs文件夹,用于管理后续各业务服务的配置文件

server:
  port: 8080 #端口
spring:
  application:
    name: springcloud-config-server #应用名
  profiles:
    active: native #环境
  #配置中心
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/configs/  #此处表明使用本地目录/configs下的配置文件作为配置仓库

# 注册中心配置
eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

3、第三步:创建启动类SpringCloudConfigApplication,使用@EnableConfigServer表明当前工程是配置中心

package com.service;

import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

/**
 * @类名 SpringCloudConfigApplication
 * @描述 TODO
 * @版本 1.0
 * @创建人 XuKang
 * @创建时间 2021/6/16 10:25
 **/
@SpringCloudApplication
@EnableConfigServer
public class SpringCloudConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudConfigApplication.class);
    }
}

4、第四步:客户端继续使用上一篇文章的springcloud-client工程

并引入依赖 spring-cloud-config-client

 <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-config-client</artifactId>
</dependency>

完整的pom如下:

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

    <groupId>org.example</groupId>
    <artifactId>configClient2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--eureka 客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--作为web项目存在-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--配置客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</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>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <!-- 添加spring-boot的maven插件,不能少,打jar包时得用 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

5、第五步:完善springcloud-client工程的bootstrap.yml文件,加入配置中心关联信息

spring:
  cloud:
    config:
      fail-fast: true
      name: ${spring.application.name}  #指定当前工程于config server中的应用名,此处直接引用spring.application.name属性
      profile: ${spring.profiles.active}  #指定当前工程于config server中的生效环境,此处直接引用spring.profiles.active属性
      uri: http://localhost:8080  #指定配置中心的ip和端口

完整的配置

server:
  port: 7900 #服务端口
spring:
  profiles:
    active: dev #当前生效环境
  application:
    name: springcloud-client #指定应用的唯一标识/服务名
  # 配置中心
  cloud:
    config:
      fail-fast: true
      name: ${spring.application.name}  #指定当前工程于config server中的应用名,此处直接引用spring.application.name属性
      profile: ${spring.profiles.active}  #指定当前工程于config server中的生效环境,此处直接引用spring.profiles.active属性
      uri: http://localhost:8080  #指定配置中心的ip和端口

# 注册中心配置
eureka:
  instance:
    prefer-ip-address: true #优先使用IP地址注册
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/ #eureka的注册地址

6、第六步:在配置中心的configs文件夹下创建springcloud-client-dev.yml文件,添加基本自定义配置,此处只配置基本用例测试

客户端对应于配置中心的配置文件名规则为:应用名-生效环境.yml,如spirngcloud-client-dev.yml对应于springcloud-client模块在dev环境下的配置文件

user:
  name: xiaomingdapaidang

7、第七步:在springcloud-client工程中创建TestController,模拟访问配置项

package com.client.com.client.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * @类名 TestController
 * @描述 TODO
 * @版本 1.0
 * @创建人 XuKang
 * @创建时间 2021/6/16 10:42
 **/
@RestController
@RequestMapping("/clent")
public class TestController {
    @Value("${user.name}") //获取配置文件中对应属性的值
    private String userName;

    @GetMapping("/getName")
    public String getUserName(){
        return userName;
    }

    @PostMapping("/postName")
    public String postName(@RequestBody Map<String,String> param){
        return param.get("name");
    }
}

8、第八步:启动Eureka注册中心

访问 http://localhost:8761/如下 在这里插入图片描述

9、第九步:启动配置中心

在这里插入图片描述

10、第十步:启动springcloud-client工程

在这里插入图片描述

11、第十一步:启动springcloud-client工程,并访问/getName接口,返回如下,证明连接配置成功

在这里插入图片描述

六、通过网络访问配置文件

Spring Cloud Config提供了几种网络访问的方式访问配置项,我们尝试访问springcloud-client工程在dev环境下的配置项

①/{ 应用名 }-{ 环境名 }.yml,直接访问文件内容 访问http://localhost:8080/springcloud-client-dev.yml 在这里插入图片描述 ②/{ 应用名 }-{ 环境名 }.properties,将文件内容转换成properties文件格式 访问http://localhost:8080/springcloud-client-dev.properties

在这里插入图片描述

③/{ 应用名 }-{ 环境名 }.json,将文件内容转换成json文件格式 访问http://localhost:8080/springcloud-client-dev.json

在这里插入图片描述

④/{ 应用名 }/{ 环境名 },获取详细配置信息 访问http://localhost:8080/springcloud-client/dev

在这里插入图片描述

七、总结

1、配置是独立于程序的可配变量,同一份程序在不同的配置下会表现不同的行为 ; 2、配置的发展由最初的单体应用逐渐发展到微服务应用和分布式架构配置,是不断集中和灵活切换的过程 ; 3、分布式配置中心就是将所有分布式服务的配置集中管理的一个组件,该组件至少提供了配置集中管理以及动态配置功能。分布式配置中心解决方案主要有百度的disconf, 阿里的diamond,携程的disconf等,以及Spring Cloud自家的Spring Cloud Config ; 4、与Spring Cloud Eureka的策略有异曲同工之妙,Spring Cloud Config组件内部也设立了Config Server(配置中心)和Config Client(客户端)两个角色;

5、Config Server分布式配置中心服务端工程,该工程引用spring-cloud-config-server 依赖,并使用@EnableConfigServer表明当前工程是配置中心  ; 6、Config Client分布式配置的客户端工程,该工程引用spring-cloud-config-client依赖,同时通过配置文件的信息向Config Server工程拉取配置。

八、资源地址

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/4501.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!