使用SpringCloud提供的配置中心动态修改配置初入篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、快速开始

使用SpringCloud配置中心需要创建配置中心服务端(存储配置和修改配置)和配置中心客户端(拉取配置动态更新);本次功能实现需要搭建三个项目eureka-swaggers、config-server-6001、config-client-6080

准备注册中心

1、目录结构:
在这里插入图片描述
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>

    <groupId>org.example</groupId>
    <artifactId>eureka-swaggers</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <maven.compiler.version>2.3.2</maven.compiler.version>
    </properties>
    
	<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <!--健康检测管理中心 ,可刷新配置文件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    
        <!--swagger  下面2个配置可以不要-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.version}</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

启动类:

package com.semptian;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication
@EnableEurekaServer
@EnableSwagger2
public class EurekaApp {

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

配置文件application.yml

server:
  port: 8761
eureka:
  instance:
    hostname: 127.0.0.1  #eureka服务端实例名称,可以写别的前提是有配置vi /etc/hosts
  client:
    #false表示不向注册中心注册自己
    register-with-eureka: true
    #表示自己端就是注册中心,我的职责就是维护实例,并不需要去检索服务
    fetch-registry: false
    service-url:
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
      #单机版,指向自己
      defaultZone: http://127.0.0.1:8761/eureka/
spring:
  application:
    name: eureka-swaggers

准备配置中心服务端

1、目录结构:
在这里插入图片描述
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.semptian</groupId>
    <artifactId>config-server-6001</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-server-6001</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--配置中心-客户端依赖包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <!--健康检测管理中心 ,可刷新配置文件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--配置中心-服务端依赖包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <!--eureka 注册中心依赖包 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <!--<proc>none</proc>-->
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

启动类:

package com.semptian.configserver6001;

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;

/**
 * @author Administrator
 */
@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class ConfigServer6001Application {

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

}


配置文件application.properties

# 设置本机服务名称
spring.application.name=config-server-6001
# 设置本机服务端口
server.port=6001
#配置的Git仓库的地址
spring.cloud.config.server.git.uri=https://gitee.com/Fang_zhu/file-online-preview
#分支
spring.cloud.config.label=master
#git仓库地址下的相对地址 多个用逗号","分割。
spring.cloud.config.server.git.search-paths=/blob/master/gittest.properties,/blob/master/README.md
#git仓库的账户
spring.cloud.config.server.git.username=Fang_zhu
#git仓库的密码
spring.cloud.config.server.git.password=xxxxxxxxx

git路径配置文件展示:
在这里插入图片描述

在这里插入图片描述

准备配置中心客户端

1、目录结构:
在这里插入图片描述

2、依赖配置pom.xml:
这里需要额外注意不能添加
配置中心-服务端依赖包

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.semptian</groupId>
    <artifactId>config-client-6080</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-client-6080</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--eureka 注册中心依赖包 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!--配置中心-客户端依赖包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <!--健康检测管理中心 ,可刷新配置文件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


3、启动类:

package com.semptian.configclient6080;

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

/**
 * @author Administrator
 */
@SpringBootApplication
@EnableDiscoveryClient
public class ConfigClient6080Application {

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

}

4、controller层文件:这里@RefreshScope注解结合配置中心是实现动态刷新配置的关键点

package com.semptian.configclient6080.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;

@RefreshScope
@RestController
public class GetController {

    @Value("${yourname}")
    private String namestr;
    
    @RequestMapping(value = "/getname", method = RequestMethod.GET)
    public String getConfig() {
        String str = "获取远程配置文件信息:" + namestr + "===" + new Date();
        System.out.println(str);
        return str;
    }
    
}

5、配置文件一定要使用优先级最高的bootstrap.properties文件,不然会导致服务启动报错,其中最关键的是指定配置中心的service-id,spring.cloud.config.discovery.serviceId=???这个是实现配置中心客户端连接服务端的关联点,id名等于之前config-server-6001服务配置的spring.application.name。

#工程名/项目名/应用名/服务名
spring.application.name=config-client-6080
#端口号
server.port=6080
#获取指定配置文件名称 ,多个则以英文符号 , 隔开,不可有空格
spring.cloud.config.name=gittest
#  ,configText ,gittest2
#经过测试发现,在不同文件【可能是properties或者yml】,如果其中有相同的字段,那么左边的文件的这个字段的值会被右边文件的覆盖,不区分properties和yml优先级
#
#
#获取配置信息,客户端不需要管这个文件是从git来的还是在服务端的本地文件
#
#获取配置的策略 , 读取文件:dev开发环境、test测试、pro生产
spring.cloud.config.profile=dev
#spring.cloud.config.profile.active=dev
#获取配置文件的分支,默认是master。如果是是本地获取的话,则无用,
spring.cloud.config.label=master
#开启配置信息发现
spring.cloud.config.discovery.enabled=true
#
#指定配置中心的service-id,便于扩展为高可用配置集群,不区分大小写
spring.cloud.config.discovery.serviceId=config-server-6001
#使用这个写法也一样,至于为啥有两种写法,还不清除
#spring.cloud.config.discovery.service-id=config-service
#
#是否启动快速失败功能,功能开启则优先判断config server是否正常,可开可不开
#spring.cloud.config.fail-fast=true
#
#
#这个是设置与Eureka Server交互的地址,客户端的查询服务和注册服务都需要依赖这个地址。
#eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
#
#springboot 1.5.X 以上默认开通了安全认证,这里可加可不加,不影响
#management.security.enabled=false
#springboot 2.x 默认只开启了info、health的访问接口,*代表开启所有访问接口
management.endpoints.web.exposure.include=*

6、查看远程配置文件是否加载成功:
访问路径:/{name}-{profiles}.properties
在这里插入图片描述
如:访问本次的配置文件地址http://localhost:6001/gittest-test.properties
在这里插入图片描述
其中后缀名profiles可以是dev开发、test测试、pro生产环境,也可以是其它自定义的,但访问类型一定是name-profile形式的不然会报错。

7、调用程序查看配置是否成功拉取:
在这里插入图片描述
8、更改配置查看配置是否实现热更新:
http://localhost:6080/actuator/refresh(一定要是post请求)
也可以通过win+r输入cmd进行运行环境,输入:curl -X POST http://localhost:6080/actuator/refresh
动态进行同步
在这里插入图片描述
再次拉取:
在这里插入图片描述
我这里输入了汉字,很明显出现了乱码。

总结

提示:这里对文章进行总结:
使用注册中心和配置中心加git就可以实现远程访问了,但是仔细观察的开发人员就会发现配置中心服务端在配置更新时会打印本地配置文件地址:C:\Users\Administrator\AppData\Local\Temp\config-repo-8075588332152283263\gittest.properties
在这里插入图片描述
点开查看后会发现和git上面的一致,这就引出了接下来的,如何实现本地配置更新动态刷新服务配置的进阶篇。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值