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

这篇具有很好参考价值的文章主要介绍了【Redisson】Redisson--分布式远程服务(Remote Service)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Redisson系列文章:

  • 【Redisson】Redisson–基础入门
  • 【Redisson】Redisson–布隆(Bloom Filter)过滤器
  • 【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 {
 
    @Autowired
    private MailMapper mailMapper;
 
    @Override
    public 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);
 
    @Autowired
    private RedissonClient redisson;
 
    @Autowired
    private IMailService iMailService;
 
    @Override
    public 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 {
 
    @Autowired
    private 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】Redisson--分布式远程服务(Remote Service),# Redis,分布式,redis

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。文章来源地址https://www.toymoban.com/news/detail-535504.html

  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;
    }

到了这里,关于【Redisson】Redisson--分布式远程服务(Remote Service)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【业务功能100】补充代码【业务功能88】微服务-springcloud-分布式锁-redis-redisson-springcache

    采用redisson做分布式锁,完成数据的查询接口功能getCatelog2JSONRedis 原先从mysql数据库查询的效率较低,现在将部分固定数据展示比如页面的树形栏目信息等,存储到 redis缓存 ,然后基于分布式集群,需要结合本地锁(synchronized )与分布式锁(redissonClient.getLock(“catelog2JSON-lock”

    2024年02月09日
    浏览(46)
  • 【Redisson】Redisson--分布式中几种锁

    Redisson系列文章: 【Redisson】Redisson–基础入门 【Redisson】Redisson–布隆(Bloom Filter)过滤器 【Redisson】Redisson–分布式锁的使用(推荐使用) 【分布式锁】Redisson分布式锁底层原理 【Redisson】Redisson–限流器、 【Redisson】Redisson–分布式远程服务(Remote Service) 【Redisson】Redisson–

    2024年02月13日
    浏览(50)
  • Redisson分布式锁

    Redisson是一个在Redis的基础上实现的Java驻内存数据网格,可参考Redisson官方文档使用,它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。 简单来说,就是直接 RLock rlock = redissonClient.getLock(“lock”); 获取到锁,然后lock()和unlock()即可。 并发达到了660,比之

    2024年02月16日
    浏览(44)
  • Redisson—分布式对象

    每个Redisson对象实例都会有一个与之对应的Redis数据实例,可以通过调用getName方法来取得Redis数据实例的名称(key)。 所有与Redis key相关的操作都归纳在RKeys这个接口里: Redisson的分布式RBucketJava对象是一种通用对象桶可以用来存放任类型的对象。 除了同步接口外,还提供了异

    2024年02月07日
    浏览(47)
  • Redisson 分布式锁

    Redis是基础客户端库,可用于执行基本操作。 Redisson是基于Redis的Java客户端,提供高级功能如分布式锁、分布式集合和分布式对象。 Redisson提供更友好的API,支持异步和响应式编程,提供内置线程安全和失败重试机制。 实现步骤: 通过导入坐标和配置,注入RedissonClient对象之

    2024年02月11日
    浏览(56)
  • 运用分布式锁 redisson

    导入依赖 根据springboot版本不同自行选择版本 dependency groupIdorg.redisson/groupId artifactIdredisson-spring-boot-starter/artifactId version3.15.3/version /dependency 创建客户端

    2024年01月19日
    浏览(46)
  • SpringBoot+Redisson分布式锁

    org.redisson.config.Config类是Redisson框架中用于配置Redisson客户端的类。以下是一些常用的配置项: codec(编码) :默认值是org.redisson.codec.JsonJacksonCodec,用于定义与Redis交互时使用的编解码器。 useSingleServer :设置为true时,将使用单节点模式进行连接。 useMasterSlave :设置为true时,

    2024年01月19日
    浏览(47)
  • Redisson实现分布式锁示例

    可以下载redis desktop manager软件来查看redis里面存放的东西 红色框内的TTL值就是过期时间,默认-1,表示永不过期,指定过期时间后就变成你指定的值了。 上面的方法,我们让线程睡眠60S,代表我们的业务执行时间,在调用这个方法时,我们可以在 redis desktop manager软件上实时查

    2024年02月12日
    浏览(49)
  • Redisson分布式锁 原理&源码 分析

    获取锁的Lua脚本: 释放锁的Lua脚本: tryLock()底层代码分析 time :剩余的等待重试时间 ttl :现被持有的锁的剩余有效时间 计算尝试获取锁所消耗的时间,然后再计算出等待获取锁的剩余时间time, 如果time=0,则不再重试了直接返回获取锁失败, 如果time0,则通过subscribe去

    2024年02月11日
    浏览(65)
  • Redis实战——Redisson分布式锁

    目录 1 基于Redis中setnx方法的分布式锁的问题 2 Redisson         2.1 什么是Redisson         2.2 Redisson实现分布式锁快速入门         2.3 Redisson 可重入锁原理                 什么是可重入锁?                 Redisson中又是如何实现的呢?         2

    2024年02月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包