基于jsonrpc4j实现JSON-RPC over HTTP(服务端集成Spring Boot)

1.JSON-RPC说明

JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)协议。
它主要定义了一些数据结构及其相关的处理规则。
它运行时可以基于tcp(socket),http等不同的消息传输方式,
即它不关心底层传输方式的细节。
它使用JSON(RFC 4627)作为数据格式。
目前版本为JSON-RPC 2.0。

2.JSON-RPC over HTTP说明

JSON-RPC over HTTP是一种基于HTTP协议的传输方式实现JSON-RPC,
在客户端和服务器之间传输JSON-RPC定义的JSON格式的数据。
本文通过jsonrpc4j实现JSON-RPC,
通过Spring Boot对外提供HTTP接口,
两种相结合可以实现JSON-RPC over HTTP。

3.JSON-RPC服务端

服务端对外提供HTTP接口的方式有很多,
这里选择集成常用的Spring Boot框架。

3.1.父工程JSON-RPC-SpringBoot

新建父工程JSON-RPC-SpringBoot,
pom增加依赖管理如下:

    <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.3.1.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.github.briandilley.jsonrpc4j</groupId><artifactId>jsonrpc4j</artifactId><version>1.6</version></dependency></dependencies></dependencyManagement>

3.2.子工程JSON-RPC-SB-api

新建子工程JSON-RPC-SB-api,
该工程用于在服务端和客户端共享RPC API,
只依赖jsonrpc4j开源框架,
pom增加依赖如下:

    <dependencies><dependency><groupId>com.github.briandilley.jsonrpc4j</groupId><artifactId>jsonrpc4j</artifactId></dependency></dependencies>

创建对外的JSON-RPC接口BookRpcService.java:

package com.ai.json.rpc.service;import com.ai.json.rpc.entity.Book;
import com.googlecode.jsonrpc4j.JsonRpcService;@JsonRpcService("rpc/books")
public interface BookRpcService {public Book findById(String id);
}

创建用到的实体类Book.java

package com.ai.json.rpc.entity;public class Book {private String id;private String name;private int price;
}

3.3.子工程JSON-RPC-SB-server

创建子工程JSON-RPC-SB-server,
pom增加依赖如下:

  <dependencies><dependency><groupId>edu.yuwen.protocol</groupId><artifactId>JSON-RPC-SB-api</artifactId><version>${project.version}</version></dependency>       <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

创建服务端启动类JsonRpcClientApplication.java:

package com.ai.json.rpc;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class JsonRpcApplication {public static void main(String[] args) {SpringApplication.run(JsonRpcApplication.class, args);}
}

创建jsonrpc4j的配置类RpcConfiguration.java:

package com.ai.json.rpc.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter;@Configuration
public class RpcConfiguration {@Beanpublic AutoJsonRpcServiceImplExporter rpcServiceImplExporter() {return new AutoJsonRpcServiceImplExporter();}
}

创建BookRpcService这个RPC接口的实现类BookRpcServiceImpl.java:

package com.ai.json.rpc.service.impl;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.ai.json.rpc.entity.Book;
import com.ai.json.rpc.service.BookRpcService;
import com.ai.json.rpc.service.BookService;
import com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImpl;@AutoJsonRpcServiceImpl
@Service
public class BookRpcServiceImpl implements BookRpcService {private static Logger LOG = LoggerFactory.getLogger(BookRpcServiceImpl.class);private static Map<String, Book> id2Book = new HashMap<>();static {id2Book.put("1", new Book("1", "Java核心技术", 199));id2Book.put("2", new Book("2", "人月神话", 58));id2Book.put("3", new Book("3", "程序员养生指南", 996));}@Overridepublic Book findById(String id) {Book book = id2Book.get(id);LOG.info("根据图书Id={}找到图书Book={}", id, book);return book;}
}

4.Postman调用JSON-RPC API

在启动JSON-RPC服务端后,
可以使用Postman调用服务端提供的接口,
因为这里面使用的HTTP和JSON技术都是基于现成的技术栈。

