SpringCloud之消息总线Spring Cloud Bus实例代码

以下是Spring Cloud Bus的例子和完整攻略。

Spring Cloud Bus简介

Spring Cloud Bus是Spring Cloud家族中的一个基于消息中间件构建的分布式应用事件传播机制。通过Spring Cloud Bus,我们可以轻松的实现服务之间的通信和事件的传递,从而实现基于消息驱动架构(MDA)的微服务应用。

Spring Cloud Bus支持两种消息中间件协议:RabbitMQ和Kafka。Spring Cloud Bus默认的协议是RabbitMQ,因此只需要在pom.xml文件中引入如下代码即可:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

Spring Cloud Bus的使用非常简单,只需要在应用启动时添加@EnableBus注解即可:

@SpringBootApplication
@EnableBus
public class BusApplication {

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

}

Spring Cloud Bus实例代码

下面我们来看看Spring Cloud Bus的两个实例代码:

示例1:动态刷新配置

在微服务应用中,通常需要配置中心来管理各个服务的配置信息。Spring Cloud Config是常用的配置中心组件之一。但是,如果某个服务的配置发生变化,我们还需要手动去重启应用。如何实现在某个服务的配置信息变化时,自动通知其他服务?

答案就是采用Spring Cloud Bus,我们可以利用Spring Cloud Bus的特性来实现配置文件的自动更新,而无需手动重启服务。

首先,我们需要在应用中配置Bus Refresh Endpoint来实现在某个应用进行了配置文件变更时,其他应用能够自动更新。

在项目的application.properties或者application.yml文件中,添加如下配置:

management:
    endpoints:
        web:
            exposure:
                include: bus-refresh

上述配置中,我们开启了bus-refresh端点的控制,使得其他的服务可以通过调用/bus-refresh端点来刷新服务的配置。

接下来,在我们需要刷新服务配置的地方,通过发出POST请求/bus/refresh来刷新服务的配置,如下所示:

@RestController
public class ViewController {

    @Autowired
    private Environment environment;

    @PostMapping("/refreshEnv")
    public String refreshEnv(String key, String value) {
        environment.getPropertySources().addFirst(new MapPropertySource("custom",
                Collections.singletonMap(key, value)));
        return "refresh success";
    }

}

在上述代码中,我们利用Environment对象的getPropertySources()方法获取到配置文件的全部属性,然后将需要更新的配置项添加进去即可。

最后,我们可以通过使用postman等工具对refreshEnv进行测试。

在修改配置后,我们调用http://localhost:8080/post?key=foobar&value=foo,可以看到控制台会输出如下日志信息:

2019-06-26 14:30:08.287  INFO 16588 --- [nio-8080-exec-1] c.c.b.controller.ViewController         : refresh success
2019-06-26 14:30:08.319  INFO 16588 --- [hread: rabbit@localhost:5672] o.s.c.bus.spring.CloudBusBridge         : /refresh sent to destination(s): myapp:**, anotherapp:**

最后,在其他的服务中也添加配置文件,通过使用@RefreshScope注解实现配置文件的自动刷新。

@RefreshScope
@RestController
public class HelloController {

    @Value("${server.port}")
    String port;

    @Value("${test.name}")
    private String testName;

    @RequestMapping("/hi")
    public String home() {
        return "hi " + testName + ",i am from port:" + port;
    }

}

这样,当我们发起POST请求时,其他的服务的配置文件也会自动刷新,从而实现了基于消息驱动的配置管理。

示例2:服务实例数量统计

在微服务应用中,服务实例数量的状态信息非常重要。

我们可以通过Spring Cloud Bus将服务实例数量的状态信息发送到消息总线上,从而实现任意一个服务实例都能够获取其他服务实例的状态信息。

下面是一个统计服务实例数量的实例代码。

在pom.xml中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

<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-actuator</artifactId>
</dependency>

其中,spring-boot-starter-actuator是Spring Boot应用的指标展示组件,该依赖主要是负责将应用的指标(Metrics)数据暴露到Spring Boot内置的HTTP端点中,便于应用的健康状况监控。

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class BusApplication {

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

    @GetMapping("/ping")
    public String ping() {
        return "pong";
    }

}

上述代码中,我们通过@EnableDiscoveryClient注解开启服务注册和发现的功能,然后在控制器中添加@GetMapping("/ping")来实现测试服务是否可用。

接下来,我们需要修改Eureka Server的配置文件,增加Metrics HTTP端口的监听。

在eureka-server的application.yml或者application.properties文件中添加如下配置:

eureka:
    instance:
        metadata-map:
            management.port: ${server.port}
    server:
        enable-self-preservation: false
        eviction-interval-timer-in-ms: 60000
    client:
        register-with-eureka: false
        fetch-registry: false

management:
    endpoints:
        web:
            exposure:
                include: metrics
    metrics:
        enable:

在上述代码中,主要我们通过在application.yml文件中修改management端口开启指标暴露,从而实现了应用的指标监控。

接下来,我们通过定义自定义的Endpoint来统计当前服务实例的数量:

@Component
public class InstanceCountEndpoint extends AbstractEndpoint<Long> {

    @Autowired
    private DiscoveryClient discoveryClient;

    public InstanceCountEndpoint() {
        super("instanceCountEndpoint");
    }

    @Override
    public Long invoke() {
        List<String> services = discoveryClient.getServices();
        Map<String, List<ServiceInstance>> serviceMap = new LinkedHashMap<>(services.size());
        services.forEach(s -> serviceMap.put(s, discoveryClient.getInstances(s)));
        return serviceMap.values().stream().flatMap(Collection::stream).count();
    }

}

