spring cloud -- 5.分布式配置中心(Spring Cloud Config)

本文介绍如何使用Spring Cloud Config实现分布式系统的配置管理,包括服务端和客户端的具体配置过程及实战演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此文章是看了方志朋老师的教材自己写的框架demo:

学习spring cloud推荐大家看下方志朋老师的史上最简单的 SpringCloud 教程 | 终章,地址如下:

   https://blog.youkuaiyun.com/forezp/article/details/70148833 


1.简介和作用

在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。

2.代码实现

因为我们公司用的管理工具是svn,所以主要演示svn的远程配置读取

创建本地svn库,新建一个config-client-dev.properties配置文件放在config文件夹下,配置文件内容为:

good:immo


2.1 创建远程配置服务端

1.新建maven项目 immo-config-service




2.pom.xml添加依赖

<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>com.immo</groupId>

  <artifactId>immo-config-service</artifactId>

  <version>0.0.1-SNAPSHOT</version>

 <!-- spring boot 依赖包 -->

  <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>1.5.2.RELEASE</version>

        <relativePath/> 

   </parent>

   

   <!-- 编码和java版本 -->

   <properties>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <java.version>1.7</java.version>

    </properties>

    

    <dependencies>

    <dependency>

        <groupId>org.springframework.cloud</groupId>

        <artifactId>spring-cloud-config-server</artifactId>

    </dependency>

     <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-eureka</artifactId>

        </dependency>

    <dependency>

        <groupId>org.tmatesoft.svnkit</groupId>

        <artifactId>svnkit</artifactId>

    </dependency>

</dependencies>

<dependencyManagement>  

    <dependencies>  

      <dependency>  

        <groupId>org.springframework.cloud</groupId>  

        <artifactId>spring-cloud-dependencies</artifactId>  

        <version>Camden.SR7</version>  

        <type>pom</type>  

        <scope>import</scope>  

      </dependency>  

    </dependencies>  

  </dependencyManagement>  

</project>

 

3.编写启动类和配置文件

编写application.properties

#端口

server.port=9300

#svn-url

spring.cloud.config.server.svn.uri=https://pc201588754678:8443/svn/cloudcofig

#svn userName

spring.cloud.config.server.svn.username=123

#svn passWord

spring.cloud.config.server.svn.password=123

#此svn下哪个路径,默认 trunk

spring.cloud.config.server.default-label=config

#告诉spring要调用的服务是svn

spring.profiles.active=subversion

#要发布到eureka的服务名

spring.application.name=config-service

#eureka 地址

eureka.client.serviceUrl.defaultZone=http://localhost:9000/eureka/

编写ConfigServiceApplication.java

@EnableConfigServer注解开启配置服务器的功能

package com.immo;

 

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.config.server.EnableConfigServer;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

 

@EnableConfigServer

@SpringBootApplication

@EnableEurekaClient

public class ConfigServiceApplication {

public static void main(String[] args) {

SpringApplication.run(ConfigServiceApplication.class, args);

}

}

 

 

4.测试,先后启动immo-eurekaimmo-config-service访问localhost:9000(服务已经注册):

访问 http://localhost:9300/config-client-dev.properties(说明能获取到svn远程配置文件):


2.2创建远程配置服务客户端

1.创建maven项目 immo-config-client



2.pom.xml添加依赖:

<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>com.immo</groupId>

<artifactId>immo-config-client</artifactId>

<version>0.0.1-SNAPSHOT</version>

<!-- spring boot 依赖包 -->

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>1.5.2.RELEASE</version>

<relativePath />

</parent>

<!-- 编码和java版本 -->

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.7</java.version>

</properties>

 

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-config</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-eureka</artifactId>

</dependency>

<!-- spring mvc -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

</dependencies>

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-dependencies</artifactId>

<version>Camden.SR7</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

</project>

 

 

 

3.创建配置文件和启动类以及测试接口

搭建srpingcloud-config server端的时候,配置文件可以用application.yml或者application.properties,但是在config client要使用bootstrap.ymlbootstrap.properties,因为bootstrap.properties的加载优先于application.properties

编写bootstrap.properties

#这里需要注意这里的 {spring.cloud.config.name}-{spring.cloud.config.profile}=svn需要调用的xxxx.properties

#例如我们现在需要远程调用的配置文件名字为     config-client-dev.properties

spring.cloud.config.name=config-client

## 要读取的配置文件profile属性,默认是dev    dev开发环境配置文件   test测试环境   pro正式环境  可填写多个,用逗号(,)隔开

spring.cloud.config.profile=dev

#读取svn服务项目的地址

spring.cloud.config.uri=http://localhost:9300/

 

编写application.properties

#eureka 服务地址

eureka.client.serviceUrl.defaultZone=http://localhost:9000/eureka/

#注册的服务名称

spring.application.name=config-client

#项目端口

server.port=9400

#是否开启安全认证 默认开启

management.security.enabled=false

编写ConfigClientController.java:

@RefreshScope:监听配置文件改动

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

 

@RestController

@RefreshScope

public class ConfigClientController {

 

@Value("${good}")

private String param;

@RequestMapping(value="/getParam",method=RequestMethod.GET)

public String getSvnParam(){

return "从svn中获得的参数为:"+param;

}

}

 

编写ConfigClientApplication.java:

package com.immo;

 

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

 

@SpringBootApplication

@EnableEurekaClient

public class ConfigClientApplication {

public static void main(String[] args) {

SpringApplication.run(ConfigClientApplication.class, args);

}

}

 

 

 

4.测试,先后启动immo-eurekaimmo-config-serviceimmo-config-client(进入管理界面):

测试是否从数据获得数据,访问 http://localhost:9400/getParam  (成功拿到了)

测试修改svn配置文件后数据是否马上更新:

修改后提交,再次访问次,你会发现没有改变:

Spring Cloud Config分服务端和客户端,服务端负责将git(svn)中存储的配置文件发布成REST接口,客户端可以从服务端REST接口获取配置。但客户端并不能主动感知到配置的变化,从而主动去获取新的配置。客户端如何去主动获取新的配置信息呢,springcloud已经给我们提供了解决方案,每个客户端通过POST方法触发各自的/refresh

手动调用/refresh方法-post方式:

然后在重新调用接口,看是否修改(成功):


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值