当前位置: 首页 > news >正文

springboot实现Hessian协议的RPC服务

背景

这段时间在公司接手了一个新项目,看到一段代码非常奇怪的,研究了好久。内容大概是这样

public void getUser (int id) {userService.getById(id);
}

当我点击这个方法进去的时候,我发现这个UserService类居然是导入jar包的一个接口,而且没有实现类。反编译过来的代码大概是这样

public Interface UserService {User getById(int id);
}

没有实现类,也没有类似于feign这种远程调用。我思考了很久,到底是怎样可以做到只用接口就实现功能了,首先想到的是mybatis的mapper类型接口,但是这种人家有@Mapper注解,能用切面之类的。如果是rpc或者微服务,怎么会没有远程调用地址?根据我使用过的框架feign、dubbo、restTemplate哪个没有远程调用地址?莫非是为了代码的保密性,将接口和实现类分开打Jar包了?摸索了半天,什么都没发现。
后来我看到一个很奇怪的名词:Hessian,百度了解之后,得知这玩意就是rpc框架。。。而且使用的方式有很大不一样,就学习了一下。所谓的只有接口没有实现类和feign调用的那种方式差不多,由服务提供者来提供一个jar包,里面全是接口和一些vo类。

Hessian入门学习

Hessian协议是一种轻量级的RPC协议,可以用于高效地实现跨语言的服务调用。在本文中,我们将介绍如何使用Spring Boot实现基于Hessian协议的RPC服务。

1. 添加Hessian依赖

在开始之前,我们需要在Spring Boot项目中添加Hessian依赖。可以在pom.xml文件中添加以下依赖:

<dependency><groupId>com.caucho</groupId><artifactId>hessian</artifactId><version>4.0.38</version>
</dependency>

2. 创建RPC接口

创建一个接口,包含需要远程调用的方法。例如,创建一个名为UserService的接口,包含getUserById()方法:

public interface UserService {User getUserById(int userId);
}

3. 实现RPC接口

创建一个UserService的实现类,并在其中实现getUserById()方法。例如:

