springboot整合rpc远程调用_SpringBoot—-JsonRpc跨语言远程调用协议 - Java天堂

本文介绍了如何使用SpringBoot结合JsonRpc进行跨语言远程调用。通过创建rpc接口,实现服务端和客户端,展示了JsonRpc在SpringBoot中的应用。详细步骤包括接口定义、服务实现、配置及客户端调用。
摘要由CSDN通过智能技术生成

1、JsonRpc概念

JSON-RPC是一种基于JSON的跨语言远程调用协议。有文本传输数据小,便于调试扩展的特点。

2、实现例子

a)项目1-api 编写rpc接口

ProductRpc.java

package com.imooc.api;

import java.util.List;

import com.googlecode.jsonrpc4j.JsonRpcService;

import com.imooc.api.domain.ProductRpcReq;

import com.imooc.entity.Product;

/**

* 产品相关的rpc服务

* @author zemel

*

*/

@JsonRpcService("rpc/products")

public interface ProductRpc {

/**

* 查询多个产品

* @param req

* @return

*/

List query(ProductRpcReq req);

/**

* 查询单个产品

* @param id

* @return

*/

Product findOne(String id);

}

package com.imooc.api.domain;

import java.math.BigDecimal;

import java.util.List;

/**

* 产品相关rpc请求对象

* @author zemel

*

*/

public class ProductRpcReq {

private List idList;

private BigDecimal minRewardRate;

private BigDecimal maxRewardRate;

private List statusList;

public List getIdList() {

return idList;

}

public void setIdList(List idList) {

this.idList = idList;

}

public BigDecimal getMinRewardRate() {

return minRewardRate;

}

public void setMinRewardRate(BigDecimal minRewardRate) {

this.minRewardRate = minRewardRate;

}

public BigDecimal getMaxRewardRate() {

return maxRewardRate;

}

public void setMaxRewardRate(BigDecimal maxRewardRate) {

this.maxRewardRate = maxRewardRate;

}

public List getStatusList() {

return statusList;

}

public void setStatusList(List statusList) {

this.statusList = statusList;

}

@Override

public String toString() {

return "ProductRpcReq [idList=" + idList + ", minRewardRate=" + minRewardRate + ", maxRewardRate="

+ maxRewardRate + ", statusList=" + statusList + "]";

}

}

b)项目2-manager(rpc实现工程)

ProductRpcImpl.java

package com.imooc.rpc;

import java.util.List;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.domain.Page;

import org.springframework.data.domain.PageRequest;

import org.springframework.data.domain.Pageable;

import org.springframework.data.domain.Sort;

import org.springframework.stereotype.Service;

import com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImpl;

import com.imooc.api.ProductRpc;

import com.imooc.api.domain.ProductRpcReq;

import com.imooc.entity.Product;

import com.imooc.service.ProductService;

/**

* rpc服务实现类

* @author zemel

*

*/

@AutoJsonRpcServiceImpl

@Service

public class ProductRpcImpl implements ProductRpc{

private static Logger log = LoggerFactory.getLogger(ProductRpcImpl.class);

@Autowired

private ProductService productService;

@Override

public List query(ProductRpcReq req) {

log.info("查询多个产品,请求:{}", req);

Pageable pageable = new PageRequest(0, 1, Sort.Direction.DESC, "rewardRate");

Page page = productService.query(req.getIdList(), req.getMinRewardRate(),

req.getMaxRewardRate(), req.getStatusList(), pageable);

log.info("查询多个产品,结果:{}", page);

return page.getContent();

}

@Override

public Product findOne(String id) {

log.info("查询产品详情,请求:{}", id);

Product result = productService.findOne(id);

log.info("查询产品详情,结果:{}", result);

return result;

}

}

RpcConfig.java

package com.imooc.config;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter;

/**

* rpc相关配置

* @author zemel

*

*/

@Configuration

public class RpcConfig {

@Bean

public AutoJsonRpcServiceImplExporter rpcServiceImplExporter(){

return new AutoJsonRpcServiceImplExporter();

}

}

#服务器

server.port=80

server.servlet.contextPath=/manager

# DataSource

spring.datasource.url=jdbc:mysql://localhost/manager?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC

spring.datasource.username=root

spring.datasource.password=

#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

#jackson自定义日期格式

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

spring.jackson.time-zone=GMT+8

# JPA

spring.jpa.show-sql=true

spring.jpa.hibernate.ddl-auto=update

# 配置swagger

swagger.groupName=manager

swagger.basePackage=com.imooc.controller

c)rpc客户端-saller

ProductRpcService.java

package com.imooc.seller.service;

import java.util.ArrayList;

import java.util.List;

import javax.annotation.PostConstruct;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.domain.Page;

import org.springframework.data.domain.PageRequest;

import org.springframework.data.domain.Pageable;

import org.springframework.data.domain.Sort;

import org.springframework.stereotype.Service;

import com.imooc.api.ProductRpc;

import com.imooc.api.domain.ProductRpcReq;

import com.imooc.entity.Product;

import com.imooc.entity.enums.ProductStatus;

/**

* 产品服务

* @author zemel

*

*/

@Service

public class ProductRpcService {

private static Logger log = LoggerFactory.getLogger(ProductRpcService.class);

@Autowired

private ProductRpc productRpc;

/**

* 查询全部产品

* @return

*/

public List findAll(){

ProductRpcReq req = new ProductRpcReq();

List status = new ArrayList<>();

//status.add(ProductStatus.IN_SELL.getCode());

//req.setStatusList(status);

log.info("rpc查询全部产品,请求:{}", req);

List result = productRpc.query(req);

log.info("rpc查询全部产品,结果:{}", result);

return result;

}

@PostConstruct

public void testFindAll(){

findAll();

}

}

RpcConfig.java

package com.imooc.seller.config;

import java.net.MalformedURLException;

import java.net.URL;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import com.googlecode.jsonrpc4j.spring.AutoJsonRpcClientProxyCreator;

import com.imooc.api.ProductRpc;

/**

* rpc 相关配置

* @author zemel

*

*/

@Configuration

@ComponentScan(basePackageClasses={ProductRpc.class})

public class RpcConfig {

private static Logger log = LoggerFactory.getLogger(RpcConfig.class);

@Bean

public AutoJsonRpcClientProxyCreator rpcClientProxyCreator(@Value("${rpc.manager.url}") String url){

AutoJsonRpcClientProxyCreator creator = new AutoJsonRpcClientProxyCreator();

try {

creator.setBaseUrl(new URL(url));

} catch (MalformedURLException e) {

log.error("创建rpc服务地址错误", e);

e.printStackTrace();

}

creator.setScanPackage(ProductRpc.class.getPackage().getName());//扫描rpc所在包

return creator;

}

}

application.properties

server.servlet.contextPath=/seller

server.port=8082

rpc.manager.url=http://localhost:80/manager/

# DataSource

spring.datasource.url=jdbc:mysql://localhost/manager?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC

spring.datasource.username=root

spring.datasource.password=

#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值