消息总线

简介: SpringCloudBus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。在上一篇写出了springcloud对微服务的集中配置,那么就出现了一个问题,如果修改配置了怎么实现不需重启服务来实现配置的更新,下面有集中解决方法。

SpringCloudBus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。

在上一篇写出了springcloud对微服务的集中配置,那么就出现了一个问题,如果修改配置了怎么实现不需重启服务来实现配置的更新,下面有集中解决方法。

1.使用/refresh手动刷新配置

缺点:单点刷新,如果集群服务多的话,无论是工作量还是维护上都十分麻烦。

使用上一篇的config-client服务,加入依赖,

spring-boot-starter-actuator

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.dalaoyang</groupId>
    <artifactId>springcloud_config_client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springcloud_config_client</name>
    <description>springcloud_config_client</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <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>Edgware.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </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>

    <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>

在Controller类上加入@RefreshScope注解,由于上一篇controller写在了启动类上,所以直接加在启动类上,代码如下:

package com.dalaoyang;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
@RefreshScope
public class SpringcloudConfigClientApplication {

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


    @Value("${title}")
    String title;

    @RequestMapping("/getTitle")
    public String getTitle(){
        return title;
    }

}

配置文件新增配置management.security.enabled=false,在刷新时关闭安全验证。

代码如下:

spring.application.name=config-client
spring.cloud.config.label=master
spring.cloud.config.profile=test
spring.cloud.config.uri= http://localhost:9000/

##注册中心地址
eureka.client.service-url.defaultZone=http://eureka.dalaoyang.cn/eureka/

## 刷新时,关闭安全验证
management.security.enabled=false

分别启动项目config-server,config-client。访问http://localhost:8080/getTitle,结果如下图

image

修改git上配置,修改为dalaoyang_test_change,在次请求,结果没有改变,使用postman或者其他工具post请求http://localhost:8080/getTitle看到返回如下结果。

image

在次访问http://localhost:8080/getTitle,如下图

image

2.使用springcloudbus刷新配置

springcloudbus需要使用轻量消息代理,本文使用rabbitmq,启动rabbitmq如下图:

image

访问http://localhost:15672/#/如下图

image

新建项目springcloud_bus,同时改造config-client,pom文件加入bus依赖,代码如下:

<?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>com.dalaoyang</groupId>
    <artifactId>springcloud_bus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springcloud_bus</name>
    <description>springcloud_bus</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <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>Edgware.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </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-starter-bus-amqp</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>

加入rabbitmq配置,配置文件如下:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

##端口号
server.port=8881

## 刷新时,关闭安全验证
management.security.enabled=false

spring.application.name=config-client
spring.cloud.config.label=master
spring.cloud.config.profile=test
spring.cloud.config.uri= http://localhost:9000/

##注册中心地址
eureka.client.service-url.defaultZone=http://eureka.dalaoyang.cn/eureka/

启动类加入注解@RefreshScope,代码如下:

package com.dalaoyang;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
@RefreshScope
public class SpringcloudBusApplication {

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


    @Value("${title}")
    String title;

    @RequestMapping("/getTitle")
    public String getTitle(){
        return title;
    }
}

config-client加入同样依赖和配置,重启config-client,启动springcloud_bus,先去http://eureka.dalaoyang.cn/,可以看到

image

先将git上配置改回dalaoyang_test,分别请求http://localhost:8881/getTitlehttp://localhost:8080/getTitle结果如下:

image
image

然后用postman使用post请求访问http://localhost:8881/bus/refresh

再次分别请求http://localhost:8881/getTitlehttp://localhost:8080/getTitle结果如下:

image
image

从图中可以看出刷新配置成功。

3.局部刷新配置,配置与第2种方法一样,只是在使用postman刷新时略加改变,在本文中使用http://localhost:8881/bus/refresh?destination=config-client:8881可以刷新服务名为config-client端口为8881的服务,如果想要刷新服务名为config-client的所有服务可以写成http://localhost:8881/bus/refresh?destination=config-client:**

源码下载 :大老杨码云