@Service
public class UserServiceImpl implements UserService {@Overridepublic User getUserById(int userId) {// 实现获取用户信息的逻辑return userDao.getUserById(userId);}
}

4. 配置Hessian服务端

在Spring Boot应用程序的配置类中,使用HessianServiceExporter将UserService实现类暴露为Hessian服务端。例如:

@Configuration
public class HessianConfig {@Autowiredprivate UserService userService;@Bean(name = "/userService")public HessianServiceExporter hessianServiceExporter() {HessianServiceExporter exporter = new HessianServiceExporter();exporter.setService(userService);exporter.setServiceInterface(UserService.class);return exporter;}
}

在上面的配置中,使用@Bean注解将HessianServiceExporter实例化为Spring Bean,并使用/setService()和/setServiceInterface()方法将UserService实现类暴露为Hessian服务端。

5. 测试Hessian服务端

启动Spring Boot应用程序,并访问http://localhost:8080/userService。如果一切正常,应该会看到Hessian服务端的欢迎信息。

6. 创建RPC客户端

创建一个名为UserServiceClient的接口,并在其中定义远程调用getUserById()方法。例如:

public interface UserServiceClient {User getUserById(int userId);
}

7. 配置Hessian客户端

在Spring Boot应用程序的配置类中,创建一个HessianProxyFactoryBean实例,并使用/setServiceUrl()和/setServiceInterface()方法将UserServiceClient接口绑定到Hessian服务端。例如:

@Configuration
public class HessianConfig {// 配置Hessian服务端@Autowiredprivate UserService userService;@Bean(name = "/userService")public HessianServiceExporter hessianServiceExporter() {HessianServiceExporter exporter = new HessianServiceExporter();exporter.setService(userService);exporter.setServiceInterface(UserService.class);return exporter;}// 配置Hessian客户端@Beanpublic HessianProxyFactoryBean userServiceClient() {HessianProxyFactoryBean factory = new HessianProxyFactoryBean();factory.setServiceUrl("http://localhost:8080/userService");factory.setServiceInterface(UserServiceClient.class);return factory;}
}

在上面的配置中,使用@Bean注解将HessianProxyFactoryBean实例化为Spring Bean,并使用/setServiceUrl()和/setServiceInterface()方法将UserServiceClient接口绑定到Hessian服务端。

8. 测试Hessian客户端

在需要调用UserService的代码中,使用@Autowired注解将UserServiceClient实例化为Spring Bean。例如:

@Service
public class UserServiceCaller {@Autowiredprivate UserServiceClient userServiceClient;public User getUserById(int userId) {return userServiceClient.getUserById(userId);}
}

在上面的代码中,使用@Autowired注解将UserServiceClient实例化为Spring Bean,并调用getUserById()方法以远程调用Hessian服务端。

9. 完成

现在已经成功地使用Spring Boot实现了基于Hessian协议的RPC服务和客户端。你可以在应用程序中使用这些服务和客户端来实现远程过程调用,从而使应用程序更加灵活和高效。

相关文章:

springboot实现Hessian协议的RPC服务

背景 这段时间在公司接手了一个新项目&#xff0c;看到一段代码非常奇怪的&#xff0c;研究了好久。内容大概是这样 public void getUser (int id) {userService.getById(id); }当我点击这个方法进去的时候&#xff0c;我发现这个UserService类居然是导入jar包的一个接口&…...

2-6 SpringCloud快速开发入门: Eureka 服务注册中心发现与消费服务

接上一章节向Eureka 服务注册中心注册服务&#xff0c;这里讲讲Eureka 服务注册中心发现与消费服务 Eureka 服务注册中心发现与消费服务 我们已经搭建一个服务注册中心&#xff0c;同时也向这个服务注册中心注册了服务&#xff0c;接下来我们就可以发现和消费服务了&#xff0…...

Java-Web之s2-001与CommonsCollections

本文源自我个人入坑Java-Web安全的一点小经验&#xff0c;献给那些看得懂java代码但不知道从哪里入手代审的师傅们&#xff1a;&#xff09; Struts2之s2-001 环境配置 说说环境配置的问题&#xff0c;大多数人对漏洞复现的恐惧感还是来自于环境的配置&#xff0c;也许配了大…...

【JavaSE】数组的定义和使用(下)

数组的定义和使用&#xff08;下&#xff09;4. 数组练习4.1 模拟实现toString4.2 数组拷贝4.3 比较两个数组是否相同4.4 填充数组4.3 求数组中元素的平均值4.4 查找数组中指定元素&#xff08;顺序查找&#xff09;4.5 查找数组中指定元素&#xff08;二分查找&#xff09;4.6…...

Oracle 实现对全局错误语句的审计监控 ORA- alert

--将所有数据库ora-错误写入表create table error_tab (username varchar2(4000), d_current_nr_error varchar2(4000), ora_server_error_msg varchar2(4000), full_text varchar2(4000),errdate date);create or replace trigger error_triggerafter servererror on database…...

React解决样式冲突问题的方法

React解决样式冲突问题的方法 前言&#xff1a; 1、React最终编译打包后都在一个html页面中&#xff0c;如果在两个组件中取一样类名分别引用在自身&#xff0c;那么后者会覆盖前者。 2、默认情况下&#xff0c;只要导入了组件&#xff0c;不管组件有没有显示在页面中&#x…...

Go项目(用户操作微服务)

简介 用户留言、收藏、修改收货地址等&#xff0c;统一放在用户操作微服务这里按照业务类型划分微服务表设计&#xff0c;三张表// 用户收藏 type UserFav struct {BaseModel// 联合索引 idx_user_goods&#xff0c;且唯一User int32 gorm:"type:int;index:idx_user_goo…...

Spring Boot统一功能处理

目录 一、统一用户登录权限验证 1.1 自定义拦截器 1.2 将自定义拦截器加入到系统配置 1.3 统一访问前缀 二、统一异常处理 三、统一数据格式返回 一、统一用户登录权限验证 1.1 自定义拦截器 拦截器是一个普通的类&#xff0c;需要实现HandlerInterceptor接口并重写pre…...

ETCD多次出现CONTEXT DEADLINE EXCEEDED

roothqa-master-01:~# etcdctl --endpoints$ETCD_ENDPOINTS member list --write-outtable {“level”:“warn”,“ts”:“2020-03-23T14:19:45.0330800”,“caller”:“clientv3/retry_interceptor.go:61”,“msg”:“retrying of unary invoker failed”,“target”:“endpoi…...

git 提交 多人开发避免冲突

代码正常提交 git add . git commit -m ‘备注信息’ git status 查看本地提交状态 git pull 拉取代码 git push origin master 指定远程仓库名和分支名 ‘’ 如果多人开发 A和B 提交避免冲突 B拉取代码修改内容直接提交后 A也修改了内容在git add / git commit / git pull / g…...

求职复盘:干了四年外包出来,面试5次全挂

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;毕业于普通二本院校非计算机专业&#xff0c;18年跨专业入行测试&#xff0c;第一份工作在湖南某软件公司&#xff0c;做了接近4年的外包测试工程师&#xff0c;今年年初&#xff0c;感觉自己不能够再这样下去了&…...

AXI总线核心解读---基于官方文档

AXI总线 何处使用AXI ZYNQ异构芯片&#xff0c;内部总线使用的AXI总线纯FPGA的IP接口也要用高速接口&#xff0c;DDR&#xff08;AXI、传统&#xff09;等模块都有涉及到 什么是AXI总线 AXI的三种形式: AXI-FULL&#xff1a;高性能的存储器映射需求—可以256个以内发送 存储器…...

【Linux修炼】15.进程间通信

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 进程间通信进程间通信一.理解进程间通信1.1 什么是通信1.2 为什么要有通信1.3 如何进行进程间通信二.管道2.1 匿名管道2.2 匿名管道编码部分2.3 管道的特点2.4 如何理解命令行中的管道2.5 进程控制多个子进程三.命名管道3.…...

每天一道大厂SQL题【Day15】微众银行真题实战(五)

每天一道大厂SQL题【Day15】微众银行真题实战(五) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…...

如何优化查询大数据量的表

给你100万条数据的一张表&#xff0c;你将如何查询优化&#xff1f;1.两种查询引擎查询速度&#xff08;myIsam 引擎 &#xff09;InnoDB 中不保存表的具体行数&#xff0c;也就是说&#xff0c;执行select count(*) from table时&#xff0c;InnoDB要扫描一遍整个表来计算有多…...

卷麻了,00后Jmeter用的比我还熟练,简直没脸见人......

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对测试工具的使用感到困扰&#xff1f;前言性能测试是一个全栈工程师/架构师必会的技能之一&#xff0c;只有学会性能测试&#xff0c;才能根据得到的测试报告进行分析&#xff0c;找到系统性…...

力扣-树节点

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道中等的力扣sql练习题。 文章目录前言一、题目&#xff1a;608. 树节点二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结前言 …...

MySQL8启动错误“Neither found #innodb_redo subdirectory, nor ib_logfile* files”

今天做MySQL备份文件回复测试,用来检验MySQL备份文件可用性。 MySQL版本8.0.32 备份文件为腾讯云MySQL实例,版本8.0 使用xtrabackup恢复备份。执行过程顺利,启动MySQL时发生错误。提示如下: 注意,这里使用了systemctl stop mysql。虽然启动失败了,但是如果不执行这条…...

JVM系列——详细说明Volatile,原子性/可见性,先行发生原则

上篇我们讨论了JMM中的工作内存和主内存、内存直接的交互指令&#xff0c;以及指令之间的顺序规则。 本篇将会以上篇为基础&#xff0c;详细介绍并发编程中的三个重要概念/工具&#xff1a;Volatile、原子性/可见性和先行发生&#xff08;happens-before)原则。 volatile型变量…...

ArcGIS:栅格计算器的运算符和函数详解

01 栅格计算器在哪&#xff1f;02 运算符说明栅格计算器的表达式书写与Python语法一致&#xff08;由于其为解释型语言并且语言简洁优美&#xff0c;因此简单上手&#xff09;&#xff0c;这里主要简单说明各个运算符即可使用栅格计算器构建地图代数表达式以输出要求的栅格图像…...

TP-LINK路由器IPTV功能实战:解决浙江电信DHCP+获取失败问题

TP-LINK路由器IPTV功能深度解析&#xff1a;从LLDP协议到浙江电信DHCP故障排查 浙江电信的IPTV用户最近频繁反馈一个棘手问题&#xff1a;当使用TP-LINK路由器的IPTV功能时&#xff0c;机顶盒无法通过DHCP协议获取IP地址。这个看似简单的网络故障背后&#xff0c;实则隐藏着LLD…...

ssm+java2026年毕设数据分析教学网站【源码+论文】

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于会议管理问题的研究&#xff0c;现有研究主要以传统OA办公系统或通用协同办公平台为主&#xff0c;专门针对会议全生命周期…...

PingFangSC字体实战指南:从基础配置到性能优化全攻略

PingFangSC字体实战指南&#xff1a;从基础配置到性能优化全攻略 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件&#xff0c;包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC PingFangSC&#xff08;苹果平方简体&am…...

嵌入式SD卡文件处理轻量级工具库LC_SDTools

1. LC_SDTools 库概述LC_SDTools 是一个面向嵌入式 SD 卡文件系统应用的轻量级工具库&#xff0c;专为解决裸机或 RTOS 环境下 SD 卡文件操作中高频缺失的基础能力而设计。其核心定位并非替代 FatFs、LittleFS 或 ChibiOS FAT 模块等完整文件系统栈&#xff0c;而是作为上层应用…...

软考:团队管理与绩效域50大实战难题破解清单,写进论文直接加分!

对于软考高项&#xff08;信息系统项目管理师&#xff09;的考生来说&#xff0c;论文是决定成败的关键。而一篇高分论文的核心&#xff0c;在于能否用真实、具体的项目实践&#xff0c;去论证你对项目管理知识体系的深刻理解。项目团队管理和项目绩效域是论文中最常考、也最容…...

RAG检索增强生成技术及应用

首先&#xff0c;是什么&#xff1f; RAG是模型生成回答前从指定知识库中精准抓取信息&#xff0c;再结合这些依据去生成内容&#xff0c;回答问题&#xff08;给一个学霸配备一个随身图书馆&#xff0c;方便随时查阅&#xff09; 核心就是&#xff1a;知识库&#xff08;存资料…...

SDMatte效果可视化对比:传统U-Net抠图 vs SDMatte+,玻璃反光/薄纱透光细节放大评测

SDMatte效果可视化对比&#xff1a;传统U-Net抠图 vs SDMatte&#xff0c;玻璃反光/薄纱透光细节放大评测 1. 评测背景与目标 在电商设计、影视后期和平面制作领域&#xff0c;高质量图像抠图一直是刚需。传统U-Net架构虽然能完成基础的主体分离&#xff0c;但在处理玻璃器皿…...

Fast-F1数据洞察:赛车数据分析实战的非传统路径

Fast-F1数据洞察&#xff1a;赛车数据分析实战的非传统路径 【免费下载链接】Fast-F1 FastF1 is a python package for accessing and analyzing Formula 1 results, schedules, timing data and telemetry 项目地址: https://gitcode.com/GitHub_Trending/fa/Fast-F1 你…...

别再死记公式了!用Python的SymPy库5分钟搞定雅可比矩阵计算(附机器人学实例)

用SymPy解放双手&#xff1a;5分钟完成雅可比矩阵的符号计算与机器人学应用 记得研究生时期推导机械臂动力学方程&#xff0c;我曾在草稿纸上密密麻麻写满三页偏导数&#xff0c;最后发现一个正负号错误导致全部重算。直到遇见SymPy——这个Python符号计算库彻底改变了我的工作…...

Windows 10/11下GitHack安装配置全攻略:从Python2到实战测试一步到位

Windows 10/11下GitHack实战配置指南&#xff1a;从环境搭建到漏洞挖掘全解析 在网络安全竞赛和渗透测试领域&#xff0c;.git目录泄露一直是常见的敏感信息泄露漏洞。对于Windows平台的安全研究人员来说&#xff0c;如何快速搭建GitHack工具链并有效利用这一漏洞&#xff0c;是…...