SpringCloud之配置中心svn示例和refresh

news/2024/9/18 9:29:31/ 标签: spring cloud

SpringCloud之配置中心svn示例和refresh

上一篇配置中心git示例留了一个小问题,当重新修改配置文件提交后,客户端获取的仍然是修改前的信息,这个

问题我们先放下,待会再讲。国内很多公司都使用的svn来做代码的版本控制,我们先介绍以下如何使svn+Spring

Cloud Config来做配置中心。

1、svn版本

同样先示例server端的代码,基本步骤一样。

1.1 添加依赖

<?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>1.5.3.RELEASE</version><relativePath/></parent><groupId>com.example</groupId><artifactId>spring-cloud-config-server</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-cloud-config-server</name><description>spring-cloud-config-server</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Dalston.RELEASE</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</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>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

需要多引入svnkitr包

1.2 配置文件

server:port: 8001
spring:cloud:config:server:svn:uri: http://192.168.0.6/svn/repo/config-repousername: usernamepassword: passworddefault-label: trunkprofiles:active: subversionapplication:name: spring-cloud-config-server

和git版本稍有区别,需要显示声明subversion。

1.3 启动类

启动类没有变化,添加@EnableConfigServer激活对配置中心的支持

package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigServerApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudConfigServerApplication.class, args);}}

1.4 测试

服务端测试,访问:http://localhost:8001/neo-config-dev.properties,返回:neo.hello: hello im

dev,说明服务端可以正常读取到svn代码库中的配置信息。修改配置文件neo-config-dev.properties中配置

信息为:neo.hello=hello im dev update,再次在浏览器访问http://localhost:8001/neo-config-

dev.properties,返回:neo.hello: hello im dev update。说明server端会自动读取最新提交的内容。

2、客户端

2.1 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 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>1.5.3.RELEASE</version><relativePath/></parent><groupId>com.example</groupId><artifactId>spring-cloud-config-client</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-cloud-config-client</name><description>spring-cloud-config-client</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Dalston.RELEASE</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><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></dependency></dependencies><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><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.2 配置文件

application.properties

spring.application.name=spring-cloud-config-client
server.port=8002

bootstrap.properties

spring.cloud.config.name=neo-config
spring.cloud.config.profile=dev
spring.cloud.config.uri=http://localhost:8001/
spring.cloud.config.label=trunk

2.3 控制器

package com.example.web;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
class HelloController {@Value("${neo.hello}")private String hello;@RequestMapping("/hello")public String from() {return this.hello;}
}

2.4 启动类

package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringCloudConfigClientApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudConfigClientApplication.class, args);}}

客户端测试:客户端直接使用上一篇示例项目spring-cloud-config-client来测试,配置基本不用变动。启动

项目后访问:http://localhost:8002/hello,返回:hello im dev update说明已经正确的从server端获

取到了参数。同样修改svn配置并提交,再次访问http://localhost:8002/hello依然获取的是旧的信息,和git

版本的问题一样。

3、refresh

现在来解决上一篇的遗留问题,这个问题在svn版本中依然存在。Spring Cloud Config分服务端和客户端,服务端

负责将git(svn)中存储的配置文件发布成REST接口,客户端可以从服务端REST接口获取配置。但客户端并不能

主动感知到配置的变化,从而主动去获取新的配置。客户端如何去主动获取新的配置信息呢,springcloud已经给

我们提供了解决方案,每个客户端通过POST方法触发各自的/refresh

3.1 添加依赖

<?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>1.5.3.RELEASE</version><relativePath/></parent><groupId>com.example</groupId><artifactId>spring-cloud-config-client-refresh</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-cloud-config-client-refresh</name><description>spring-cloud-config-client-refresh</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Dalston.RELEASE</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><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><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

增加了spring-boot-starter-actuator包,spring-boot-starter-actuator是一套监控的功能,可以监控

程序在运行时状态,其中就包括/refresh的功能。

3.2 开启更新机制

需要给加载变量的类上面加载@RefreshScope,在客户端执行/refresh的时候就会更新此类下面的变量值。

package com.example.web;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.RestController;@RestController
@RefreshScope
// 使用该注解的类,会在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中。
class HelloController {@Value("${neo.hello}")private String hello;@RequestMapping("/hello")public String from() {return this.hello;}
}
package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringCloudConfigClientRefreshApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudConfigClientRefreshApplication.class, args);}}
spring.application.name=spring-cloud-config-client
server.port=8002
management.security.enabled=false
spring.cloud.config.name=neo-config
spring.cloud.config.profile=dev
spring.cloud.config.uri=http://localhost:8001/
spring.cloud.config.label=trunk

3.3 测试

springboot 1.5.X 以上默认开通了安全认证,所以需要在配置文件application.properties添加以下配置

management.security.enabled=false

OK 这样就改造完了,以post请求的方式来访问http://localhost:8002/refresh 就会更新修改后的配置文