Postman调用设置如下:
HTTP Method: POST
HTTP URL: http://localhost:9090/rpc/books
Content-Type: application/json
请求内容:

{"id": "2073176624","jsonrpc": "2.0","method": "findById","params": ["3"]
}

JSON-RPC API接口调用成功,
响应内容:

{"jsonrpc": "2.0","id": "2073176624","result": {"id": "3","name": "程序员养生指南","price": 996}
}

在这里插入图片描述

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

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

相关文章

Tabbar切换效果(vant)

route 是否开启路由模式 <template><div class"layout-page"><!-- 二级路由出口 --><router-view></router-view><van-tabbar route><van-tabbar-item to"/home">首页<!-- 图标切换为active是高亮 -->&…

JAVA实现敏感词高亮或打码过滤:sensitive-word

练手项目中实现发表文章时检测文章是否带有敏感词&#xff0c;以及对所有敏感词的一键过滤功能 文章目录 效果预览实现步骤 效果预览 随便复制一篇内容到输入框 机器审核文章存在敏感词&#xff0c;弹消息提示并进入人工审核阶段&#xff08;若机器审核通过&#xff0c;则无需审…

eclipse的日志文件放在什么位置

eclipse的日志文件放在<workspace的目录>/.metadata目录下面&#xff0c;例如&#xff1a;

html中一个div中平均一行分配四个盒子,可展开与收起所有的盒子

html中一个div中平均一行分配四个盒子&#xff0c;可展开与收起所有的盒子 1.截图显示部分 2.代码展示部分 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"wid…

12.8_黑马数据结构与算法笔记Java

目录 044 递归 e04 冒泡排序2 044 递归 e05 插入排序1 044 递归 e05 插入排序2 045 多路递归 斐波那契 046 多路递归 斐波那契 时间复杂度 047 多路递归 斐波那契 兔子问题 048 多路递归 斐波那契 青蛙跳台阶 049 递归 优化 记忆法 050 递归 爆栈问题 051 递归 尾调用…

Linux驱动开发一

一、Linux驱动开发与裸机开发的区别 1、开发思维区别 裸机驱动&#xff1a; &#xff08;1&#xff09;底层&#xff0c;跟寄存器打交道&#xff0c;有些MCU提供了库 Linux驱动&#xff1a; &#xff08;1&#xff09;Linux下驱动开发直接操作寄存器不现实 &#xff08;2…

【MATLAB源码-第97期】基于matlab的能量谷优化算法(EVO)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 能量谷优化算法&#xff08;Energy Valley Optimization, EVO&#xff09;是一种启发式优化算法&#xff0c;灵感来源于物理学中的“能量谷”概念。它试图模拟能量在不同能量谷中的转移过程&#xff0c;以寻找最优解。 在EVO…

Springboot+FastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文)

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行-CSDN博客 在上面搭建SpringBoot项目的基础上&#xff0c;并且在项目中引入fastjson、hutool、lombok等所需依赖后。 系统需…

unity 2d 入门 飞翔小鸟 小鸟跳跃 碰撞停止挥动翅膀动画(十)

