JsonRPC

372 篇文章 4 订阅
345 篇文章 27 订阅

概述

  • 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免费
领取,关注我持续更新哦! ! 

使用demo

  • 引入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
}

使用demo

  • 引入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);
    }
}

原文链接:https://zhuanlan.zhihu.com/p/186139338 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值