件。

我们再次来测试,首先访问http://localhost:8002/hello,返回:hello im dev,我将库中的值修改为

hello im dev update

在win上面打开cmd执行curl -X POST http://localhost:8002/refresh,返回["neo.hello"]说明已经更

新了neo.hello的值。

我们再次访问http://localhost:8002/hello,返回:hello im dev update,客户端已经得到了最新的值。

每次手动刷新客户端也很麻烦,有没有什么办法只要提交代码就自动调用客户端来更新呢,github的webhook是

一个好的办法。

4、webhook

WebHook是当某个事件发生时,通过发送http post请求的方式来通知信息接收方。Webhook来监测你在

Github.com上的各种事件,最常见的莫过于push事件。如果你设置了一个监测push事件的Webhook,那么每当

你的这个项目有了任何提交,这个Webhook都会被触发,这时Github就会发送一个HTTP POST请求到你配置好的

地址。

如此一来,你就可以通过这种方式去自动完成一些重复性工作,比如,你可以用Webhook来自动触发一些持续集

成(CI)工具的运作,比如Travis CI;又或者是通过 Webhook 去部署你的线上服务器。下图就是github上面的

webhook配置。

在这里插入图片描述

  • Payload URL :触发后回调的URL

  • Content type :数据格式,两种一般使用json

  • Secret :用作给POST的body加密的字符串,采用HMAC算法

  • events :触发的事件列表。

events事件类型描述
push仓库有push时触发,默认事件
create当有分支或标签被创建时触发
delete当有分支或标签被删除时触发

svn也有类似的hook机制,每次提交后会触发post-commit脚本,我们可以在这里写一些post请求

这样我们就可以利用hook的机制去触发客户端的更新,但是当客户端越来越多的时候hook支持的已经不够优雅,

另外每次增加客户端都需要改动hook也是不现实的。其实Spring Cloud给了我们更好解决方案,后面文章来介

绍。


http://www.ppmy.cn/news/1526363.html

相关文章

github域名与IP变更导致无法推送分支问题的解决

问题 当执行推送命令的时候&#xff0c;出现如下错误&#xff1a; $ git push fork my_branch WARNING: POSSIBLE DNS SPOOFING DETECTED! The RSA host key for github.com has changed, and the key for the corresponding IP address 20.205.243.166 is unk…

[网络]从零开始的计算机网络基础知识讲解

一、本次教程的目的 本次教程我只会带大叫了解网络的基础知识&#xff0c;了解网络请求的基本原理&#xff0c;为后面文章中可能会用到网络知识做铺垫。本次我们只会接触到网络相关的应用层&#xff0c;并不涉及协议的具体实现和数据转发的规则。也就是说&#xff0c;这篇教程是…

Java发邮件:如何配置SMTP服务器实现发信?

Java发邮件功能实现的教程&#xff1f;Java发邮件的方式有哪些&#xff1f; 无论是用于用户注册确认、密码重置&#xff0c;还是系统通知&#xff0c;Java发邮件都是不可或缺的一部分。AokSend将详细介绍如何配置SMTP服务器&#xff0c;以便在Java发邮件时能够顺利发送邮件。 …

python画图|3D参数化图形输出

前面已经学习了基本的3D作图&#xff0c;具体链接如下&#xff1a; 基础教程&#xff1a;python画图|3D图基础教程-CSDN博客 直方图教程&#xff1a;python画图|3D直方图基础教程-CSDN博客 垂线标记教程&#xff1a;python画图|3D垂线标记-CSDN博客 3D surface教程&#xf…

有了数据中台,是否需要升级到数据飞轮?怎么做才能升级到数据飞轮?

在数字化转型的时代&#xff0c;企业纷纷建设了“数据中台”&#xff0c;把各种业务数据整合在一起&#xff0c;仿佛是将所有材料都整理进了厨房的储物柜。 但是问题是&#xff1a;光有储物柜&#xff0c;能做出好吃的菜吗&#xff1f;答案显然是否定的。想要真正利用这些数据…

Vue 3 中 useRouter 与 useRoute 的深度解析

在 Vue 3 中&#xff0c;vue-router 提供了两个非常重要的 Composition API 钩子&#xff1a;useRouter 和 useRoute。这两个钩子虽然都与路由相关&#xff0c;但它们的用途和返回的数据类型截然不同。本文将详细解析这两个钩子的区别及其用法&#xff0c;帮助你在 Vue 3 应用中…

对接开源大模型应用开发平台最佳实践

本文以Dify为例介绍如何使用OpenSearch LLM智能问答版对接大模型应用开发平台构建RAG系统。 背景 随着AIGC技术日新月异的发展&#xff0c;LLM应用也在持续迭代。基于LLM、Agent框架、工作流编排能力等&#xff0c;可以搭建不同场景下丰富的应用服务。其中&#xff0c;检索增…

mac新手入门(快捷键)

