springboot整合rpc远程调用_SpringBoot—-JsonRpc跨语言远程调用协议 - Java天堂
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
springboot整合rpc远程调用_SpringBoot—-JsonRpc跨语言远程调用协议 - Java天堂相关推荐
- 【linux系统编程】远程登录工具ssh | 跨主机远程拷贝scp
远程登录工具ssh && 跨主机远程拷贝scp 正文开始@Assassin 目录: 远程登录工具ssh && 跨主机远程拷贝scp 1. ssh简介: 2. ssh基本 ...
- Atitit.跨语言异常转换机制 java c# php到js的异常转换
Atitit.跨语言异常转换机制 java c# php到js的异常转换 1. bizEx 直接抓取,然后js catchEX1 2. Chkec runtimeEx1 3. Other异常..J ...
- SpringBoot整合RPC框架---Thrift
文章目录 什么是Thrift 架构 支持的通讯协议 支持的传输协议 支持的服务模型 Thrift的优点 SpringBoot整合Thrift 为什么会出现RPC框架 常见的RPC框架集成套路 开撸 官 ...
- python函数文档说明调用方式_Python 跨.py文件调用自定义函数说明
0 前言 os.chdir() :用于改变当前python工作的目录到指定的路径 sys.path:是python搜索模块的一个路径集,为list,自定义的包可以把存放路径加进去,之后直接调用包名就行 ...
- springboot整合rpc远程调用_SpringCloud—RPC远程调用
Eureka介绍 Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,Spring Cloud Eureka提供服务端与客户端,服务端即是E ...
- java socket 远程调用_SpringBoot使用Netty实现远程调用的示例
前言 众所周知我们在进行网络连接的时候,建立套接字连接是一个非常消耗性能的事情,特别是在分布式的情况下,用线程池去保持多个客户端连接,是一种非常消耗线程的行为.那么我们该通过什么技术去解决上述的问题呢 ...
- JWT,springboot整合JWT完成token的验证,token的使用,java架构师技术栈
/** @author dugt1998@163.com @date 2020/11/8 12:40 */ public class JWTUtils { //签名 自己项目中的签名 private ...
- springboot整合spring Cache(redis)
前言 前面有介绍过spring整合redis和redis的一些注意点,在实际开发中,spring cache方便简化的缓存操作的大部分内容.通过注解的方式实现缓存. 阅读前推荐先阅读:redis缓存介 ...
- 跨语言RPC框架Thrift详解
一. 概念 Apache的Thrift软件框架,是用来进行可伸缩的.跨语言的服务开发,它通过一个代码生成引擎来构建高效.无缝的服务,这些服务能够实现跨语言调度,目前支持的语言有: C++, Java, ...
- redis命令,SpringBoot整合Redis6,主从复制,哨兵模式,集群,springCache初高级应用。
目录 1. Docker安装Redis 2. Redis的基础 2.1 redis的key命令 2.2 reids的数据结构(6.0新增的数据结构) 1. String(字符串)类型 2. List( ...
最新文章
- UVA11624 Fire!(bfs)
- 序列化的 serialVersionUID 到底有什么用?
- 【AI-1000问】训练为什么要分测试集和验证集?
- C# 数据类型映射 (SQLite,MySQL,MSSQL,Oracle)
- 微信“拍一拍”,竟然可以使用Python实现,你get到了吗?
- Android 系统性能优化(28)---Android 性能优化工具集合
- java log4j 异步_Log4j2异步日志之异步格式化
- r生成html文件,从R中的许多html文件创建一个语料库
- Deepin-文件目录介绍
- 用python逆序输出字符串中的所有元素_Python中逆序输出字符串的六种方法
- 多开分身苹果版_【教程】苹果手机居然可以微信分身?全套教程,进来领取
- 苹果x和xsmax有什么区别_苹果手机OLED屏幕与LCD屏幕有什么区别
- pdf转换器免费版下载
- Ubuntu 16.04/18.04/20.04/deepin v20安装insight的方法
- c语言的中打印出鸟图形,教你画出一只萌萌哒小鸟【PS教程】
- Android SD卡及U盘插拔状态监听和内容读取
- Spring Security入门到实践(一)HTTP Basic在Spring Security中的应用原理浅析
- ZTree的全选 反选 全不选 取消 清空
- 教你用Qt手写优酷客户端界面
- 飞算全自动软件工程平台:让天下没有难做的软件工程
热门文章
- webpack配置报错WARNING in DefinePlugin Conflicting values for ‘process.env.NODE_ENV‘
- uniapp实例笔记
- android studio 工程rebuild没反应,Andriod Studio Clear Project或Rebuild Project出错
- oracle表增加序列字段,Oracle创建表和创建序列和修改,增加sql字段
- 计算机0表示负数,计算机原码反码补码_0
- MySQL(20)-----数据库设计的常规步骤
- Git(8):在GitHub上,如何使fork到的项目与原仓库的更新保持同步?
- [例程]string.trim().length()的用法
- C Programming Style 总结
- Eclipse maven构建springmvc项目