跨语言RPC:使用Java客户端调用Go服务端的HTTP-RPC服务

在构建分布式系统时,实现不同编程语言之间的无缝通信是一个常见的需求。本文将详细介绍如何使用Go语言创建一个HTTP-RPC服务,并通过Java客户端进行远程调用。我们将探索整个过程,包括服务端的实现、客户端的编写以及测试验证。

一、背景介绍

RPC(Remote Procedure Call,远程过程调用)允许程序像调用本地方法一样调用位于网络另一端的服务。虽然传统的RPC机制通常依赖于特定的传输协议和序列化格式,但HTTP-RPC利用了广泛支持的HTTP协议和JSON格式,使得跨语言、跨平台的通信变得简单而直接。

二、Go服务端实现

首先,我们使用Go语言来创建一个简单的HTTP-RPC服务端。这个服务接收一个名字作为参数,并返回带有问候语的消息。

package mainimport ("encoding/json""net/http"
)// 定义一个服务结构体,用于承载业务逻辑
type HelloService struct{}// 定义服务的方法,接收一个字符串参数,返回处理后的字符串
func (s *HelloService) Hello(request string) string {return "hello " + request
}func main() {// 注册一个 HTTP 处理函数,路径为 "/hello"http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {// 定义请求体的结构:{"name": "Bob"}var params struct {Name string `json:"name"`}// 解析请求中的 JSON 数据if err := json.NewDecoder(r.Body).Decode(&params); err != nil {http.Error(w, err.Error(), http.StatusBadRequest)return}// 创建服务实例并调用方法service := &HelloService{}response := map[string]string{"message": service.Hello(params.Name)}// 设置响应头为 JSON 格式w.Header().Set("Content-Type", "application/json")// 将结果编码为 JSON 并发送给客户端json.NewEncoder(w).Encode(response)})// 启动 HTTP 服务,监听本地 1234 端口http.ListenAndServe(":1234", nil)
}

关键点解释:

  • Handler函数:定义了一个处理/hello路径请求的handler函数,该函数解析请求体中的JSON数据,调用HelloServiceHello方法,并将结果编码为JSON响应。
  • 监听端口:服务端在1234端口上监听HTTP请求。

代码解析

代码片段作用说明
type HelloService自定义的服务结构体,用于封装远程调用的逻辑
func (s *HelloService) Hello(...)这是一个“导出方法”,可以被外部调用
http.HandleFunc("/hello", ...)注册一个 HTTP 路由处理器,当客户端访问 /hello 时触发
json.NewDecoder(r.Body).Decode(&params)把客户端发来的 JSON 请求体解析成结构体
map[string]string{"message": ...}构造一个返回值,包含处理后的结果
w.Header().Set(...), json.NewEncoder(w).Encode(...)设置响应头并输出 JSON 格式的响应内容
http.ListenAndServe(":1234", nil)启动 HTTP 服务器,监听 1234 端口

✅ 总结:Go 服务端本质上就是一个简单的 HTTP 接口服务,接收 JSON 请求,执行本地方法,再返回 JSON 响应。

三、Java客户端实现

接下来,我们将编写一个Java客户端来调用上述Go服务端提供的“Hello”服务。

