欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一起来学Spring Cloud | 第七章:分布式配置中心(Spring Cloud Config)

程序员文章站 2022-04-08 14:08:09
上一章节,我们讲解了服务网关zuul,本章节我们从git和本地两种存储配置信息的方式来讲解springcloud的分布式配置中心-Spring Cloud Config。 一、Spring Cloud Config简介: Spring Cloud Config项目是一个解决分布式系统的配置管理方案。 ......

上一章节,我们讲解了服务网关zuul,本章节我们从git和本地两种存储配置信息的方式来讲解springcloud的分布式配置中心-spring cloud config。

一、spring cloud config简介:

spring cloud config项目是一个解决分布式系统的配置管理方案。它包含了client和server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。

二、新建springcloud-config-server模块:

1. 参考:一起来学spring cloud | 第一章 :如何搭建一个多模块的springcloud项目 来新建一个基本模块结构

2. 修改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">
	<modelversion>4.0.0</modelversion>

	<parent>
		<groupid>com.haly</groupid>
		<artifactid>springcloud</artifactid>
		<version>0.0.1-snapshot</version>
	</parent>

	<groupid>com.haly</groupid>
	<artifactid>springcloud-config-server</artifactid>
	<version>0.0.1-snapshot</version>
	<name>springcloud-config-server</name>
	<description>新建一个config server项目</description>

	<dependencies>
		<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.cloud</groupid>
            <artifactid>spring-cloud-config-server</artifactid>
        </dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupid>org.springframework.boot</groupid>
				<artifactid>spring-boot-maven-plugin</artifactid>
			</plugin>
		</plugins>
	</build>
	
</project>

3. 新建入口启动类springcloudconfigserverapplication

@enableconfigserver,表示开启config server

package com.haly;

import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.cloud.client.discovery.enablediscoveryclient;
import org.springframework.cloud.config.server.enableconfigserver;

@enableconfigserver
@springbootapplication
@enablediscoveryclient
public class springcloudconfigserverapplication {
	  public static void main(string[] args) {
			springapplication.run(springcloudconfigserverapplication.class, args);
	    }

}

4. 修改application.properties文件(git方法存储配置)

在github上创建一个项目,并在上面添加配置文件config-client.properties,配置文件里添加一个属性config=newconfig !

application.properties中配置服务信息以及git信息

spring.application.name=springcloud-config-server
server.port=7001
eureka.client.serviceurl.defaultzone=http://localhost:8761/eureka/

spring.cloud.config.server.git.uri=https://github.com/funrily/springcloud-study/
spring.cloud.config.server.git.searchpaths=config-repo
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password

启动工程 config server,浏览器输入:http://localhost:7001/config-client/default/master,得到结果如下

{
    "name": "config-client",
    "profiles": [
        "default"
    ],
    "label": null,
    "version": "52b88000fc46a8b1d72a2979f4721d45a3d1f429",
    "state": null,
    "propertysources": [
        {
            "name": "https://github.com/funrily/springcloud-study//config-repo/config-client.properties",
            "source": {
                "configword": "newconfig !"
            }
        }
    ]
}

三、新建springcloud-config模块(可不要):

其实我在工作中喜欢创建一个springcloud-config模块,没有业务代码,只有pom.xml文件和resources目录,resources放一下公共的配置文件,可以给其它模块引用

例如配置:

spring-data-mysql.xml 文件

spring-data-redis-single.xml 文件

spring-jdbc-mysql.xml 文件

bootstrap.yml 配置文件

1. 新增pom.xml文件

<?xml version="1.0"?>
<project
        xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
        xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance">
    <modelversion>4.0.0</modelversion>
    <parent>
        <groupid>com.sinaif</groupid>
        <artifactid>sinaif-weibo-opt</artifactid>
        <version>1.0.0-snapshot</version>
        <relativepath>../pom.xml</relativepath>
    </parent>

    <groupid>com.sinaif</groupid>
    <artifactid>sinaif-config</artifactid>
    <name>${project.artifactid}</name>

    <properties>
        <project.build.sourceencoding>utf-8</project.build.sourceencoding>
    </properties>
    <dependencies>
        <dependency>
            <groupid>junit</groupid>
            <artifactid>junit</artifactid>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>

2. 新增bootstrap.yml文件(可以统一配置config,eureka ,hystrix等待)

