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}
}