分布式服务测试各节点调用第三方服务连通性

背景:分布式部署 一个主节点往各个节点下发任务(调用第三方服务),目的是为了测试各节点与第三方的连通性

思路:

主节点实现
创建Spring Boot项目:作为主节点的后端服务。
集成Eureka客户端:在主节点的pom.xml中添加Eureka客户端依赖,并在配置文件中配置Eureka服务器地址。
服务发现逻辑:编写服务来获取Eureka中的子节点列表,可以通过Eureka的REST API或者直接使用Spring Cloud提供的DiscoveryClient。
任务下发:接收外部请求,解析参数(外部系统接口名、IP、端口)。遍历从Eureka获取的子节点列表,对每个子节点发起HTTP请求,传递上述参数。
结果收集:收集各子节点的响应,组织成最终的结果列表。
子节点实现
创建Spring Boot项目:作为子节点的后端服务,并注册到Eureka服务器。
处理主节点请求:定义一个API来接收主节点的HTTP请求,提取外部系统接口名、IP、端口参数。
Socket调用外部接口:根据接收到的参数,使用Java的Socket编程建立到外部系统的连接,发送请求并等待响应。记得设置超时时间为2秒。
响应主节点:根据Socket调用的结果,构建响应信息(成功/失败及原因、外部接口名、IP、端口),并通过HTTP响应返回给主节点。
注意事项
错误处理:确保在每个关键步骤都有恰当的错误处理逻辑,比如网络请求失败、超时、Socket异常等。
日志记录:在主节点和子节点上都应记录详细的日志,便于问题追踪。
安全性:考虑对HTTP请求和Socket通信进行适当的安全加固,如使用HTTPS、身份验证等

废话不多说,直接上代码:新建一个简单的 springboot 项目,引入Eureka 等所需简单启动依赖

server 端(主节点)

参数说明:
externalApiName 策略名
ip 第三方 ip
port 第三方端口号
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1e7d8345839d4331965026ee1f9638a1.png

controller(表单方式接收数据)