个人网站:https://www.dalaoyang.cn

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
5月前
|
人工智能 安全 网络安全
AI 少儿英语 APP 的功能
本APP专为少儿设计,深度融合AI与儿童认知心理,支持多模态实时互动。含AI外教对练、音素级纠音、自适应学习、游戏化闯关及家长智能报告等功能,兼顾趣味性、科学性与安全性,符合2026年教育科技新标准。(239字)
|
6月前
|
消息中间件 存储 Java
吃透 RocketMQ
本文全面介绍Apache RocketMQ分布式消息中间件的核心架构、底层原理和生产实践。首先解析RocketMQ四大核心组件(NameServer、Broker、Producer、Consumer)的职责与协作机制,重点剖析其高性能存储设计(CommitLog、ConsumeQueue、IndexFile)、刷盘策略和主从复制原理。随后详细讲解基于Dledger Raft协议的高可用集群部署方案,包含环境准备、配置优化和监控部署。
829 6
|
6月前
|
人工智能 Linux API
告别OpenClaw假数据!跨境电商专用Agent+阿里云/本地全部署+模型配置实战与避坑指南
当前大量用户在使用OpenClaw(Clawdbot)进行市场分析、竞品调研、选品决策时,普遍遇到一个致命问题:AI在数据不足、网页抓取受阻、节点受限的情况下,会自动编造价格、销量、评论、重量等关键信息,生成看似专业却完全失真的报告,直接导致决策错误。尤其在跨境电商场景,假数据会造成选品失败、投产亏损、专利侵权、账号违规等严重后果。
759 3
|
2月前
|
人工智能 边缘计算 搜索推荐
ModelScope是什么?魔搭社区AI模型开源社区,模型即服务(MaaS)的共享平台
阿里云ModelScope(魔搭)是开源模型即服务(MaaS)平台,提供海量预训练模型,支持免费下载、一键调用、微调定制及多模态任务。集成百炼等云服务,助力开发者低成本高效构建AI应用。在阿里云百炼官网:https://t.aliyun.com/U/fPVHqY 免费领取千万Tokens
|
3月前
|
人工智能 JavaScript Java
/init 命令深度解析:让 OpenCode 真正理解你的项目结构
AI编程助手已深刻改变开发方式,但效果受限于项目上下文缺失。OpenCode通过`/init`命令自动扫描项目、识别技术栈、读取配置,生成结构化说明书AGENTS.md,让AI真正“懂”你的项目——从盲目猜测变为精准理解。
|
3月前
|
人工智能 缓存 自然语言处理
阿里云百炼Token Plan标准/高级/尊享坐席怎么选?Token Plan额度、计费与成本效益全面分析
阿里云百炼Token Plan是面向团队的AI大模型订阅服务,以Credits作为统一计量积分,覆盖文本生成、图像生成、代码开发等全场景模型调用,兼容主流AI编程与智能体工具,提供团队管理、预算管控、数据安全等企业级能力。该方案采用包月订阅制,提供标准、高级、尊享三档坐席,用户按月付费获取固定Credits额度,所有模型调用、工具使用、上下文缓存均按统一规则折算Credits扣除,告别传统按量付费的账单波动,实现AI使用成本的精准可控。本文将从资费额度、Token消耗规则、核心权益、性价比四个维度,全面对比三大坐席差异,为不同使用强度的团队提供清晰的选型参考。
458 0
|
10月前
|
JSON API 数据处理
淘宝天猫API调用指南:获取店铺所有商品数据
淘宝店铺商品API支持通过HTTP POST获取商品数据,返回JSON格式信息。核心接口包括店铺商品列表、分类及促销商品查询,以及商品详情、SKU、图片视频等信息获取,助力商家高效管理商品。
|
机器学习/深度学习 人工智能 弹性计算
阿里云AI服务器价格表_GPU服务器租赁费用_AI人工智能高性能计算推理
阿里云AI服务器提供多种配置,包括CPU+GPU、FPGA等,适用于人工智能、机器学习和深度学习等计算密集型任务。本文整理了阿里云GPU服务器的优惠价格,涵盖NVIDIA A10、V100、T4等型号,提供1个月、1年和1小时的收费明细。具体规格如A10卡GN7i、V100-16G卡GN6v等,适用于不同业务场景,详情见官方页面。
1729 11
|
人工智能 自然语言处理 并行计算
大模型面经:任务、clip、diffusion
本文简要介绍了文本生成的常见预训练任务(如MLM、CLM、NSP等),多模态模型中的SOTA模型及CLIP的优势,以及多模态大模型如Stable Diffusion的原理。重点解析了Stable Diffusion的扩散机制与图像生成流程,帮助理解其高效性和广泛应用的原因。
779 5
|
数据采集 网络协议 前端开发
Python多线程爬虫模板:从原理到实战的完整指南
多线程爬虫通过并发请求大幅提升数据采集效率,适用于大规模网页抓取。本文详解其原理与实现,涵盖任务队列、线程池、会话保持、异常处理、反爬对抗等核心技术,并提供可扩展的Python模板代码,助力高效稳定的数据采集实践。
701 0