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

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

思路:

主节点实现
创建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

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

ANSYS Electronics无疑是一款在电磁场仿真领域表现卓越的软件工具。它凭借强大的功能和灵活性&#xff0c;帮助用户在产品设计阶段就能精确预测和优化电磁场性能&#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;还是远程连接…

添加用户页面(Flask+前端+MySQL整合)

首先导入Flask库和pymysql库。Flask用于创建Web应用程序&#xff0c;pymysql用于连接和操作MySQL数据库。 from flask import Flask, render_template, request import pymysql创建一个Flask应用实例。__name__参数告诉Flask使用当前模块作为应用的名称。 app Flask(__name_…

高效管理客户的秘诀:企业如何建立稳固的客户关系

如今的竞争&#xff0c;从商业模式、产品、服务到销售环节&#xff0c;竞争已经不再是单一层面的&#xff0c;而是全方位的&#xff0c;企业需要打造全价值链竞争优势。在这个过程中&#xff0c;客户管理的作用是无可替代的&#xff0c;成为企业成功的关键因素之一。如何高效地…

基于Java的蛋糕预定系统【附源码+LW】

摘 要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统购物方式采取了人工的管理方法&#xff0c;但这种管理方法存…

0628_ARM4

练习&#xff1a; stm32流水灯 .text .global _start _start: 使能GPIOE外设时钟 0X50000A28 RCC_MP_AHB4ENSETR[4]->1 LDR R0,0x50000a28 指定操作的内存地址 LDR R1,[R0] 将R0对应的地址空间中的值读取出来 ORR R1,R1,#(0x3<<4) 将第4,5位设置为1 STR…

.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作

一、准备工作 1、本地部署MinIO服务 2、创建MinIO的Access Key 3、创建.net 项目 4、下载MinIO sdk 5、相关文档 二、编写MinIO工具类 三、管理存储桶 1、MyBucket类 &#xff08;1&#xff09;判断bucket是否存在 &#xff08;2&#xff09;新建bucket &#xff08…

AI大模型-关于推理、可解释性和 LLMs_ai 推理模型

引言&#xff1a;以下文章的主题我已经思考了很久&#xff0c;我希望能我的话能引起你的思考&#xff0c;并于一些更悲观的AI评论相均衡。推理和可解释性是充满细微差别的主题——我希望这篇文章能体现这一点。 去年 GPT-4 发布时&#xff0c;我注意到出现了一个特殊的议论&…

新能源行业必会基础知识-----电力市场概论笔记-----经济学基础

新能源行业知识体系-------主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/139946830 目录 1. 什么是市场2. 电力市场机制设计的基本要求 1. 什么是市场 经济学定义 市场是供需双方交易并决定商品价格和产量的机制市场可…

JVM原理(一):JVM运行时数据区域的分析

1. 程序计数器 程序计数器是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器。 作用 在Java虛拟机的概念模型里&#xff0c;字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令&#xff0c;它是程序控制流的指示…

一站式企业服务平台能够帮助企业解决哪些问题?

近年来一站式企业服务平台备受区域政府及园区管理者的青睐&#xff0c;充当着区域政府或园区的千里眼和顺风耳&#xff0c;可以用来捕捉与区域经济发展相关的信息&#xff0c;也可以用来倾听企业的诉求&#xff0c;更是成为了区域深抓企业服务的多面手。 同时&#xff0c;一站式…

高电压技术-冲击高压发生器MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 冲击电压发生器是产生冲击电压波的装置&#xff0c;用于检验电力设备耐受大气过电压和操作过电压的绝缘性能&#xff0c;冲击电压发生器能产生标准雷电冲击电压波形&#xff0c;雷电冲击电压截波,标准操作冲击…