springcloud-Config分布式配置

1 概念描述

1.1 官方描述

官网地址:https://spring.io/projects/spring-cloud-config

Spring Cloud Config 为分布式系统中的外部化配置提供服务器和客户端支持。使用配置服务器,您可以在所有环境中管理应用程序的外部属性。客户端和服务器上的概念与 Spring 和抽象的映射相同,因此它们非常适合 Spring 应用程序,但可以用于以任何语言运行的任何应用程序。当应用程序通过部署管道从开发到测试再进入生产时,您可以管理这些环境之间的配置,并确保应用程序在迁移时具备运行所需的一切。服务器存储后端的默认实现使用 git,因此它可以轻松支持配置环境的标记版本,并且可以通过各种工具访问以管理内容。很容易添加替代实现并将它们插入 Spring configuration.EnvironmentPropertySource 

1.2 分布式系统面临的配置文件问题

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。spring cloud提供了configServer来解决这个问题,我们每一个微服务自己带着一个application.yml,那上百个的配置文件修改起来,令人头疼!

1.3 什么是SpringCloud config分布式配置中心?

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

1.4 spring cloud config 的服务端和客户端

  • 服务端 : 也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密,解密信息等访问接口。
  • ​客户端 : 则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理。并且可用通过git客户端工具来方便的管理和访问配置内容。

1.5 spring cloud config 分布式配置中心能干什么

  • 集中式管理配置文件
  • 不同环境,不同配置,动态化的配置更新,分环境部署,比如 /dev /test /prod /beta /release
  • 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
  • 当配置发生变动时,服务不需要重启,即可感知到配置的变化,并应用新的配置
  • 将配置信息以REST接口的形式暴露

2 Git环境搭建

由于spring cloud config 默认使用git来存储配置文件 (也有其他方式,比如自持SVN 和本地文件),但是最推荐的还是git ,而且使用的是 http / https 访问的形式。

2.1 安装Git

参考地址:https://www.runoob.com/git/git-install-setup.html

2.2 创建码云仓库

码云地址:https://gitee.com/

登录码云并新建一个仓库

2.3 克隆项目到本地

打开我们创建的仓库,复制HTTPS路径

选择一个存放项目的文件夹,右键选中 Git Bash Here会弹出Git的命令窗口,然后输入克隆项目的命令,后面的地址是我们上一步复制的HTTPS地址

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

完成后,查看在本地生成的项目文件

2.4 设置用户名和邮箱并查看配置信息

依次输入如下命令设置用户名和邮箱

$ git config --global user.name "lv"
$ git config --global user.email "1148397597@qq.com"

用户名和邮箱设置完成后,再输入下面的命令查看配置信息

$ git config --list

2.5 新建application.yaml配置文件

在本地的项目目录下新建一个application.yaml配置文件

并编写里面的内容

spring:
 profiles:
  active: dev

---
spring:
 profiles: dev
 application:
  name: springcloud-config-dev

---
spring:
 profiles: test
 application:
  name: springcloud-config-test

2.6 把新建的yaml配置文件提交到码云仓库

进入项目目录

$ cd springcloud-config

添加新增的文件,并查看状态

$ git add .
$ git status

提交到本地仓库

$ git commit -m "first commit"

放入到远程仓库

$ git push origin master

查看码云仓库,确认yaml文件提交进来了

2.7 设置为公开的仓库

在后面的测试中要读取远程仓库中的内容,这个仓库就是现在创建的码云仓库,想要让仓库能被读取到,必须保证这个仓库是公开的,如果是私有仓库是读取不到的,所以在后面的测试进行之前还需将仓库的权限设置为开源状态,在码云仓库的管理中找到这个设置

3 搭建服务端

基于:springcloud-Zull路由网关

3.1 创建项目

在父工程新建一个普通的maven项目springcloud-config-server-3344模块

3.2 导入依赖

springcloud-config-server-3344 : 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>springcloud</artifactId>
        <groupId>com.lv</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-config-server-3344</artifactId>

    <dependencies>
        <!--spring-cloud-config-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

3.3 编写配置文件

在resources目录下,新建一个application.yaml配置文件

springcloud-config-server-3344 : src/main/resources/application.yaml

server:
  port: 3344

spring:
  application:
    name: springcloud-config-server
    #连接远程仓库
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/lv1024/springcloud-config.git #码云仓库的https地址
#通过 config-server 可以连接到git,访问其中的资源以及配置~

3.4 编写主启动类

