【Redisson】Redisson--分布式远程服务(Remote Service)

Redisson系列文章:

  • 【Redisson】Redisson–基础入门
  • 【Redisson】Redisson–布隆(Bloom Filter)过滤器
  • 【Redisson】Redisson–分布式锁的使用(推荐使用)
  • 【分布式锁】Redisson分布式锁底层原理
  • 【Redisson】Redisson–限流器

文章目录

  • 一、Redisson使用远程服务
  • 二、服务端(生产端)实战
  • 三、客户端(消费端)实战
  • 四、响应模式附录

一、Redisson使用远程服务

当前有两台服务器连接的是同一个Redisson中间件,这两台服务器叫它们A节点与B节点吧。A节点可以发布一些API接口,也实现了它们,并向Redisson服务中心注册。B节点向Redisson注册中心订阅这些API接口,因此它可以向Redisson服务器发送这些请求,这些请求最终会被注册中心转发到A节点。这样,B节点就能够通过Redisson注册中心与A节点通信,从而实现远程服务调用功能。

分布式远程服务(Remote Service)提供了两种类型的RRemoteService实例:

服务端(远端)实例 - 用来执行远程方法(工作者实例即worker instance). 例如

RRemoteService remoteService = redisson.getRemoteService();
SomeServiceImpl someServiceImpl = new SomeServiceImpl();// 在调用远程方法以前,应该首先注册远程服务
// 只注册了一个服务端工作者实例,只能同时执行一个并发调用
remoteService.register(SomeServiceInterface.class, someServiceImpl);// 注册了12个服务端工作者实例,可以同时执行12个并发调用
remoteService.register(SomeServiceInterface.class, someServiceImpl, 12);

客户端(本地)实例 - 用来请求远程方法. 例如:

RRemoteService remoteService = redisson.getRemoteService();
SomeServiceInterface service = remoteService.get(SomeServiceInterface.class);String result = service.doSomeStuff(1L, "secondParam", new AnyParam());

二、服务端(生产端)实战

  1. 首先服务器端会定义一个接口IMailService,并实现它IMailServiceImpl。这里注意的是,IMailService与MailDto都是在API模块里面的,方便打包并发布。MailDto需要实现序列化接口,因为需要存放在Redis中并
public interface IMailService {MailDto queryMail(Long id);
}@Service
public class IMailServiceImpl implements IMailService {@Autowiredprivate MailMapper mailMapper;@Overridepublic MailDto queryMail(Long id) {Mail mail = mailMapper.selectByPrimaryKey(id);MailDto dto = new MailDto();if (mail != null) {BeanUtils.copyProperties(mail, dto);}return dto;}
}
  1. 向Redisson注册中心发布API。CommandLineRunner接口的功能是在SpringBoot项目启动的时候执行相关的功能。
@Component
public class RemoteServiceInit implements CommandLineRunner {private static final Logger LOGGER = LoggerFactory.getLogger(RemoteServiceInit.class);@Autowiredprivate RedissonClient redisson;@Autowiredprivate IMailService iMailService;@Overridepublic void run(String... strings) throws Exception {LOGGER.info("初始化Redisson远程调度");RRemoteService remoteService = redisson.getRemoteService();//初始化5个并发实例remoteService.register(IMailService.class, iMailService, 5);}
}

三、客户端(消费端)实战

生产端的IMailService与MailDto最好定义在API模块,方便打包发布。打包成jar以后,导入到消费端项目B中。消费端项目B需要与生产端连接相同的Redisson服务器。

@Service
public class RemoteMailService {@Autowiredprivate RedissonClient redisson;public MailDto queryMail(Long id) {//获取Redisson远程服务RRemoteService remoteService = redisson.getRemoteService();//应答回执超时1秒钟,远程执行超时30秒钟RemoteInvocationOptions options = RemoteInvocationOptions.defaults();//拿到生产端的接口IMailService iMailService = remoteService.get(IMailService.class,options);//调用return iMailService.queryMail(id);}
}

在这里插入图片描述

Redisson远程服务

四、响应模式附录

涉及到网络传输,所以可能有传输失败的情况。更多的应答模式如下。

noResult()是指远程调用的方法,不需要有返回值。noAck()表示消费端不需要要服务端响应。

// 应答回执超时1秒钟,远程执行超时30秒钟
RemoteInvocationOptions options = RemoteInvocationOptions.defaults();// 无需应答回执,远程执行超时30秒钟
RemoteInvocationOptions options = RemoteInvocationOptions.defaults().noAck();// 应答回执超时1秒钟,不等待执行结果
RemoteInvocationOptions options = RemoteInvocationOptions.defaults().noResult();// 应答回执超时1分钟,不等待执行结果
RemoteInvocationOptions options = RemoteInvocationOptions.defaults().expectAckWithin(1, TimeUnit.MINUTES).noResult();// 发送即不管(Fire-and-Forget)模式,无需应答回执,不等待结果
RemoteInvocationOptions options = RemoteInvocationOptions.defaults().noAck().noResult();RRemoteService remoteService = redisson.getRemoteService();
YourService service = remoteService.get(YourService.class, options);

下面的这段代码是我自己实测的。

expectResultWithin(15,TimeUnit.SECONDS)表示,如果生产端服务器能够接通的话,在15秒之内需要返回数据,否则报异常No response after 15000ms for request。

expectAckWithin(10,TimeUnit.SECONDS)表示,生产端服务器需要在10秒内有响应,否则报异常No ACK response after 10000ms for request。