上述代码中,我们通过Endpoint来统计服务实例的数量,其中通过DiscoveryClient对象获取当前已注册的服务列表,使用流式API将列表转换为对象的流并逐一统计,最后统计数量并返回即可。

最后,我们在应用启动类中添加@EnableConfigurationProperties注解,并在application.yml配置文件中添加InstanceCountMetric的配置。

@SpringBootApplication
@EnableDiscoveryClient
@RestController
@EnableConfigurationProperties(InstanceCountMetric.class)
public class BusApplication {

    @Autowired
    private InstanceCountMetric instanceCountMetric;

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

    @GetMapping("/ping")
    public String ping() {
        return "pong";
    }

    @GetMapping("/instanceCount")
    public String instanceCount() {
        return String.valueOf(instanceCountMetric.getCount());
    }

}

在上述代码中,我们将InstanceCountMetric注入到应用中,并在@GetMapping("/instanceCount")API的处理方法中使用该对象获取实例数量。

到这里,我们已经完成了Spring Cloud Bus实例代码的编写,可以通过localhost:8762/instanceCount接口来获取当前注册中心中服务的实例数量。

总之,Spring Cloud Bus是实现微服务消息机制的重要组件,可以为我们实现微服务应用的通信和事件传递机制。在实际应用中,我们可以通过Spring Cloud Bus实现各种应用场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringCloud之消息总线Spring Cloud Bus实例代码 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 使用Bazel编译TensorBoard教程

    使用Bazel编译TensorBoard需要进行以下步骤: 步骤一:安装Bazel和TensorFlow 如果您还没有安装Bazel和TensorFlow,请前往官方网站进行安装。 步骤二:下载TensorBoard源代码 您可以从GitHub下载TensorBoard的源代码。 步骤三:构建TensorBoard 在下载源代码之后,使用Bazel进行构建,…

    人工智能概览 2023年5月25日
    00
  • python匿名函数的实例用法

    首先让我们来了解什么是Python的匿名函数。 Python的匿名函数是一种没有定义名称的函数,可以使用lambda表达式创建。这些函数通常用于一次性的场景中,例如对列表或集合进行排序等。 常规函数的定义方法是: def testFunc(name): return "Hello, " + name 而匿名函数的定义方法是: lambda…

    人工智能概论 2023年5月25日
    00
  • 联想小新熊猫打印机怎么样?联想小新熊猫打印机使用评测

    联想小新熊猫打印机怎么样?联想小新熊猫打印机使用评测 联想小新熊猫打印机是一款轻巧便携的热敏无墨打印机,外观可爱,同时也兼备一定的性能和功能,是一款比较适合学生或者办公室小伙伴使用的打印机。 外观设计 联想小新熊猫打印机采用白色背景色,黑色和灰色为主色调,机身尺寸为2066670mm,体积非常轻盈,重量仅为434g,非常便携。在外观设计上,小新熊猫打印机上还…

    人工智能概览 2023年5月25日
    00
  • 使用Python中的pytesseract模块实现抓取图片中文字

    标题:使用Python中的pytesseract模块实现抓取图片中文字 简介 Python是一种高级编程语言,可以利用各种库实现各种自动化任务。在图像处理方面,Python中的pytesseract模块可以帮助我们抓取图片中的文字。在这篇文章中,我们将提供一些示例,并详细介绍如何使用pytesseract模块来实现抓取图片中文字。 步骤 1. 安装pytes…

    人工智能概论 2023年5月25日
    00
  • 为了防老板窥屏 小编总结一些防窥屏套路

    为了防老板窥屏 小编总结一些防窥屏套路 为了防止在公共场合或者公司中使用电脑时被别人窥屏,小编总结了一些防窥屏的套路,希望能帮到大家。 1. 调整屏幕亮度和角度 将屏幕的亮度调低可以有效地减少别人窥屏的概率。同时,调整屏幕的角度,使得他人无法直接看到显示屏,也是一个不错的方法。 2. 使用隐私屏幕保护膜 隐私屏幕保护膜可以有效地防止旁人通过侧面角度窥屏。这种…

    人工智能概览 2023年5月25日
    00
  • Django结合使用Scrapy爬取数据入库的方法示例

    下面是“Django结合使用Scrapy爬取数据入库的方法示例”的完整攻略。 一、准备工作 在开始使用Django和Scrapy之前,首先需要安装相关的软件包。下面是安装步骤: 安装Python3:可以在Python官网上下载Python3的安装包,根据系统版本进行下载安装; 安装Django:可以使用pip命令安装Django。在命令行输入:pip ins…

    人工智能概论 2023年5月25日
    00
  • PyCharm 配置远程python解释器和在本地修改服务器代码

    PyCharm 是一个 Python 集成开发环境(IDE),可以使用它来编辑、运行和调试 Python 代码。PyCharm 还具有配置远程 Python 解释器的功能,可以用于本地修改服务器代码。 以下是配置远程 Python 解释器和在本地修改服务器代码的完整攻略: 配置远程 Python 解释器: 1.1 在服务器上安装 Python 解释器,并且记…

    人工智能概论 2023年5月25日
    00
  • OpenCV获取图像中直线上的数据具体流程

    获取图像中直线上的数据是机器视觉中的一个重要问题。OpenCV是一个流行的计算机视觉库,提供了许多直线检测算法,包括霍夫变换和进化抽象算法(EAC)。下面是一些步骤来获取图像中直线上的数据: 引入OpenCV库和Python语言的启动代码 import cv2 import numpy as np from matplotlib import pyplot …

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部