创建包结构com.lv.springcloud,并在该包下新建一个主启动类Config_Server_3344.java

springcloud-config-server-3344 : src/main/java/com/lv/springcloud/Config_Server_3344.java

package com.lv.springcloud;

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

@EnableConfigServer //开启spring cloud config server服务
@SpringBootApplication
public class Config_Server_3344 {
    public static void main(String[] args) {
        SpringApplication.run(Config_Server_3344.class,args);
    }
}

3.5 测试

运行springcloud-config-server-3344模块,通过Http服务访问资源有如下格式

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

我们使用的是yaml配置文件,下面按照格式依次测试一下,http://localhost:3344/application-dev.yml

http://localhost:3344/application/test/master

http://localhost:3344/master/application-dev.yml

如果测试访问不存在的配置则不显示 如:http://localhost:3344/master/application-aaa.yml

4 搭建客户端

4.1 新建config-client.yaml文件

在gitee远程仓库对应的本地项目目录下新建一个config-client.yaml文件

编写config-client.yaml

spring:
 profiles:
  active: dev

---
server:
 port: 8201
#spring的配置
spring:
 profiles: dev
 application:
  name: springcloud-provider-dept

#Eureka的配置,服务注册到哪里
eureka:
 client:
  service-url:
   defaultZone: http://eureka7001.com:7001/eureka/

---
server:
 port: 8202
#spring的配置
spring:
 profiles: test
 application:
  name: springcloud-provider-dept

#Eureka的配置,服务注册到哪里
eureka:
 client:
  service-url:
   defaultZone: http://eureka7001.com:7001/eureka/

4.2 将config-client.yaml提交到码云仓库

这一步骤与本篇博客2.6完全相同

查看码云仓库,确认yaml文件成功提交

4.3 创建项目

在父工程新建一个普通的maven项目springcloud-config-client-3355模块

4.4 导入依赖

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

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

    <dependencies>
        <!--config-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

4.5 编写配置文件

在resources目录下,新建两个配置文件application.yaml和bootstrap.yaml

springcloud-config-client-3355 : src/main/resources/application.yaml

# 用户级别的配置
spring:
  application:
    name: springcloud-config-client-3355

springcloud-config-client-3355 : src/main/resources/bootstrap.yaml

# 系统级别的配置
spring:
  cloud:
    config:
      name: config-client # 需要从git上读取的资源名称,不要后缀
      profile: dev
      label: master
      uri: http://localhost:3344

4.6 编写控制层

创建包结构com.lv.springcloud.controller,并在该包下新建ConfigClientController.java

springcloud-config-client-3355 : src/main/java/com/lv/springcloud/controller/ConfigClientController.java

package com.lv.springcloud.controller;

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

@RestController
public class ConfigClientController {
    @Value("${spring.application.name}")
    private String applicationName; //获取微服务名称

    @Value("${eureka.client.service-url.defaultZone}")
    private String eurekaServer; //获取Eureka服务

    @Value("${server.port}")
    private String port; //获取服务端的端口号

    @RequestMapping("/config")
    public String getConfig(){
        return "applicationName:"+applicationName +
                "eurekaServer:"+eurekaServer +
                "port:"+port;
    }
}

4.7 编写主启动类

在controller包同级目录下创建主启动类

springcloud-config-client-3355 : src/main/java/com/lv/springcloud/ConfigClient_3355.java

package com.lv.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

4.8 测试

启动服务端springcloud-config-server-3344 再启动客户端springcloud-config-client-3355,访问http://localhost:8201/config/

成功读取到了远程仓库的配置

5 远程配置测试

总体思路就是不在本地项目中编写配置文件,而是将配置文件放到码云仓库中,然后再将远端的配置文件应用到项目中

5.1 新建两个配置文件

在gitee远程仓库对应的本地项目目录下新建config-eureka.yaml文件和config-dept.yaml文件

编写两个配置文件中的内容

config-eureka.yaml

spring:
 profiles:
  active: dev

---

server:
  port: 7001

#spring的配置
spring:
 profiles: dev
 application:
  name: springcloud-config-eureka

#Eureka配置
eureka:
  instance:
    hostname: eureka7001.com #Eureka服务端的实例名称
  client:
    register-with-eureka: false #表示是否向eureka注册中心注册自己
    fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心
    service-url:
      #单机:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      #集群(关联):
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

---

server:
  port: 7001

#spring的配置
spring:
 profiles: test
 application:
  name: springcloud-config-eureka

