精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

再見 Feign!Spring Boot + JSON-RPC遠程調用新選擇

開發 前端
目前JSON-RPC的版本是2.0,該版本是目前廣泛使用的版本,它增加了錯誤處理、批處理請求(batch requests)、通知(notifications)等特性。

環境:SpringBoot3.4.2

1. 簡介

什么是JSON-RPC協議?

JSON-RPC 是一種輕量級的遠程過程調用(Remote Procedure Call,RPC)協議,它允許你在不同的系統之間通過網絡進行數據交換和調用函數。JSON-RPC 使用 JSON(JavaScript Object Notation)作為數據格式,這使得它非常適合于各種編程語言和平臺之間的通信。

目前JSON-RPC的版本是2.0,該版本是目前廣泛使用的版本,它增加了錯誤處理、批處理請求(batch requests)、通知(notifications)等特性。

JSON-RPC 2.0結構

請求,通常包含以下幾個字段:

  • jsonrpc: String,版本號,通常為 "2.0"
  • method: String,要調用的方法的名稱
  • params: 可選,參數列表或對象,傳遞給方法的參數
  • id: 可選,一個字符串、數字或 null。用于唯一標識請求,以便響應能夠回傳給正確

響應,通常包含以下幾個字段:

  • jsonrpc: 字符串,版本號,通常為 "2.0"
  • result: 請求成功時的返回值
  • error: 請求失敗時的錯誤對象
  • id: 與請求中的 ID 相匹配

說明:result與error,最終只會有一個返回。

JSON-RPC不同的編程語言都有對應的實現,在java中比較流行的則是jsonrpc4j,而本篇文章將基于該開源庫進行詳細的介紹。

什么是jsonrpc4j?

jsonrpc4j 使用 Jackson 庫將 Java 對象與 JSON 對象進行相互轉換(以及其他與 JSON-RPC 相關的功能)。包括以下功能:

  • 流式服務器(InputStream / OutputStream)
  • HTTP 服務器(HttpServletRequest / HttpServletResponse)
  • Portlet 服務器(ResourceRequest / ResourceResponse)
  • Socket 服務器(StreamServer)
  • 與 Spring 框架集成
  • 流式客戶端
  • HTTP 客戶端
  • 動態客戶端代理
  • 注解支持
  • 自定義錯誤解析
  • 復合服務 

2.實戰案例

2.1 依賴管理&接口定義

<dependency>
  <groupId>com.github.briandilley.jsonrpc4j</groupId>
  <artifactId>jsonrpc4j</artifactId>
  <version>1.7</version>
</dependency>

目前最新版本為1.7。

接口定義

public interface UserService {


  User createUser(String userName, String firstName, String password);
  User createUser(String userName, String password);
  User findUserByUserName(String userName);
  int getUserCount();
}
// 接口實現
@Service
@Primary
public class UserServiceImpl implements UserService {
  private static final List<User> USERS = new ArrayList<>();
  public User createUser(String userName, String firstName, String password) {
    User user = new User(userName, firstName, password);
    USERS.add(user);
    return user;
  }
  public User createUser(String userName, String password) {
    return this.createUser(userName, null, password);
  }
  public User findUserByUserName(String userName) {
    System.err.println("admin".equals(userName) ? 1 / 0 : "success") ;
    return USERS.stream().filter(user -> user.userName().equals(userName)).findFirst().orElse(null);
  }
  public int getUserCount() {
    return USERS.size();
  }
}

接下來,我們將從以下方面對 jsonrpc4j 進行詳細說明與使用示例解析。

  • RPC Server接口暴露的2種方式
  • RPC Client調用的3種方式
  • RPC Server錯誤處理
  • RPC Server 流式(Socket)服務

2.2 RPC Server接口暴露

定義方式1:使用JsonServiceExporter

// 注意:這里的beanName以 "/" 開頭,最終會被BeanNameUrlHandlerMapping處理
@Bean("/us")
JsonServiceExporter exporter(UserService userService, ObjectMapper objectMapper) {
  JsonServiceExporter exporter = new JsonServiceExporter() ;
  // 暴露的接口
  exporter.setServiceInterface(UserService.class) ;
  // 這里非必須設置
  exporter.setObjectMapper(objectMapper) ;
  // 對應的接口實現
  exporter.setService(userService) ;
  return exporter ;
}

通過此種方式,我們就完成了服務的暴露,任何支持 JSON-RPC 的客戶端均可訪問此服務,接口地址:http://localhost:8080/us

定義方式2:使用注解自動發現機制

修改上面的接口已經實現類,添加如下的注解:

@JsonRpcService("/us")
public interface UserService {
}
@AutoJsonRpcServiceImpl
@Service
@Primary
public class UserServiceImpl implements UserService {
}

接下來,還需要定義如下的bean(啟動掃描功能)。

@Bean
AutoJsonRpcServiceImplExporter autoExporter() {
  return new AutoJsonRpcServiceImplExporter() ;
}

這里我們推薦使用注解的方式。

2.3 RPC Client調用

配置方式1:使用AutoJsonRpcClientProxyCreator

首先,確保接口上使用了@JsonRpcServer注解:

@JsonRpcService("/us")
public interface UserService {}

接下來,配置AutoJsonRpcClientProxyCreator:

@Bean
AutoJsonRpcClientProxyCreator proxyCreator() throws Exception {
  AutoJsonRpcClientProxyCreator creator = new AutoJsonRpcClientProxyCreator() ;
  // 該baseUrl會自動拼接到@JsonRpcService的路徑前面; http://localhost:8080/us
  creator.setBaseUrl(URI.create("http://localhost:8080").toURL()) ;
  // 接口所在的包
  creator.setScanPackage("com.pack.rpc.server") ;
  return creator ;
}

配置方式2:使用JsonProxyFactoryBean

@Bean
JsonProxyFactoryBean userServiceProxy() {
  JsonProxyFactoryBean proxy = new JsonProxyFactoryBean() ;
  proxy.setServiceUrl("http://localhost:8080/us") ;
  proxy.setServiceInterface(UserService.class);
  return proxy ;
}

通過該FactoryBean,會自動的為UserService接口創建代理。

配置方式3:使用JsonRpcHttpClient

上面2種方式都是依賴的Spring環境,下面我們還可以使用如下的2中方式創建客戶端:

JsonRpcHttpClient client = new JsonRpcHttpClient(URI.create("http://localhost:8080/us").toURL()) ;
User user = client.invoke("createUser", new Object[] { "Spring Boot3實戰案例200講", "Pack", "123456" }, User.class);
System.err.println(user) ;


// 也可以通過如下方式創建代理
JsonRpcHttpClient client = new JsonRpcHttpClient(URI.create("http://localhost:8080/us").toURL());
UserService userService = ProxyUtil.createClientProxy(
    ClientTest.class.getClassLoader(),
    UserService.class,
    client) ;
User user = userService.createUser("Pack", "xg") ;
System.err.println(user) ;

2.4 測試

@RestController
@RequestMapping("/rpc")
public class RpcController {
  private final UserService userService ;
  public RpcController(UserService userService) {
    this.userService = userService;
  }


  @GetMapping("/create")
  public ResponseEntity<User> createUser(String userName, String firstName, String password) {
    return ResponseEntity.ok(this.userService.createUser(userName, firstName, password)) ;
  }


  @GetMapping("/query")
  public ResponseEntity<User> queryUser(String userName) {
    return ResponseEntity.ok(this.userService.findUserByUserName(userName)) ;
  }
}

運行結果

圖片圖片

圖片圖片

成功調用。

2.5 異常處理

我們按照上面接口實現,我們通過如下參數訪問查詢接口:

圖片圖片

控制臺異常信息如下:

圖片圖片

RPC Client接收到如上的異常數據。

我們可以通過如下方式自定義異常信息,在JSON-RPC 服務的接口上添加注解:

@JsonRpcErrors({
  @JsonRpcError(exception = Exception.class, code = -1, message = "服務發生異常")
})
User findUserByUserName(String userName);

再次訪問上面的接口后,控制臺輸出:

圖片圖片

2.6 流式(Socket)服務

我們可以通過Socket方式提供服務,如下示例:

服務端:

JsonRpcServer server = new JsonRpcServer(new UserServiceImpl()) ;
int maxThreads = 50 ;
int port = 8080 ;
ServerSocket serverSocket = new ServerSocket(port) ;
StreamServer ss = new StreamServer(server, maxThreads, serverSocket) ;


ss.start() ;

客戶端:

Socket socket = new Socket(InetAddress.getLocalHost(), 8080) ;
OutputStream os = socket.getOutputStream() ;


Map<String, Object> data = Map.of("jsonrpc", "2.0", "method", "createUser", 
  "params", new Object[] {"Spring Boot3實戰案例200講", "Pack", "111111"}, "id", "s-0001") ;
os.write(new ObjectMapper().writeValueAsBytes(data)) ;
socket.shutdownOutput(); 


InputStream is = socket.getInputStream() ;
System.err.println(new String(is.readAllBytes())) ;

運行結果

圖片

客戶端輸出:

圖片 圖片

責任編輯:武曉燕 來源: Springboot全家桶實戰案例源碼
相關推薦

2022-02-16 16:28:22

RPC鴻蒙操作系統

2024-05-31 08:45:24

2014-09-02 10:43:45

RedisRPC

2023-05-26 01:05:10

2017-08-10 16:14:07

FeignRPC模式

2021-08-29 18:36:57

項目

2015-06-09 13:31:29

Hadoop RPC遠源碼解析

2025-03-07 08:57:46

HTTP客戶端框架

2024-11-26 08:05:44

2025-09-04 01:55:00

2025-02-07 09:11:04

JSON對象策略

2019-06-21 14:48:25

RMI遠程RPC

2023-05-18 08:47:42

2024-01-31 18:02:47

OpenAISpringAI

2024-08-06 11:17:58

SpringJSON數據

2020-12-30 07:49:32

KubernetesJava Spring Clo

2018-06-06 14:30:38

Spring BootApplication事件

2022-04-01 17:25:19

銳捷網絡混合辦公多點辦公

2022-10-26 07:14:25

Spring 6Spring業務

2024-10-18 08:00:00

SpringBoot框架開發
點贊
收藏

51CTO技術棧公眾號

男人天堂999| 欧美裸体网站| 欧美日韩在线国产| 红杏视频成人| 欧洲精品一区二区三区在线观看| 中文字幕一区二区三区四区五区六区 | 98精品国产自产在线观看| www.av欧美| 日本一区二区乱| 欧美日韩久久久久| 伊人色综合久久天天五月婷| 欧美视频在线观看一区二区三区| 日韩制服丝袜av| 欧美日本国产在线| 谁有免费的黄色网址| 视频在线亚洲| 欧美日韩一区久久| 人妻有码中文字幕| 国产精品69xx| 亚洲日本在线a| 日韩精品久久一区| 风流少妇一区二区三区91| 蜜桃在线一区二区三区| 26uuu亚洲国产精品| 手机在线免费看毛片| 精品国产日韩欧美| 亚洲精品av在线| 欧美xxxx黑人| gogo大尺度成人免费视频| 色综合久久综合网| aa在线观看视频| 亚洲婷婷噜噜| 亚洲欧美视频一区| 亚洲综合欧美日韩| 国产中文在线| 久久久www免费人成精品| 国产精品日韩二区| 性欧美18一19性猛交| 久久精品国产77777蜜臀| 国产不卡视频在线| 国产区一区二区三| 一区二区国产精品| 国语自产在线不卡| xxxx 国产| 精品1区2区3区4区| 久久久久久91| 欧美成人aaa片一区国产精品| 999精品在线| 色一情一乱一区二区| 国产精品国产三级国产专业不 | www.天天色| 激情欧美一区| 国模视频一区二区| 狠狠躁夜夜躁人人爽天天高潮| 国产一区二区三区自拍| 久久91亚洲人成电影网站| 久久久久久久久毛片| 欧美高清一区| 久久久噜噜噜久噜久久| 久久久久亚洲av成人片| 一区三区视频| 91高清在线免费观看| 综合激情网五月| 日韩—二三区免费观看av| 国产精品一区二区性色av| 91好色先生tv| 国产福利视频一区二区三区| 国产精品有限公司| 三级在线电影| 成人自拍视频在线| 国产一区欧美二区三区| 国产丰满美女做爰| 成人高清视频在线观看| 久久亚洲高清| 91在线观看| 亚洲精品午夜久久久| 美女扒开大腿让男人桶| 天堂av在线| 欧美日韩免费在线视频| aaaaaaaa毛片| 奇米影视777在线欧美电影观看 | av在线下载| 五月婷婷久久丁香| 天天干在线影院| 亚洲精品观看| 国产午夜精品免费一区二区三区| 免费高清在线观看电视| 亚洲久久一区| 国产精品视频不卡| 韩国av永久免费| 国产日韩亚洲欧美综合| 五月天激情图片| 毛片免费看不卡网站| 欧美精品视频www在线观看 | 色婷婷狠狠五月综合天色拍| 中文字幕日韩av综合精品| 看片网站在线观看| 日韩综合小视频| 99精彩视频在线观看免费| 久久米奇亚洲| 亚洲一区二区三区四区五区黄| 91黄色小网站| 99a精品视频在线观看| 国产一区二区三区精品久久久 | 色噜噜偷拍精品综合在线| 亚洲欧美日韩三级| 影视先锋久久| 久久久噜噜噜久久久| 一级黄色免费看| 久久久高清一区二区三区| 男女激情免费视频| 日韩欧国产精品一区综合无码| 精品网站999www| 免费在线黄色片| 久久国产福利国产秒拍| 久久青青草原| 麻豆av在线播放| 欧美久久高跟鞋激| 女女互磨互喷水高潮les呻吟 | chinese少妇国语对白| 亚洲视频一起| 久久最新资源网| 国产裸体美女永久免费无遮挡| 成人亚洲一区二区一| 亚洲三区视频| 99只有精品| 亚洲精品影视在线观看| 国产大片中文字幕| 国产精品一区二区三区99| 日产精品一线二线三线芒果| 白浆在线视频| 精品成人在线观看| 欧美日韩精品一区二区三区视频播放 | 亚洲另类av| 午夜精品福利在线观看| 亚洲av无码乱码国产麻豆 | 国产精品视频一区在线观看| 成人国产精品视频| 天堂8在线天堂资源bt| 日韩一区二区三区高清在线观看| 久久天天躁狠狠躁夜夜躁| 中文字幕 国产| 欧美国产日韩精品免费观看| 国产精彩免费视频| 欧洲激情综合| 国产精品网站视频| 在线免费看黄网站| 欧美精三区欧美精三区| 国产人妻精品一区二区三区不卡| 国产一区亚洲一区| 三级在线免费观看| 亚洲超碰在线观看| 久久久久久久久久久免费精品| 成人午夜免费福利| 亚洲一区二区三区在线播放 | 国产清纯白嫩初高生在线观看91 | 久久精品国产亚洲av无码娇色| 国产精品996| 日韩亚洲欧美一区二区| 97青娱国产盛宴精品视频| 97激碰免费视频| 水中色av综合| 欧美中文字幕一区二区三区亚洲| 天天舔天天操天天干| 久久爱www久久做| 中国女人做爰视频| 国产女人18毛片水真多18精品| 亚州av一区二区| 久久久久久女乱国产| 精品视频一区 二区 三区| 加勒比婷婷色综合久久| 成人午夜激情视频| 欧洲av无码放荡人妇网站| 欧美精品一区二区三区中文字幕 | 亚洲av无码一区二区乱子伦| 婷婷综合五月天| 国产伦精品一区二区三区视频女| 麻豆国产91在线播放| 老司机午夜网站| 欧美电影在线观看免费| 国产精品久久久久久久天堂| www红色一片_亚洲成a人片在线观看_| 精品国产不卡一区二区三区| 欧美h在线观看| 一区视频在线播放| 久久福利小视频| 日本vs亚洲vs韩国一区三区二区| 强开小嫩苞一区二区三区网站| 久久黄色影视| 国产精品一区av| av资源一区| 少妇激情综合网| 婷婷丁香一区二区三区| 欧美日韩在线电影| 日韩三级视频在线| 国产精品久久久久国产精品日日 | 美女视频亚洲色图| 91精品美女在线| 少妇视频在线观看| 久久国产精品久久久| 理论视频在线| 亚洲国产成人一区| 91在线观看喷潮| 色偷偷久久一区二区三区| 欧美高清视频一区二区三区| 国产婷婷一区二区| 艳妇乳肉亭妇荡乳av| 狠狠v欧美v日韩v亚洲ⅴ| 黄www在线观看| 欧美激情综合| 中文字幕色一区二区| 精品成人影院| 精品综合久久| 亚洲精品在线播放| 国产欧美日韩中文| 久九九久频精品短视频| 欧美激情精品久久久久久黑人| 日本福利专区在线观看| 亚洲欧美国产制服动漫| 黄色小视频免费观看| 欧美精品xxxxbbbb| 欧美成人一区二区视频| 日韩欧美成人精品| 香蕉视频一区二区| 一区二区在线电影| 欧美丰满熟妇bbbbbb| 国产欧美一区二区精品性色 | 成人毛片在线精品国产| 欧美一区国产二区| 97超视频在线观看| 精品视频123区在线观看| 在线永久看片免费的视频| 偷拍与自拍一区| 97免费在线观看视频| 亚洲一区视频在线| 青娱乐国产精品| 一区二区激情小说| 久草免费新视频| 玉足女爽爽91| 久久免费在线观看视频| 一区二区三区在线免费视频| 久久久久久久久久网站| 亚洲精品少妇30p| 日日骚一区二区三区| 亚洲精品网站在线观看| 免费在线一级片| 亚洲第一成人在线| 日韩女优在线观看| 五月综合激情日本mⅴ| 国产精品7777777| 日韩欧美国产黄色| 亚洲高清视频免费观看| 欧美在线小视频| 91激情在线观看| 日韩欧美国产系列| 日日夜夜精品免费| 国产午夜精品麻豆| 成年人视频网站在线| 中文字幕在线日韩 | 五月婷婷六月激情| 亚洲欧美日韩国产中文| 国产高清视频在线| 最近中文字幕mv在线一区二区三区四区 | 亚洲中文字幕在线一区| 日韩欧美视频在线| 色一情一乱一区二区三区| 国产婷婷97碰碰久久人人蜜臀| 久青草国产在线| 久久天天躁日日躁| 蜜桃视频在线观看免费视频| 国产成人免费91av在线| 久久久久久久性潮| 99国产超薄丝袜足j在线观看| 蜜臀av一区| 亚洲午夜精品国产| 激情国产一区| 亚洲一级片网站| 成人一区在线看| 免费视频91蜜桃| 一区二区视频免费在线观看| 丰满少妇乱子伦精品看片| 欧美在线观看一区二区| 亚洲av少妇一区二区在线观看| 日韩国产在线播放| 大地资源网3页在线观看| 性欧美激情精品| 热久久久久久| 精品一区在线播放| 久久久久久久久国产一区| 国产免费黄视频| 黑人精品欧美一区二区蜜桃| 精品夜夜澡人妻无码av| 自拍视频在线观看一区二区| 91午夜视频在线观看| 欧美日韩小视频| 日本xxxxwww| 久久综合色影院| 欧美最新精品| 国产伦一区二区三区色一情| 成人黄色av| 91国视频在线| 国产成人99久久亚洲综合精品| 国产三级av在线播放| 亚洲国产精品久久艾草纯爱| 在线观看视频二区| 日韩毛片在线观看| 男女在线视频| 91老司机精品视频| 红桃成人av在线播放| 国产96在线 | 亚洲| 国产麻豆成人精品| 魔女鞋交玉足榨精调教| 亚洲视频小说图片| 超碰在线免费97| 精品无人国产偷自产在线| 国产三线在线| 亚洲精品欧美一区二区三区| 精品国产一区二区三区久久久蜜臀| 日本手机在线视频| 国产麻豆精品久久一二三| 最新日韩免费视频| 日本久久电影网| 水莓100在线视频| 国外成人在线视频| 超碰成人在线观看| 欧美一级爱爱视频| 国产一区二区三区久久久| 老司机精品免费视频| 欧美亚洲综合另类| 成人精品一区二区三区校园激情| 欧美在线视频a| 欧美aaaaa级| 日韩免费视频播放| 不卡高清视频专区| 日本特黄一级片| 亚洲精品国产欧美| 不卡专区在线| 久久精精品视频| 夜夜夜久久久| www.久久国产| 色94色欧美sute亚洲线路一ni| 免费理论片在线观看播放老| 欧美中文在线观看国产| 免费成人网www| 亚洲熟妇av一区二区三区| 26uuu精品一区二区三区四区在线| 丰满少妇乱子伦精品看片| 亚洲欧美日韩精品| 免费在线成人激情电影| 亚洲精品中字| 国产精品中文字幕一区二区三区| 99自拍视频在线| 欧美成人国产一区二区| wwww在线观看免费视频| 久久精品国产理论片免费| 在线综合亚洲| 欧美18—19性高清hd4k| 欧美日韩日日骚| 在线黄色网页| 久久亚洲一区二区| 日产欧产美韩系列久久99| 中国1级黄色片| 欧美成人精品福利| 国产网站在线| 日韩影院一区| 国产丶欧美丶日本不卡视频| 日韩欧美亚洲一区二区三区| 亚洲欧美成人一区二区在线电影| 中韩乱幕日产无线码一区| 伊人婷婷久久| 成人黄色在线看| 午夜精品免费观看| 久久视频在线免费观看| 久久国产精品色av免费看| 国产又猛又黄的视频| 一区二区三区在线观看欧美| 青青草在线播放| 国产色视频一区| 亚洲美女黄网| 91社区视频在线观看| 日韩免费高清视频| 丝袜美腿一区| 伊人再见免费在线观看高清版| 99精品视频中文字幕| 伊人22222| 91精品国产91久久久久福利| 久久性感美女视频| 在线黄色免费网站| 欧美日韩国产大片| 九九色在线视频| 丝袜美腿玉足3d专区一区| 成人综合婷婷国产精品久久| 中日韩av在线| 97视频在线观看播放| 久久中文亚洲字幕| 中文字幕免费看| 精品久久久久久久久久久久包黑料| 巨茎人妖videos另类| 成人在线免费高清视频| 国产免费成人在线视频|