注意这里是bootstrap.properties而不是appliction.properties因为bootstrap.properties会在应用启动之前读取,而spring.cloud.config.uri会影响应用启动

spring:
    cloud:
        config:
            name: config-client
            profile: default
            label: master
            uri: http://localhost:7001/
            
eureka:
    client:
        serviceurl:
            defaultzone: http://localhost:8761/eureka/
    

上面配置config属性的规则,以及前面我们直接用 http://localhost:7001/config-client/default/master 访问配置的规则

url与配置文件的映射关系

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

application是config-client-dev.properties文件中的config-client值,profile是一个active的profile,一般用来表示环境信息,label是一个可选的标签,一般用来表示目录名称。
比如,我在github上的文件名是config-client.properties,在github上都是default环境,默认为master分支。所以就是/config-client/default/master

四、新建springcloud-config-server 的client模块:

我用之前写过的springcloud-feign-client模块,在feigncontroller类里增加一个/testconfig方法充当client端,springcloud-feign-client模块内容参考:一起来学spring cloud | 第四章:服务消费者 ( feign )

1. 在pom.xml文件中,增加上面新建的模块的依赖包,这样我们就能使用springcloud-config模块中的eureka和config配置

 <dependency>
            <groupid>com.haly</groupid>
            <artifactid>springcloud-config</artifactid>
            <version>0.0.1-snapshot</version>
  </dependency>

2. 在feigncontroller类中增加一个测试方法

@value("${configword}")
string configword;

@getmapping(value = "/testconfig") public string testconfig(@requestparam string name) {
return name +",git配置值:" + configword ;

}

3.  启动服务,进行测试

依次启动springcloud-eureka-server模块,启动springcloud-config-server模块,启动springcloud-feign-client模块

访问:http://localhost:9600/testconfig?name=young码农,返回结果 :

young码农,git配置值:newconfig !

五、使用本地配置获取配置项:

1. 修改springcloud-config-server模块中的application.properties配置如下 

spring.application.name=springcloud-config-server
server.port=7001
eureka.client.serviceurl.defaultzone=http://localhost:8761/eureka/

# 表示使用本地config配置
spring.profiles.active=native
# 表示本地配置读取的目录文件位置
spring.cloud.config.server.native.searchlocations: classpath:/config/

2. 在springcloud-config-server模块resources目录下新建一个config文件,在config文件下新建2个配置文件,配置项内容如下:

configs-dev.properties:configword: dev-configword

configs-test.properties:configword: test-configword

3. 修改springcloud-config模块的bootstrap.yml配置文件的config配置

ps: 目前我们设置的profile为dev,所以会从configs-dev.properties配置文件中读取数据

spring:
    cloud:
        config:
            name: configs
            profile: dev
            label: config
            uri: http://localhost:7001/
            
eureka:
    client:
        serviceurl:
            defaultzone: http://localhost:8761/eureka/

4. 启动服务,运行结果

依次启动springcloud-eureka-server模块,启动springcloud-config-server模块,启动springcloud-feign-client模块

先访问config-server,浏览器输入:http://localhost:7001/configs/dev/config

{
    "name": "configs",
    "profiles": [
        "dev"
    ],
    "label": "config",
    "version": null,
    "state": null,
    "propertysources": [
        {
            "name": "classpath:/config/configs-dev.properties",
            "source": {
                "configword": "dev-configword"
            }
        }
    ]
}

在访问config-client,浏览器输入:http://localhost:9600/testconfig?name=young码农,返回结果如下:

young码农,git配置值:dev-configword

5. 修改springcloud-config模块的bootstrap.yml配置文件的profile属性:

ps: 目前我们设置的profile为dev,所以会从configs-test.properties配置文件中读取数据

spring:
    cloud:
        config:
            name: configs
            profile: test
            label: config
            uri: http://localhost:7001/        

6.  再次启动服务,运行结果

依次启动springcloud-eureka-server模块,启动springcloud-config-server模块,启动springcloud-feign-client模块

先访问config-server,浏览器输入:http://localhost:7001/configs/dev/config

{
    "name": "configs",
    "profiles": [
        "test"
    ],
    "label": "config",
    "version": null,
    "state": null,
    "propertysources": [
        {
            "name": "classpath:/config/configs-test.properties",
            "source": {
                "configword": "test-configword"
            }
        }
    ]
}

在访问config-client,浏览器输入:http://localhost:9600/testconfig?name=young码农,返回结果如下:

young码农,git配置值:test-configword