1、切换到动画器 点击make transition和exit关联起来 2、设置参数 勾选掉Has Exit Time 3、脚本给动画器传参 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : MonoBehaviour {//获取小鸟&#xff08;刚体&#xff09;p…

JVM常见垃圾回收器

串行垃圾回收器 Serial和Serial Old串行垃圾回收器&#xff0c;是指使用单线程进行垃圾回收&#xff0c;堆内存较小&#xff0c;适合个人电脑 Serial作用于新生代&#xff0c;采用复制算法 Serial Old作用于老年代&#xff0c;采用标记-整理算法 垃圾回收时&#xff0c;只有…

Windows 系统,TortoiseSVN 无法修改 Log 信息解决方法

使用SVN提交版本信息时&#xff0c;注释内容写的不全。通过右键TortoiseSVN的Show log看到提交的的注释&#xff0c;右键看到Edit log message的选项&#xff0c;然而提交后却给出错误提示&#xff1a; Repository has not been enabled to accept revision propchanges; ask …

【PHP】php发送邮箱验证码格式美化,样式美化

效果展示&#xff1a; 格式美化前 格式美化后 代码 大多数框架都自带有封装好的发送email方法&#xff0c;就不多赘述&#xff0c;主要写格式&#xff1a; <? php// 验证码过期时间 $expire 120; // 发件人邮箱 $from_email xx163.com; // 收件人 $to_email to163.com…

数据分析基础之《matplotlib(5)—直方图》

一、直方图介绍 1、什么是直方图 直方图&#xff0c;形状类似柱状图却有着与柱状图完全不同的含义。直方图牵涉统计学的概念&#xff0c;首先要对数据进行分组&#xff0c;然后统计每个分组内数据元的数量。在坐标系中&#xff0c;横轴标出每个组的端点&#xff0c;纵轴表示频…

无人机巡山护林,林业无人机智能助力绿色守护

随着全球环保意识的不断提高&#xff0c;无人机巡山护林已经成为解决森林巡检难题的一种独特而高效的方式。在我国&#xff0c;各地正积极探索无人机在森林防火、病虫害监测以及生态调查等领域的创新应用。随着无人机技术的不断演进&#xff0c;其在推动森林保护和可持续发展方…

【Docker】进阶之路:(九)Docker网络

【Docker】从零开始&#xff1a;19.Docker网络 Docker网络模式简介bridge网络模式host网络模式none网络模式container网络模式user-defined网络模式1.创建自定义的bridge网络2.使用自定义网络 高级网络配置docker network命令 为什么要了解容器的网络模式? 首先&#xff0c;容…

工业级路由器在风力发电场的远程监控技术

工业级路由器在风力发电场的远程监控技术方面具有重要的应用意义。风力发电场通常由分布在广阔地区的风力发电机组组成&#xff0c;需要进行实时监测、数据采集和远程管理。工业级路由器作为网络通信设备&#xff0c;能够提供稳定可靠的网络连接和多种远程管理功能&#xff0c;…

深入探讨Go语言协程调度:GRM模型解析与优化策略

一、线程调度 1、早期单线程操作系统 一切的软件都是跑在操作系统上&#xff0c;真正用来干活&#xff08;计算&#xff09;的是 CPU早期的操作系统每个程序就是一个进程&#xff0c;直到一个程序运行完&#xff0c;才能进行下一个进程&#xff0c;就是“单进程时代”一切的程…

EXP-00056: 遇到 ORACLE 错误 12154 ORA-12154: TNS: 无法解析指定的连接标识符

exp oas/oasoas filed:\daochu.dmp owner(s) 导出特定用户 //exp 用户名/密码数据库 filed:\daochu.dmp owner(用户名) 1.重启oracle监听 cmd 中输入 services.msc 找到服务&#xff1a;OracleOraDb10g_home1TNSListener 与 OracleServiceORCL。 把两个服务启动. 若未解决…

Vue 3 + Tailwind CSS:打造现代化项目的完美组合

Vue 3 Tailwind CSS&#xff1a;打造现代化项目的完美组合 本篇教程将向你介绍如何将 Tailwind CSS 与 Vue 3 项目搭配使用&#xff0c;为你的项目提供现代化的 UI 呈现和开发体验。通过本文的逐步演示和示例代码&#xff0c;你将很快掌握在 Vue 3 中集成和使用 Tailwind CSS…

SCI一区级 | Matlab实现GWO-CNN-BiLSTM-selfAttention多变量多步时间序列预测

SCI一区级 | Matlab实现GWO-CNN-BiLSTM-selfAttention多变量多步时间序列预测 目录 SCI一区级 | Matlab实现GWO-CNN-BiLSTM-selfAttention多变量多步时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-CNN-BiLSTM-selfAttention灰狼算法优化卷…