@RestController
public class TaskDistributorController {@Autowiredprivate TaskManagerService taskManagerService;@PostMapping("/distributeTask")public ResponseEntity<List<ResultDto>> distributeTask(TaskRequest taskRequest) {try {// 调用服务层逻辑处理任务分配List<ResultDto> results = taskManagerService.distributeTasks(taskRequest);return ResponseEntity.ok(results);} catch (Exception e) {return ResponseEntity.status(500).body(null);}}}

service

@Service
@Slf4j
public class TaskManagerService {@Autowiredprivate DiscoveryClient discoveryClient;public List<ResultDto> distributeTasks(TaskRequest taskRequest) {// 获取子节点列表List<ServiceInstance> instances = discoveryClient.getInstances("deployment-test-tool-node");String externalApiName = taskRequest.getExternalApiName();List<ResultDto> results = new ArrayList<>();for (ServiceInstance instance : instances) {String workerUrl = "http://" + instance.getHost() + ":" + instance.getPort() + "/executeTask";// 构建请求参数MultiValueMap<String, String> params = new LinkedMultiValueMap<>();params.put("externalApiName", Collections.singletonList(externalApiName));params.put("ip", Collections.singletonList(taskRequest.getIp()));params.put("port", Collections.singletonList(String.valueOf(taskRequest.getPort())));HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);RestTemplate restTemplate = new RestTemplate();ResponseEntity<ResultDto> response = restTemplate.postForEntity(workerUrl, requestEntity, ResultDto.class);log.info("Response from worker: " + response.getBody());response.getBody().setIp(instance.getHost());response.getBody().setPort(String.valueOf(instance.getPort()));response.getBody().setExternalApiName(externalApiName);response.getBody().setExternalIpPort(taskRequest.getIp()+":"+taskRequest.getPort());results.add(response.getBody());}return results;}}

node子节点(以 socket 方式发送请求)

controller

@RestController
public class WorkerController {@Autowiredprivate ExternalSystemClient externalSystemClient;@PostMapping("/executeTask")public ResultDto executeTask(TaskRequest request) {return externalSystemClient.callExternalApi(request.getExternalApiName(), request.getIp(), request.getPort());}
}

service

@Service
public class ExternalSystemClient {public ResultDto callExternalApi(String apiName, String ip, int port) {Socket socket = null;BufferedReader in = null;PrintWriter out = null;try {socket = new Socket();SocketAddress address = new InetSocketAddress(ip, port);socket.connect(address, 2000); // 这里的2000是创建链接超时时间,单位为毫秒socket.setSoTimeout(2000); // 设置超时时间2秒in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = new PrintWriter(socket.getOutputStream(), true);// 发送请求out.println(apiName);// 读取响应String response = in != null ? in.readLine() : "";if (response != null) {return new ResultDto("success", "连接成功");} else {return new ResultDto("failed", "未收到响应");}} catch (Exception e) {return new ResultDto("failed", e.getMessage());} finally {// 关闭资源if (in != null) try { in.close(); } catch (Exception ignored) {}if (out != null) try { out.close(); } catch (Exception ignored) {}if (socket != null) try { socket.close(); } catch (Exception ignored) {}}}
}

模拟第三方以socket方式接收

socketserver

@Component
@Slf4j
public class SocketServer {@Value("${server.port}")private int port;@PostConstructpublic void startServer() {try (ServerSocket serverSocket = new ServerSocket(port)) {log.info("Socket服务已启动,等待连接...");while (true) {try (Socket clientSocket = serverSocket.accept();PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {out.println("连接成功,测试联通性良好!");} catch (IOException e) {log.error("处理客户端连接时发生错误", e);}}} catch (IOException e) {log.error("启动Socket服务器时发生错误", e);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/36199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 遥控器

遥控器源码 import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RadialGradient; import android.graphics.Region; import android.g…

个微API二次开发

通过 E云API 可以实现 个性化微信功能 &#xff08;例&#xff1a;营销系统、云发单助手、社群管家webot、客服系统等&#xff09;&#xff0c;用来自动管理微信消息。 可开发的功能包括但不限于&#xff1a; 好友管理&#xff1a; 添加好友、删除好友、修改备注、创建标签、获…

云动态摘要 2024-06-28

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [新客专享]WeData 限时特惠 腾讯云 2024-06-21 数据分类分级管理&#xff0c;构建数据安全屏障 &#xff0c;仅需9.9元&#xff01; 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器…

VMware虚拟机三种网络模式设置 - Host-Only(仅主机模式)

一、前言 在之前的《Bridged&#xff08;桥接模式&#xff09;》、《NAT&#xff08;网络地址转换模式&#xff09;》中&#xff0c;我详细介绍了虚拟机网络模式设置中的桥接模式与网络地址转换模式。今天详细讲解一下Host-Only&#xff08;仅主机模式&#xff09;。 在VMware虚…

Java代码基础算法练习-判断学生成绩等级-2024.06.28

任务描述&#xff1a; 输入一个学生的成绩&#xff08;成绩大于等于 0 并小于等于 100&#xff09;&#xff0c;根据成绩判断学生成绩的等级。 60 分以下不及格&#xff1b;60-70 分为及格&#xff1b;70-80 分为中等&#xff1b;80-90 分为良好&#xff1b;90 分以上为优秀。 …

版本控制工具-git分支管理

目录 前言一、git分支管理基本命令1.1 基本命令2.1 实例 二、git分支合并冲突解决三、git merge命令与git rebase命令对比 前言 本篇文章介绍git分支管理的基本命令&#xff0c;并说明如何解决git分支合并冲突&#xff0c;最后说明git merge命令与git rebase命令的区别。 一、…

Excel 宏录制与VBA编程 —— 15、MsgBox参数详解

Msgbox参数具体如下 Msgbox参数使用1 Msgbox参数使用2&#xff08;返回值示例&#xff09; &ensp ;###### 关注 笔者 - jxd

绿色网络设计方法

1.绿色网络设计思路 绿色网络的构建&#xff0c;不仅要从网络设备的节能环保下功夫&#xff0c;更要从网络的方案设计上做文章。虽说降低设备的能耗可为网络的节能环保起到积极作用&#xff0c;但网络架构优化有可能使整个网络节能环保有一个质的飞跃。 网络设备作为网络设计方…

Spring Boot与RabbitMQ的集成应用

Spring Boot与RabbitMQ的集成应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中集成和使用RabbitMQ&#xff0c;实现消…

adb server version (41) doesn‘t match this client (39); killing...

在运行adb kill-server和 adb start-server时报如下错误: uos@uos-PC:~$ adb kill-server uos@uos-PC:~$ adb start-server adb server version (41) doesnt match this client (39); killing..

Linux系统之部署linkding书签管理器

Linux系统之部署linkding书签管理器 一、linkding介绍1.1 linkding简介1.2 linkding特点二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本四、部署Node.js 环境4.1 下载Node.js安装包4.2 解压Node.js安装包4.3 …

C++ RTTI: 让你的代码更灵活

RTTI是什么? RTTI全称是Runtime Type Information,顾名思义就是在程序运行时获取类型信息的机制。它允许我们在运行时动态地查询对象的类型,甚至进行安全的类型转换。 C中提供了两个主要的RTTI操作符: typeid操作符: 它可以返回一个type_info对象,该对象包含了类型的名称和…

深入理解动态代理:JDK动态代理与CGLIB动态代理

引言 在软件开发中&#xff0c;动态代理是一种强大的技术&#xff0c;它允许在运行时创建代理对象&#xff0c;从而为原对象添加额外的功能。Java中主要有两种动态代理机制&#xff1a;JDK动态代理和CGLIB动态代理。本篇文章将详细介绍这两种动态代理的概念、实现方式、应用场…

ANSYS Electronics 电磁场仿真工具下载安装,ANSYS Electronics强大的功能和灵活性

ANSYS Electronics无疑是一款在电磁场仿真领域表现卓越的软件工具。它凭借强大的功能和灵活性&#xff0c;帮助用户在产品设计阶段就能精确预测和优化电磁场性能&#xff0c;从而极大地降低了实际测试成本&#xff0c;并显著提升了产品的可靠性。 这款软件不仅在电子设计领域有…

Java数组的初始化方法

Java数组的初始化方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在Java编程中&#xff0c;数组是一种非常基础也非常重要的数据结构&#xff0c;它能够存储…

linux中awk,sed, grep使用(待补充)

《linux私房菜》这本书中将sed和awk一同归为行的修改这一点&#xff0c;虽然对&#xff0c;但不利于实际处理问题时的思考。因为这样的话&#xff0c;当我们实际处理问题时&#xff0c;遇到比如说统计文本打印内容时&#xff0c;我们选择sed还是awk进行处理呢&#xff1f; 也因…

VS Code 配置cmake(Linux环境)

通过sudo apt install cmake在linux上安装cmake 在Vs Code中安装这两个插件 通过命令whereis cmake获取linux中cmake的路径信息 右键CMake Tools右下角齿轮标志&#xff0c;选择扩展设置&#xff08;Extension Settings&#xff09; 注意要设置的是本地&#xff0c;还是远程连接…

Linux 进程间通讯

Linux IPC 方式 在Linux系统中&#xff0c;进程间通信&#xff08;IPC&#xff09;是多个运行中的程序或进程之间交换数据和信息的关键机制。Linux提供了多种IPC机制&#xff0c;每种机制都有其特定的用途和优势。以下是Linux上主要的IPC通信方式&#xff1a; 管道&#xff08…

前后端分离对软件行业及架构设计的影响

在软件开发领域&#xff0c;前后端分离是一种越来越流行的架构设计模式。这种方法将用户界面&#xff08;前端&#xff09;与服务器逻辑&#xff08;后端&#xff09;分离开来&#xff0c;允许它们独立开发、测试和部署。本文将探讨前后端分离对软件行业和架构设计的影响&#…

开发Qt上位机获取阿里云IOT设备数据(开发上位机对接阿里云IOT平台)

一、前言 随着物联网技术的快速发展,越来越多的设备开始接入互联网,实现远程监控和管理。为了方便用户实时查看设备的运行状态和数据,本文将介绍如何使用Qt框架开发一款上位机软件,调用阿里云物联网平台的API接口,获取设备最新上传的实时数据,并在Qt设计的软件界面上展示…