当前位置: 首页 > 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;这里主要简单说明各个运算符即可使用栅格计算器构建地图代数表达式以输出要求的栅格图像…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...