import org.json.JSONObject;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;public class GoHttpRpcClient {public static void main(String[] args) throws Exception {// 指定服务端地址和端口String url = "http://127.0.0.1:1234/hello";// 构建请求数据 {"name": "Bob"}JSONObject jsonRequest = new JSONObject();jsonRequest.put("name", "Bob");// 打开连接HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();// 设置请求方式和头部信息connection.setRequestMethod("POST");connection.setRequestProperty("Content-Type", "application/json; utf-8");connection.setRequestProperty("Accept", "application/json");connection.setDoOutput(true);// 发送请求体try (OutputStream os = connection.getOutputStream()) {byte[] input = jsonRequest.toString().getBytes("utf-8");os.write(input, 0, input.length);}// 获取响应码int responseCode = connection.getResponseCode();// 判断是否成功if (responseCode == HttpURLConnection.HTTP_OK) {// 读取响应内容String response = readResponse(connection.getInputStream());JSONObject jsonResponse = new JSONObject(response);System.out.println("Success!");System.out.println("Response: " + jsonResponse.toString(2)); // 格式化输出JSONif (jsonResponse.has("message")) {System.out.println("Message: " + jsonResponse.getString("message"));}} else {// 处理错误情况String errorResponse = readResponse(connection.getErrorStream());System.out.println("Error code: " + responseCode);System.out.println("Error response: " + errorResponse);}}// 辅助方法:读取输入流的内容private static String readResponse(InputStream inputStream) throws IOException {StringBuilder response = new StringBuilder();try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "utf-8"))) {String responseLine;while ((responseLine = br.readLine()) != null) {response.append(responseLine.trim());}}return response.toString();}
}

关键点解释:

  • 构造请求:使用org.json.JSONObject构建请求数据,并设置适当的HTTP头信息。
  • 发送请求并处理响应:通过HttpURLConnection发送POST请求,并根据响应码判断是否成功,然后读取并打印响应内容。

 代码解析

代码片段作用说明
JSONObject jsonRequest = new JSONObject()使用 JSON 库构建请求体对象
jsonRequest.put("name", "Bob")添加字段,构造 { "name": "Bob" }
HttpURLConnection connection = ...创建与服务端的 HTTP 连接
connection.setRequestMethod("POST")设置请求方法为 POST
connection.setRequestProperty(...)设置请求头,告诉服务端我们发送的是 JSON 数据
OutputStream os = connection.getOutputStream()获取输出流,把请求体写入网络
int responseCode = connection.getResponseCode()获取 HTTP 响应状态码
readResponse(...)自定义方法,读取服务端返回的数据

✅ 总结:Java 客户端模拟了一个标准的 HTTP POST 请求,发送 JSON 数据给 Go 服务端,并读取返回的 JSON 结果。

四、测试与验证

确保Go服务端正在运行后,执行Java客户端程序。如果一切配置正确,你应该能够看到类似以下的输出结果:

Success!
Response: {"message": "hello Bob"
}
Message: hello Bob

这表明Java客户端成功地调用了Go服务端的“Hello”方法,并收到了预期的响应。

五、总结

HTTP-RPC 的核心思想

角色功能
服务端(Go)接收 HTTP 请求,解析 JSON 输入,执行本地方法,返回 JSON 输出
客户端(Java)构造 JSON 请求,发送 HTTP POST 请求,读取并解析返回的 JSON 响应
关键点使用 HTTP 协议作为传输层,JSON 作为数据格式,实现跨语言通信

通过这篇文章,我们学习了如何使用Go语言构建一个HTTP-RPC服务端,并使用Java作为客户端进行跨语言调用。这种方法不仅打破了语言之间的界限,还利用了HTTP这一通用协议,使得不同平台和语言之间的集成变得更加简单高效。

希望这篇博客能帮助你在实际项目中更好地应用HTTP-RPC技术,促进系统间的互联互通。

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

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

相关文章

CVPR2024迁移学习《Unified Language-driven Zero-shot Domain Adaptation》

摘要 本文提出了一个名为 Unified Language-driven Zero-shot Domain Adaptation(ULDA)的新任务设置,旨在使单一模型能够适应多种目标领域,而无需明确的领域标识(domain-ID)知识。现有语言驱动的零样本领域…

AI安全风险监测平台:全周期防护体系构建

AI安全风险监测平台通过构建全生命周期防护体系,实现对人工智能系统研发、部署、运行、迭代各阶段的安全风险动态监测。该平台融合算法审计、行为分析、合规验证等核心能力,建立覆盖模型安全、数据安全、应用安全的立体防御网络,为智能系统提…

数据集-目标检测系列- 杯子 数据集 bottle >> DataBall

数据集-目标检测系列- 杯子 数据集 bottle >> DataBall 贵在坚持! * 相关项目 1)数据集可视化项目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2)数据集训练、推理相关…

视频点播web端AI智能大纲(自动生成视频内容大纲)的代码与演示

通过AI技术将视频课程自动生成结构化大纲和摘要,支持PPT教学视频、企业内训等场景应用。核心功能包括:自动匹配视频知识点生成文本大纲、快速内容定位、降低课程制作成本。系统采用模块化架构,包含Vue2.7前端组件、JS逻辑库和演示项目&#x…

Linux: errno: EINPROGRESS-115