系统常用快捷键 基本操作 Command-Z 撤销Command-X 剪切  Command-C 拷贝&#xff08;Copy&#xff09; Option Shift Command V 纯文本拷贝 Command-V 粘贴  Command-A 全选&#xff08;All&#xff09;Command-S 保存&#xff08;Save) Command-F 查找&#xff0…

Vue3 Day4-计算、监视属性

4.1 computed计算属性 简写形式和全写形式 <template><div>person.firstName&#xff1a;<input type"text" v-model"person.firstName" /><br />person.lastName&#xff1a;<input type"text" v-model"pers…

鸿蒙开发(NEXT/API 12)【网络连接管理】 网络篇

简介 网络连接管理提供管理网络一些基础能力&#xff0c;包括WiFi/蜂窝/Ethernet等多网络连接优先级管理、网络质量评估、订阅默认/指定网络连接状态变化、查询网络连接信息、DNS解析等功能。 说明 为了保证应用的运行效率&#xff0c;大部分API调用都是异步的&#xff0c;对…

windows检查端口占用并关闭应用

要在Windows CMD中找到占用8888端口的应用并关闭该应用&#xff0c;你可以按照以下步骤操作&#xff1a; 打开命令提示符&#xff08;CMD&#xff09;。你可以通过在搜索栏输入 cmd 或使用 Win R 快捷键&#xff0c;然后输入 cmd 并回车来打开。 查找占用8888端口的进程。在C…

探索Go语言中的随机数生成、矩阵运算与数独验证

1. Go中的随机数生成 在许多编程任务中&#xff0c;随机数的生成是不可或缺的。Go语言通过 math/rand 包提供了伪随机数生成方式。伪随机数由种子(seed)决定&#xff0c;如果种子相同&#xff0c;生成的数列也会相同。为了确保每次程序运行时产生不同的随机数&#xff0c;我们…

2-92 基于matlab的KPCA的TE过程的故障监测

基于matlab的KPCA的TE过程的故障监测&#xff0c;利用核主元分析法(KPCA)来进行故障检测的思想,将输入空间中复杂的非线性问题转化为特征空间中的线性问题&#xff0c;计算步骤&#xff1a;&#xff08;1&#xff09; 选择监控变量&#xff0c;收集正常工况下的各变量的样本&am…

堆的概念与实现

目录 一、堆的介绍 1.堆的概念 2.堆的性质&#xff1a; 3.堆的结构 二、堆的实现 1.堆的定义 2.接口函数 三、堆的实现 1.堆的初始化 2.堆的销毁 3.获取堆顶数据 4.判断堆是否为空 5. 堆的插入 向上调整算法&#xff08;重点&#xff09; 向下调整算法(重点) 6.删除…

Redisson分布式锁实现及原理详解

随着技术快速发展&#xff0c;数据规模增大&#xff0c;分布式系统越来越普及&#xff0c;一个应用往往会部署在多台机器上&#xff08;多节点&#xff09;&#xff0c;在有些场景中&#xff0c;为了保证数据不重复&#xff0c;要求在同一时刻&#xff0c;同一任务只在一个节点…

【YashanDB知识库】YAS-02025 no free space in virtual memory pool

本文转自YashanDB官网&#xff0c;具体内容请见YAS-02025 no free space in virtual memory pool 【标题】YAS-02025 no free space in virtual memory pool 【问题分类】业务SQL执行 【关键字】YAS-02025 【问题描述】在崖山环境查询数据提示报错 YAS-02025 no free space…

非凸科技钻石赞助第四届Rust China Conf 2024

9月7-8日&#xff0c;由Rust中文社区主办的第四届Rust China Conf 2024在上海成功举办。非凸科技作为钻石赞助商&#xff0c;全力协助大会顺利开展&#xff0c;共同为中国Rustaceans带来一场精彩的技术交流盛宴。会上&#xff0c;非凸科技首席运营官郑媛姿作为赞助商代表发言&a…

2024年华为9月4日秋招笔试真题题解

2024年华为0904秋招笔试真题 二叉树消消乐好友推荐系统维修工力扣上类似的题--K站中转内最便宜的航班 二叉树消消乐 题目描述 给定原始二叉树和参照二叉树(输入的二叉树均为满二叉树&#xff0c;二叉树节点的值范围为[1,1000]&#xff0c;二叉树的深度不超过1000)&#xff0c…

macOS系统Homebrew工具安装及使用

1.打开Homebrew — The Missing Package Manager for macOS (or Linux) 2.复制安装命令到终端执行 复制 执行 3. 开始自动安装过程 4.安装成功 5.使用brew安装wget工具

基于双向RRT算法的三维空间最优路线规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 单向RRT算法 4.2 双向RRT算法 5.完整程序 1.程序功能描述 基于双向RRT&#xff08;Randomly Exploring Random Trees, 随机探索随机树&#xff09;算法的三维空间最优路径规划是一种解…