精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美另类在线播放| 免费在线观看av| 蜜桃在线视频| 欧美gay男男猛男无套| 亚洲国产视频网站| 国产精品流白浆视频| 成人午夜精品无码区| 亚洲中文字幕在线观看| 亚欧日韩另类中文欧美| 亚洲一区二区黄色| 亚洲精品免费av| 成人在线手机视频| 成人va天堂| 久久久久久久久伊人| 欧美交受高潮1| 欧美色图校园春色| 国产三级在线播放| 狠狠狠色丁香婷婷综合激情| 最近2019中文字幕大全第二页| 国产又大又硬又粗| 毛片免费在线| 亚洲永久精品在线观看| 黄色在线播放| 亚洲综合好骚| 亚洲欧美另类在线观看| 久久无码高潮喷水| 日本大片在线观看| 久久不射网站| 一本色道久久综合亚洲精品小说 | 99国产精品99| 99re6这里只有精品| 欧美色道久久88综合亚洲精品| 99在线热播| 久久亚洲精品大全| 一区二区三区视频免费视频观看网站| 一区二区三区四区高清精品免费观看 | 亚洲精品天堂| 国产精品一区二区三区四区| 久久久精品日本| 波多野结衣电影免费观看| 青青草原成人网| 最新黄网在线观看| 极品少妇一区二区| 日韩美女在线看| 美女久久久久久久久久| 色婷婷综合久久久中字幕精品久久| 亚洲另类在线一区| 成人区精品一区二区| 日产欧产va高清| 你懂的视频欧美| 欧美欧美午夜aⅴ在线观看| 欧美视频观看一区| 中文字幕乱码一区二区| 91精品电影| 亚洲成人免费网站| 久久人妻精品白浆国产| 日本激情在线观看| 日韩激情视频在线观看| 久久精品国产欧美激情| 免费一级特黄3大片视频| 尤物tv在线精品| 欧美一区二区成人| 免费无码不卡视频在线观看| 超碰国产在线观看| 丰满白嫩尤物一区二区| 国产精品高潮粉嫩av| 日本aⅴ在线观看| 一本色道69色精品综合久久| 日韩三级视频在线看| 国产二区视频在线播放| 日韩深夜视频| 欧美性猛交xxxx免费看| 国产精品免费观看久久| 日韩电影免费观看高清完整版| 国产精品伦一区| 国产在线视频欧美一区二区三区| 国产女优在线播放| 一区在线视频| 日韩中文字幕在线| 超碰精品一区二区三区乱码| 欧美日韩在线视频一区二区三区| 韩国成人二区| 亚洲欧洲无码一区二区三区| 精品国产aⅴ麻豆| 国产又大又粗又硬| 日韩精品91亚洲二区在线观看| 国产va免费精品高清在线观看 | 中文字幕av免费观看| 久久99精品久久久久久国产越南| 国外成人性视频| 国产美女久久久久久| 久久91麻豆精品一区| 中文字幕在线观看亚洲| 9.1成人看片免费版| 日韩成人在线观看视频| 欧美日韩1区2区| 在线免费黄色小视频| 不卡亚洲精品| 色999日韩国产欧美一区二区| 欧美亚洲黄色片| 超碰在线无需免费| 国产精品免费人成网站| 青青草综合视频| 伦xxxx在线| 五月天视频一区| 白白操在线视频| 国产精品剧情一区二区在线观看| 亚洲成人久久影院| 色综合天天色综合| 亚洲电影有码| 欧美性色欧美a在线播放| 各处沟厕大尺度偷拍女厕嘘嘘| 午夜无码国产理论在线| 日韩精品一区二区三区在线播放 | 日本不卡一二三| 8v天堂国产在线一区二区| 日韩免费高清在线| 卡通欧美亚洲| 色爱区综合激月婷婷| 奇米777在线视频| 国产精品美女久久久久久不卡| 国产视频久久久久| 双性尿奴穿贞c带憋尿| 美女呻吟一区| 国产视频欧美视频| 天天干中文字幕| 青娱乐精品在线视频| 国产精品免费一区豆花| 天天射,天天干| 2020国产精品| 日日噜噜噜噜夜夜爽亚洲精品| 国产青青草在线| 国产精品视频在线看| 一区二区三区欧美成人| 成人video亚洲精品| 91成人免费电影| 少妇一级淫免费放| 人人精品视频| 中文欧美在线视频| 四虎成人在线观看| 毛片一区二区三区| 2014亚洲精品| 污视频网站免费观看| 久久你懂得1024| 男女猛烈激情xx00免费视频| 另类专区亚洲| 亚洲国模精品一区| 日韩欧美黄色网址| 丝袜诱惑制服诱惑色一区在线观看 | av无码一区二区三区| 五月天亚洲一区| 久久久亚洲精品视频| 亚洲老妇色熟女老太| 99国产精品久久久| 亚洲精品第一区二区三区| 欧美人与禽性xxxxx杂性| 天天影视色香欲综合网老头| 一起草最新网址| 久久久久av| 91久久国产婷婷一区二区| 亚洲精品久久久久久动漫器材一区| 亚洲欧美综合在线精品| 日韩成人精品视频在线观看| 精品福利一区| 97视频在线观看亚洲| 日本熟妇一区二区三区| 国产一区二区三区在线观看精品 | 国产裸体美女永久免费无遮挡| 久久久99精品免费观看| 天天影视综合色| 综合激情网...| 欧美极品少妇xxxxⅹ免费视频 | 亚洲欧美在线磁力| 91插插插插插插| 国产成人亚洲综合a∨婷婷图片| 欧美精品亚洲| 99久久伊人| 久久精品国产99国产精品澳门 | 亚洲成人精品久久| 成人午夜淫片100集| 欧美国产成人在线| 一级黄色片在线免费观看| 小嫩嫩12欧美| 国产精品久久久久9999| 国产调教视频在线观看| 亚洲成人激情在线观看| 最近中文字幕在线免费观看| 亚洲免费观看高清完整版在线观看熊 | 日韩精品在线一区二区| 久热这里只有精品6| 狠狠久久亚洲欧美| 欧美日韩不卡在线视频| 精品久久久亚洲| 91国语精品自产拍在线观看性色 | 性欧美高清come| 亚洲精品成人久久电影| 中文字幕福利视频| 亚洲国产视频a| 国产调教在线观看| 成人免费毛片a| a级片一区二区| 亚洲a级精品| 91久久久久久久久久| 精精国产xxx在线视频app| 日韩在线视频播放| 无码精品人妻一区二区三区影院| 欧美精品少妇一区二区三区| 国产福利拍拍拍| 成人精品gif动图一区| 波多野结衣 作品| 亚洲黄网在线观看| 99综合99| 中日韩美女免费视频网址在线观看| 这里只有久久精品视频| 一区二区三区四区高清精品免费观看| 国产精品无码网站| 亚洲综合99| 天堂а√在线中文在线| 亚洲小说图片视频| 97se亚洲综合在线| 日韩av黄色| 好吊操视频这里只有精品| www.亚洲激情| 亚洲同性同志一二三专区| 黑森林福利视频导航| 成人在线免费观看网站| 日韩免费在线播放| 在线欧美三级| 在线a欧美视频| 丰满人妻一区二区三区无码av| 中文字幕一区二区5566日韩| 亚洲污视频在线观看| 精品电影一区| 亚洲日本欧美在线| 国产精品一区二区三区av麻| caoporn国产精品免费公开| 成人自拍视频网| 日本a级片电影一区二区| 头脑特工队2在线播放| 天天影视色香欲综合网老头| 国产免费一区二区三区四区| 国产麻豆一精品一av一免费| 欧美精品性生活| 中文亚洲免费| 九色视频成人porny| 成人软件在线观看| 国语对白做受69| 2024最新电影在线免费观看| 亚洲人免费视频| 国产黑丝一区二区| 亚洲aⅴ网站| 国产精品久久久久久久久久新婚 | 日韩免费在线观看| 一级黄色av片| 欧美日韩性视频| 亚洲图片综合网| 国产成人在线电影| 国产精品一区二区无码对白| 午夜精品久久99蜜桃的功能介绍| 成人国产精品一区二区| 台湾av在线二三区观看| 欧美年轻男男videosbes| 日韩精品一区二区亚洲av| 五月开心婷婷久久| 日韩欧美激情视频| 色综合欧美在线视频区| 福利视频一二区| 欧美在线看片| 国产情侣第一页| 综合国产视频| 欧美亚洲丝袜| 国产精品亚洲综合在线观看| 久久影院中文字幕| 欧美极品少妇videossex| 欧美久久久精品| mm1313亚洲国产精品美女| 欧美丰满片xxx777| а√天堂中文资源在线bt| 欧美亚洲在线视频| 福利在线视频网站| 九九热99久久久国产盗摄| 天堂亚洲精品| 欧美激情精品久久久久久久变态 | 24小时成人在线视频| 成人性生交大片免费观看嘿嘿视频| 日本亚州欧洲精品不卡| 亚洲a在线观看| 久久综合五月婷婷| 日本高清久久一区二区三区| 日韩理论片av| 亚洲一区二区三区成人在线视频精品 | caoporm超碰国产精品| 国产又粗又猛又爽视频| 激情欧美日韩一区二区| av影片在线播放| 国产亚洲成aⅴ人片在线观看| 夜夜爽久久精品91| 不卡视频免费播放| 五月婷六月丁香| 亚洲成人一区二区| 日韩不卡高清视频| 日韩视频在线永久播放| 可以在线观看的av网站| 久久精品视频va| 女厕盗摄一区二区三区| 成人性生交大片免费看视频直播 | 丁香五月网久久综合| 综合国产视频| 宅男一区二区三区| 精品国产一区二区三区香蕉沈先生 | 91原创在线视频| 免费黄色国产视频| 国产日产欧美一区二区视频| 成人免费精品动漫网站| 疯狂蹂躏欧美一区二区精品| 国产男男gay体育生网站| 亚洲欧美国产另类| 黄色网在线免费看| 国产精品96久久久久久又黄又硬| 亚洲一区二区三区中文字幕在线观看 | 日韩三级一区二区三区| 欧美另类z0zxhd电影| 国产在线91| 久久久亚洲成人| 小向美奈子av| 成人久久18免费网站麻豆| a级在线观看视频| 亚洲国产cao| 在线免费观看视频网站| 亚洲天堂一区二区三区| 天天插天天干天天操| 色七七影院综合| 日韩精品免费观看视频| 精品乱子伦一区二区三区| 五月婷婷亚洲| 亚洲午夜无码av毛片久久| 国产麻豆91精品| eeuss中文字幕| 欧美色欧美亚洲另类二区| 免费一级a毛片| 亚洲高清免费观看高清完整版| 日本电影在线观看网站| 国产精品av在线| 亚洲激情77| 国产中文字幕视频在线观看| 不卡视频在线观看| 日本一级特级毛片视频| 欧美午夜片在线看| 成人在线免费视频| 国产97免费视| 男男gay无套免费视频欧美| 青青视频在线播放| 成人av片在线观看| 久久97人妻无码一区二区三区| 欧美日韩在线观看视频| 国产成人自拍一区| 久久久久久久91| 黄色网一区二区| 99热亚洲精品| 成人免费毛片高清视频| 日本少妇性生活| 欧美成人精品1314www| 在线观看小视频| 好看的日韩精品| 99精品视频免费观看视频| 福利视频一二区| 91偷拍与自偷拍精品| 国产情侣自拍av| 在线观看视频亚洲| 久久精品超碰| 国产精品久久久久免费| 亚洲成人在线| 国产chinese中国hdxxxx| 99久久精品国产毛片| 日韩视频在线观看一区| 国产视频自拍一区| 日韩在线影院| 国产大尺度在线观看| 国产一区二区三区在线观看精品| 欧美成人黄色网| 日韩精品在线观看一区| 欧美日韩国产v| 国产成人精品免费看在线播放| 国产69精品久久久久777| 免费黄色网址在线| 在线成人激情视频| 97一区二区国产好的精华液| 蜜桃日韩视频| wwwxxx在线观看| 777精品伊人久久久久大香线蕉| 美女羞羞视频在线观看| 国产视频一区二区三区四区| 免费在线亚洲| 国产一二三av| 亚洲黄色在线观看| 精品69视频一区二区三区| 欧美亚洲视频一区| 99久久精品国产一区| 一区二区小视频| 91国内免费在线视频|