  public MailDto queryMail(Long id) {RRemoteService remoteService = redisson.getRemoteService();//应答回执超过5秒钟,不等待执行结果RemoteInvocationOptions options = RemoteInvocationOptions.defaults().expectResultWithin(15, TimeUnit.SECONDS).expectAckWithin(10,TimeUnit.SECONDS);Long start = System.currentTimeMillis();IMailService iMailService = remoteService.get(IMailService.class,options);MailDto result = null;try {result =  iMailService.queryMail(id);}catch (Exception e){System.out.println(e.getMessage());}Long end = System.currentTimeMillis();System.out.println(end - start);return result;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/13348.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测+车道线识别+追踪+测距(代码+部署运行)

目标检测车道线识别追踪测距 本文主要讲述项目集成:从车道线识别、测距、到追踪,集各种流行模型于一体! 不讲原理,直接上干货! 把下文环境配置学会,受益终生! 各大项目皆适用! …

java项目之高校二手交易平台(ssm+jsp+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的高校二手交易平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌&…

Linux VS Windows 孰优孰劣?

目录 1. 开源 vs. 闭源:2. 用户界面:3. 软件兼容性:4. 系统安全性:5. 社区支持和文档资源: Linux和Windows是两个主要的操作系统,它们在很多方面都有不同的特点和使用体验。以下是对Linux和Windows进行比较…

微信开发者工具模拟器中不显示鼠标问题

前言 在使用微信开发者工具开发微信小程序时,使用到了第二屏幕,在第一屏幕上,微信开发者工具模拟器中,可以正常显示鼠标,而在第二屏幕上不显示鼠标。 解决方案: 方案1:设置指针轨迹&#xff…

scratch 鼠标控制角色移动

scratch 鼠标控制角色 本程序使用鼠标操作“机器人”角色跟随鼠标,距离较小时暂停移动;“小狗”角色连续在随机位置生成、水平移动、碰到边缘反弹、碰到“机器人”角色时删除。 目前scratch程序的制作已经告一段落了,进一步开发需要更多规划…

Python学习笔记(十五)————文件操作相关

目录 1)文件编码 2) 文件的读取 ①open()打开函数 ② mode常用的三种基础访问模式 ③读操作相关方法 read()方法: readlines()方法: readline()方法:一次读取一行内容 for循环读取文件行 close() 关闭文件对象 wi…

MySQL单表查询练习题

目录 第一题 第二题 第三题 第一题 1.创建数据表pet,并对表进行插入、更新与删除操作,pet表结构如表8.3所示。 (1)首先创建数据表pet,使用不同的方法将表8.4中的记录插入到pet表中。 mysql> create table pet( name varchar(…

如何在Microsoft Excel中快速创建等比序列

Excel 中的填充句柄允许你通过拖动句柄自动填充行或列中的数据列表(数字或文本)。这可以在大型工作表中输入顺序数据时节省大量时间,并提高工作效率。 如果数据遵循某个模式或基于其他单元格中的数据,则可以使用“自动填充”功能…

尚无忧多城市共享自助台球室台球厅预约开灯开门小程序源码

1、定位功能:可定位附近是否有店 2、能通过关键字搜索现有的店铺 3、个性轮播图展示,系统公告消息提醒 4、个性化功能展示,智能排序,距离、价格排序 5、现有店铺清单展示,订房可查看房间单价,根据日期、…

【Leetcode】203. 移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 # Definition for singly-linked list. # class ListNode(object): # def __init__(self, val0, nextNone): # self.val va…

能够ping通服务器的同时端口不通的排查方法

概述 当您在客户端访问目标服务器时,如果能ping通,但业务端口无法访问,您可以参见以下方法进行排查。 步骤一:实例安全组检查 1、登录ECS管理控制台,单击实例。 2、在顶部菜单栏左上角处,选择地域。 3、…

2023精选接口测试面试题(建议收藏)

前言 接口测试是现在软件测试面试中的重点,基本上每家公司面试都会问到,学姐整理一下接口测试相关的面试题,顺便给出一些参考答案。 01 Q1:一个接口用例中有多个API接口,前后两个 API 之间如何进行参数传递的&#x…