在connect接口的使用说明里,有这个错误:EINPROGRESS。 The socket is nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select(2…

Node.js特训专栏-基础篇:3. Node.js内置模块的使用

🔥 欢迎来到 Node.js 实战专栏!在这里,每一行代码都是解锁高性能应用的钥匙,让我们一起开启 Node.js 的奇妙开发之旅! Node.js 特训专栏主页 Node.js内置模块:强大功能的基石 在Node.js的世界里&#xff…

基于MATLAB实现的Capon、MUSIC、ESPRIT和PM算法进行DOA

使用Capon、MUSIC、ESPRIT和PM多种算法进行doa估计,通过谱峰搜索函数估计到达角,并使用蒙特卡洛方法估计各算法的RMSE。(可能计算时间较长,如需节省时间可以减小蒙特卡洛次数) PM.m , 574 RMSE.m , 274 TLS_ESPRIT.m …

某网站极验4滑块验证码逆向分析

文章目录 1. 写在前面2. 接口分析3. w逆向分析4. JSON参数分析5. 距离识别6. RSA纯算还原7. AES纯算还原【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于…

深入理解 C++ inline:三大语法特性 + 七大高频考点全解析

一、什么是内联函数 编译器尝试将 inline 函数的代码直接插入调用处(类似宏展开),避免函数调用的压栈、跳转、返回等额外开销。适用于短小频繁调用的函数:如简单的 getter/setter、数学运算等。inline 只是 建议,编译…

Flink 与 Hive 深度集成

引言 在大数据生态中,Flink 的流批一体化处理能力与 Hive 的数据存储分析优势结合,通过 Flink Connector for Hive 实现无缝对接,能显著提升数据处理效率。本文将系统解析 Flink 与 Hive 集成的核心操作,涵盖配置、读写、优化全流…

Axios面试常见问题详解

axios面试常问题目及其详解 以下是前端面试中关于 Axios 的常见问题及详细解答,涵盖核心原理、实战场景和进阶优化,帮助你在面试中清晰展示技术深度。 1. Axios 是什么?它与原生 Fetch API 有何区别? 回答要点: Axi…

14.2 《3小时从零搭建企业级LLaMA3语言助手:GitHub配置+私有化模型集成全实战》

3小时从零搭建企业级LLaMA3语言助手:GitHub配置私有化模型集成全实战 关键词:GitHub 仓库配置, 项目初始化, 目录结构设计, 私有化模型集成, 开发环境标准化 Fork 并配置 GitHub 项目仓库 本节将手把手完成 LanguageMentor 项目的仓库克隆、环境配置和…

生物制药自动化升级:Modbus TCP与Ethernet/IP协议转换实践

为优化生物制药生产流程,我司计划将现有的Allen-Bradley PLC控制系统与新型生物反应器进行集成。由于两者采用不同的通信协议(AB PLC使用Modbus TCP,而生物反应器支持Ethernet/IP),直接通信存在障碍。为此通过稳联技术…

商业云手机核心优缺点分析

商业云手机核心优缺点分析,综合技术性能、成本效率及场景适配性等多维度对比: 核心优势‌ 成本革命‌ 硬件零投入‌:免除实体手机采购(旗舰机均价6000元),企业百台规模可省60万 CAPEX。 弹性计费‌&…

Windows 远程桌面添加 SSL 证书指南

Windows 远程桌面添加 SSL 证书指南 🧾 准备工作🔐 第一步:使用 Certbot 申请 SSL 证书📦 第二步:生成 PFX 格式证书文件📁 第三步:导入证书到 Windows 证书管理器🔒 第四步&#xf…

项目实训技术实现——核心关键:基于二叉分割的布局生成算法

核心关键:基于二叉分割的布局生成算法 上一篇针对llava这种为每个元素分别预测每个元素的框的方法进行了分析,已经证实这条路难以行得通。因此,我们考虑直接按照板块划分整个背景布局,然后在板块内,进一步划分出我们需…

uniapp 配置devserver代理

在uniapp项目中配置devserver代理,需要先检查用的vue版本。 vue3不能在manifest.json配置代理。 1.先检查项目用的vue版本 找到manifest.json文件查看vue的版本。 2.vue2在manifest.json内配置 "h5" : { "devServer": { …

移动端 WebView 页面性能调试实战:WebDebugX等工具协同与优化

随着移动互联网的发展,越来越多的应用开始使用 WebView 加载网页内容。然而,这种方式虽然能快速实现跨平台开发,但也带来了很多性能瓶颈,尤其是在移动端设备上。WebView 本身的性能限制、页面加载慢、JS 执行阻塞等问题时常成为开…

临时文件夹大量0字节xml问题排查

某天偶然打开我的c:\users\我的用户名\AppData\Local\Temp 目录,发现有很多0字节的.xml文件,你删除以后一会还会大量产生,如下图: 下载了ProcessMonitor,记录了一会日志,查找*.xml发现是资源管理器在创建这…

突破微小目标检测瓶颈:智能无人机在蓝莓产量估算中的解决方案

【导读】 本文提出了一种使用搭载计算机视觉的智能无人机估算蓝莓产量的方法。系统利用两个YOLO模型:一个检测灌木丛,另一个检测浆果。它们协同工作,智能控制无人机位置和角度,安全获取灌木近景图,实现精准的浆果计数…