spring cloud中实现接口广播请求到服务提供者

news/2024/9/22 21:30:57/

一、背景

假如现在有一台服务A,两台服务B,可以简化为如下图模型:

 需求:一次请求服务A需要同时将请求广播打到两台服务B上。

二、实现方案

2.1 需要应用到两个类:

2.1.1:LoadBalancerClient
package org.springframework.cloud.client.loadbalancer;import java.io.IOException;
import java.net.URI;
import org.springframework.cloud.client.ServiceInstance;public interface LoadBalancerClient extends ServiceInstanceChooser {<T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException;<T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) throws IOException;URI reconstructURI(ServiceInstance instance, URI original);
}

2.1.2:DiscoveryClient

package org.springframework.cloud.client.discovery;import java.util.List;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.core.Ordered;public interface DiscoveryClient extends Ordered {int DEFAULT_ORDER = 0;String description();List<ServiceInstance> getInstances(String serviceId);List<String> getServices();default void probe() {this.getServices();}default int getOrder() {return 0;}
}

以上两个类都是SpringCloud中的,读者自己可以搜索引入对应的包,这里就不写引入的包的配置文件了,因为笔者懒。

2.2 自定义核心实现

2.2.1:服务A中的Controller


@RestController
@RequestMapping("/v1/test_a")
public class TestController {@Resourceprivate TestService testService;@getMapping(path = "/invidate")public Result<Boolean> test() {return Result.Builder.success(testService.test());}
}

2.2.2:服务A中的TestService(核心实现)

public void test(){String serviceId = "test_b";final List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);if (CollectionUtils.isNotEmpty(instances)) {for (ServiceInstance instance : instances) {try {Server server = new Server(instance.getHost(), instance.getPort());RibbonLoadBalancerClient.RibbonServer ribbonServer = new RibbonLoadBalancerClient.RibbonServer(instance.getServiceId(), server);loadBalancerClient.execute(instance.getServiceId(), ribbonServer, v -> {String host = instance.getHost();int port = instance.getPort();String url = "http://" + host + ":" + port + "/v1/test_b/invalidate";url = String.format(url, req.getWbCode());RestTemplate restTemplate = new RestTemplate();return restTemplate.getForObject(url, Result.class);});} catch (IOException e) {log.error("loadBalancerClient happen error:{}", e.getMessage(), e);}}}}

代码中的serviceId=test_b,这个test_b是笔者nacos注册中心注册的服务的名称,笔者的服务是用nacos作为服务发现和注册中心的,如果读者的服务的发现和注册中心不一致,可以自己理解了原理后自己研究一下。

代码中的“/v1/test_b/invalidate”就是服务A需要请求的服务B中的接口。这个段代码的核心是先用组件discoveryClient获取到服务提供者的列表,然后遍历每个服务提供者,向每个服务提供者发送信息。

2.2.3 服务B中的Controller

@RestController
@RequestMapping("/v1/test_b")
public class InvalidCacheInnerController {@GetMapping(path = "/invalidate")public Result<Boolean> invalidate() {return Result.Builder.success(true);}
}

服务B中就是简单返回一个true就完事了。

化繁为简,大道至简~~~~


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

相关文章

龙智被SmartBear评为2022年“最具动力营销团队”

近日&#xff0c;全球领先的软件开发和可视化工具提供商SmartBear进行了首届合作伙伴评选&#xff0c;并向全球不同地区的9个合作伙伴颁发了首个年度合作伙伴奖。DevSecOps解决方案提供商龙智是唯一一家来自中国的获奖合作伙伴&#xff0c;获得 “最具动力营销团队”称号。 Sm…

【Spring Boot】自定义 Banner

文章目录1. 什么是 Banner2. 如何修改 Banner3. IDEA 中演示4. 快速生成 Banner5. 指定 banner.txt 的位置6. 在 Spring Boot 2 中的说明6.1 图片生成 Banner6.1 增强显示效果6.3 更多配置项7. 补充Spring Boot Version: 3.0.x 1. 什么是 Banner 启动 Spring Boot 时&#xf…

第四十八天打卡

第四十八天打卡 打家劫舍 打家劫舍 中等 2.5K 相关企业 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#…

JVM 垃圾回收概述和相关算法

自动内存管理特点 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html 自动内存管理&#xff0c;无需开发人员手动参与内存的分配与回收&#xff0c;这样降低内存泄漏和内存溢出的风险 没有垃圾回收器&#xff0c;java也会和cpp一样&#xff0c;各…

文心一格,百度AI作画产品

文章目录AIGC什么是AI作画&#xff1f;Prompt文心一格使用方法注册账号使用AI绘图AIGC的未来发展结语AIGC AIGC&#xff08;AI Generated Content&#xff09;是指利用人工智能生成内容。是利用人工智能来生成你所需要的内容&#xff0c;GC的意思是创作内容。与之相对应的概念中…

PM2入门及其常用命令

文章目录一、PM2概述1、简介2、普通 node 进程的缺陷3、PM2优点4、PM2安装二、PM2命令详情1、PM2常用命令1.1 启动1.2 管理进程1.3 应用信息查看1.4 日志与监控2、集成部署EcosystemFile2.1 概述2.2 配置项详解2.3 使用配置文件3、集群模式3.1 cluster 模式与 fork 模式3.2 集群…

代码随想录算法训练营第三天|203 移除链表元素 707 设计链表 206 反转链表

文章目录203 移除链表元素思路代码总结707 设计链表思路代码总结206 反转链表思路代码总结203 移除链表元素 思路 虚链表头 今天复习写得不是很流畅 虚假头结点可以不用考虑原始头结点是否需要删除&#xff0c;这样以一个统一的标准记忆更方便。 没记清楚的点在于&#xff1a…