JSON-RPC是指通信协议采用二进制方式,而不是http,序列化采用JSON的形式;
基于json的跨语言远程调用协议;
比xml-rpc、webservice等基于文本的协议传输数据格小;相对hessian、Java-rpc等二进制协议便于调试、实现、扩展。
调用格式
{ "method": "方法名", "params": [“参数数组”], "id": 方法ID}
说明: 第一个参数: 方法的名值---- 是远程对象的方法 第二个参数: 参数数组 第三个参数: 方法ID(可以随意填) 举例: { "method": "doSomething", "params": [], "id": 1234}
输出格式
{ "jsonrpc": "2.0", "id": "1234", "result": null }
(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂
更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! !
引入jar
jsonrpc:[ "com.imooc.jsonrpc4j:jsonrpc4j:1.5.1" ]
请求
//请求对象 public class ProductRpcReq implements ParamInf { private List<String> idList; private BigDecimal minRewardRate; private BigDecimal maxRewardRate; private List<String> statusList; } //服务端接口 @JsonRpcService("rpc/products") public interface ProductRpc { /** * 查询多个产品 * @param req * @return */ List<Product> query(ParamInf req); /** * 查询单个产品 * @param id * @return */ Product findOne(String id); } //----------------------------------------------------------------------// //服务端实现 @AutoJsonRpcServiceImpl @Service public class ProductRpcImpl implements ProductRpc { private static Logger LOG = LoggerFactory.getLogger(ProductRpcImpl.class); @Autowired private ProductService productService; @Override public List<Product> query(ParamInf req) { LOG.info("查询多个产品,请求:{}", req); Pageable pageable = new PageRequest(0,100,Sort.Direction.DESC,"rewardRate"); Page<Product> result = productService.query(req.getIdList(), req.getMinRewardRate(), req.getMaxRewardRate(), req.getStatusList(), pageable); LOG.info("查询多个产品,结果:{}", result); return result.getContent(); } @Override public Product findOne(String id) { LOG.info("查询产品详情,请求:{}", id); Product result = productService.findOne(id); LOG.info("查询产品详情,结果:{}", result); return result; } } //服务端RPC配置 @Configuration public class JSONRpcConfiguration { private static Logger LOG = LoggerFactory.getLogger(JSONRpcConfiguration.class); @Bean public AutoJsonRpcServiceImplExporter rpcServiceImplExporter(){ return new AutoJsonRpcServiceImplExporter(); } } //消费端---------------------------------------------------------------------// // 配置文件中配置服务端地址 rpc.client.url:http://localhost:8082/manager //配置远程RPC地址 @Configuration public class JSONRpcConfiguration { private static Logger LOG = LoggerFactory.getLogger(JSONRpcConfiguration.class); @Bean @ConditionalOnProperty(value = {"rpc.client.url","rpc.client.basePackage"}) public AutoJsonRpcClientProxyCreator rpcClientProxyCreator(@Value("${rpc.client.url}") String url,@Value("${rpc.client.basePackage}") String basePackage) { AutoJsonRpcClientProxyCreator creator = new AutoJsonRpcClientProxyCreator(); try { creator.setBaseUrl(new URL(url)); } catch (MalformedURLException e) { LOG.error("创建rpc服务地址错误", e); } creator.setScanPackage(basePackage); return creator; } } //调用 @RestController @RequestMapping("/product") public class ProductController { @Autowired private ProductRpc productRpc; @RequestMapping(value = "/{id}",method = RequestMethod.GET) public Product findOne(@PathVariable String id){ return productRpc.findOne(id); } }
原文链接:概述
JSON-RPC是指通信协议采用二进制方式,而不是http,序列化采用JSON的形式;
基于json的跨语言远程调用协议;
比xml-rpc、webservice等基于文本的协议传输数据格小;相对hessian、Java-rpc等二进制协议便于调试、实现、扩展。
调用格式
{ "method": "方法名", "params": [“参数数组”], "id": 方法ID}
说明: 第一个参数: 方法的名值---- 是远程对象的方法 第二个参数: 参数数组 第三个参数: 方法ID(可以随意填) 举例: { "method": "doSomething", "params": [], "id": 1234}
输出格式
{ "jsonrpc": "2.0", "id": "1234", "result": null }
引入jar
jsonrpc:[ "com.imooc.jsonrpc4j:jsonrpc4j:1.5.1" ]
请求
//请求对象 public class ProductRpcReq implements ParamInf { private List<String> idList; private BigDecimal minRewardRate; private BigDecimal maxRewardRate; private List<String> statusList; } //服务端接口 @JsonRpcService("rpc/products") public interface ProductRpc { /** * 查询多个产品 * @param req * @return */ List<Product> query(ParamInf req); /** * 查询单个产品 * @param id * @return */ Product findOne(String id); } //----------------------------------------------------------------------// //服务端实现 @AutoJsonRpcServiceImpl @Service public class ProductRpcImpl implements ProductRpc { private static Logger LOG = LoggerFactory.getLogger(ProductRpcImpl.class); @Autowired private ProductService productService; @Override public List<Product> query(ParamInf req) { LOG.info("查询多个产品,请求:{}", req); Pageable pageable = new PageRequest(0,100,Sort.Direction.DESC,"rewardRate"); Page<Product> result = productService.query(req.getIdList(), req.getMinRewardRate(), req.getMaxRewardRate(), req.getStatusList(), pageable); LOG.info("查询多个产品,结果:{}", result); return result.getContent(); } @Override public Product findOne(String id) { LOG.info("查询产品详情,请求:{}", id); Product result = productService.findOne(id); LOG.info("查询产品详情,结果:{}", result); return result; } } //服务端RPC配置 @Configuration public class JSONRpcConfiguration { private static Logger LOG = LoggerFactory.getLogger(JSONRpcConfiguration.class); @Bean public AutoJsonRpcServiceImplExporter rpcServiceImplExporter(){ return new AutoJsonRpcServiceImplExporter(); } } //消费端---------------------------------------------------------------------// // 配置文件中配置服务端地址 rpc.client.url:http://localhost:8082/manager //配置远程RPC地址 @Configuration public class JSONRpcConfiguration { private static Logger LOG = LoggerFactory.getLogger(JSONRpcConfiguration.class); @Bean @ConditionalOnProperty(value = {"rpc.client.url","rpc.client.basePackage"}) public AutoJsonRpcClientProxyCreator rpcClientProxyCreator(@Value("${rpc.client.url}") String url,@Value("${rpc.client.basePackage}") String basePackage) { AutoJsonRpcClientProxyCreator creator = new AutoJsonRpcClientProxyCreator(); try { creator.setBaseUrl(new URL(url)); } catch (MalformedURLException e) { LOG.error("创建rpc服务地址错误", e); } creator.setScanPackage(basePackage); return creator; } } //调用 @RestController @RequestMapping("/product") public class ProductController { @Autowired private ProductRpc productRpc; @RequestMapping(value = "/{id}",method = RequestMethod.GET) public Product findOne(@PathVariable String id){ return productRpc.findOne(id); } }