#Eureka配置
eureka:
  instance:
    hostname: eureka7001.com #Eureka服务端的实例名称
  client:
    register-with-eureka: false #表示是否向eureka注册中心注册自己
    fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心
    service-url:
      #单机:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      #集群(关联):
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

config-dept.yaml

spring:
 profiles:
  active: dev

---

server:
  port: 8001

#mybatis配置
mybatis:
  type-aliases-package: com.lv.springcloud.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

#spring的配置
spring:
  profiles: dev
  application:
    name: springcloud-config-dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource #数据源
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db01?useSSL=false&useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456

#Eureka的配置,服务注册到哪里
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: springcloud-provider-dept8001 #修改eureka上的默认描述信息!

#info配置
info:
  app.name: lv1024-springcloud
  company.name: blog.lv1024.com


---

server:
  port: 8001

#mybatis配置
mybatis:
  type-aliases-package: com.lv.springcloud.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

#spring的配置
spring:
  profiles: test
  application:
    name: springcloud-config-dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource #数据源
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db02?useSSL=false&useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456

#Eureka的配置,服务注册到哪里
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: springcloud-provider-dept8001 #修改eureka上的默认描述信息!

#info配置
info:
  app.name: lv1024-springcloud
  company.name: blog.lv1024.com

5.2 将config-eureka.yaml文件和config-dept.yaml提交到码云仓库

这一步骤与本篇博客2.6完全相同

查看码云仓库,确认两个文件成功提交

5.3 创建项目

在父工程下新建两个maven项目springcloud-config-eureka-7001模块和springcloud-config-dept-8001模块,并将springcloud-eureka-7001模块中的内容复制到springcloud-config-eureka-7001模块,把springcloud-provider-dept-8001模块中的内容复制到springcloud-config-dept-8001模块.

5.4 修改springcloud-config-eureka-7001模块

在pom文件中添加config依赖

springcloud-config-eureka-7001 : pom.xml

<!--config-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

清空该模块的application.yml配置,并添加应用名称即可

springcloud-config-eureka-7001 : src/main/resources/application.yaml

spring:
  application:
    name: springcloud-config-eureka-7001

在resources目录下新建bootstrap.yml配置文件连接远程配置

springcloud-config-eureka-7001 : src/main/resources/bootstrap.yaml

spring:
  cloud:
    config:
      name: config-eureka # 仓库中的配置文件名称
      label: master
      profile: dev
      uri: http://localhost:3344

修改主启动类的名字

springcloud-config-eureka-7001 : src/main/java/com/lv/springcloud/ConfigEurekaServer_7001.java

package com.lv.springcloud;

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

//启动之后,访问http://localhost:7001/
@SpringBootApplication
@EnableEurekaServer //表示这个类是服务端的启动类,可以接收别人注册进来~
public class ConfigEurekaServer_7001 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigEurekaServer_7001.class,args);
    }
}

5.5 修改springcloud-config-dept-8001模块

在pom文件中添加config依赖

springcloud-config-dept-8001 : pom.xml

<!--config-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

清空该模块的application.yml配置,并添加应用名称即可

springcloud-config-dept-8001 : src/main/resources/application.yaml

spring:
  application:
    name: springcloud-config-dept-8001

在resources目录下新建bootstrap.yml配置文件连接远程配置

springcloud-config-dept-8001 : src/main/resources/bootstrap.yaml

spring:
  cloud:
    config:
      name: config-dept
      label: master
      profile: dev
      uri: http://localhost:3344

修改主启动类的名字

springcloud-config-dept-8001 : src/main/java/com/lv/springcloud/ConfigDeptProvider_8001.java

package com.lv.springcloud;

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

//启动类
@SpringBootApplication
@EnableEurekaClient// 在服务启动后自动注册到Eureka中
@EnableDiscoveryClient //服务发现
public class ConfigDeptProvider_8001 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigDeptProvider_8001.class,args);
    }
}

5.6 测试

启动springcloud-config-server-3344,访问http://localhost:3344/master/config-eureka-dev.yml

远程仓库的配置文件内容访问成功,接下来依次启动springcloud-config-client-3355,springcloud-config-eureka-7001,springcloud-config-dept-8001,访问http://localhost:7001/

注册中心启动成功,并且springcloud-config-dept-8001模块成功注册,说明远程仓库的配置文件全部生效,接下来查询一下数据库的内容

数据查询成功

posted @ 2022-03-29 13:19  从0开始丿  阅读(235)  评论(0编辑  收藏  举报