前言

说到redis,可能大家的脑海中蹦出的关键词是:NoSQL、KV、高性能、缓存等。但今天的文章从另一个角度——微服务来展开。

这篇文章的起因也是源自一次面试经历,在面试一位来自陌陌的候选人(就是那个交友的陌陌)时,他提到一点让我觉得很有意思,他说redis在陌陌被使用的非常广泛,除了常规的缓存外,某些场景下也当NoSQL数据库来使用,还用redis作为微服务的注册中心,甚至连RPC的调用协议都用了redis协议。

注册中心

最早了解到redis可以作为注册中心是从dubbo的源码中看到,但一直也没有过多的了解,因为从没听说哪家公司使用redis来做服务发现。

在dubbo中使用redis来做服务发现还是挺简单的,引入jedis依赖,将注册中心地址改为redis地址即可:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version>
</dependency>
dubbo.registry.address=redis://127.0.0.1:6379

注册上来的数据是这样,类型是hash

/dubbo/${service}/${category}

/dubbo/com.newboo.sample.api.DemoService/consumers
/dubbo/com.newboo.sample.api.DemoService/providers

hash数据结构下保存的key是注册上来的url,value是过期时间

127.0.0.1:6379> hgetall /dubbo/com.newboo.sample.api.DemoService/providers
1) "dubbo://172.23.233.142:20881/com.newboo.sample.api.DemoService?anyhost=true&application=boot-samples-dubbo&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.newboo.sample.api.DemoService&metadata-type=remote&methods=sayHello&pid=19807&release=2.7.8&side=provider&timestamp=1621857955355"
2) "1621858734778"

从理论上来说,注册中心只要符合数据存储、监听推送变更、心跳检测这几个基本的功能即可。

以dubbo为例看下redis是如何利用自身特性来完成注册中心的功能( 以dubbo 2.7.8版本为例):

  • 服务注册

    • provider在服务注册时,将服务提供方的url写入/dubbo/${service}/providers下,数据类型为hash,key为提供方url,value为key的过期时间,默认为60s,可配置

    • 写入完成后以/dubbo/${service}/providers为key调用publish命令发布一个register事件

    • provider在初始化时起一个单独的线程每隔1/2过期时间(默认30s)时对provider进行重新重新注册并发布register事件

  • 服务发现

    • 获取匹配/dubbo/${service}/*的key(此处用到了keys命令),拿到的有这几种:/dubbo/${service}/providers/dubbo/${service}/routers/dubbo/${service}/configuators

    • /dubbo/${service}/*拿到的key进行hgetall,拿到真实的provider列表以及配置等数据,进行组装、匹配

    • 同时对每个subscribe的服务单独开一个线程,对/dubbo/${service}执行psubscribe命令阻塞等待有事件发生

从源码和测试来看,dubbo的redis注册中心不能直接用于生产环境,原因有如下两点:

  • 使用了keys命令,会阻塞单线程的redis,keys执行期间,其他命令都得排队

  • 没有心跳检测这个功能,我测试了provider被kill -9杀死后,consumer是无法感知的。但从实现上来看是想通过存储的过期时间来判断服务是否可用,即需要对比url对应的value与当前的时间,如果过期应被剔除,但这部分貌似没有实现完整

虽然dubbo的redis注册中心生产不可用,但这并不影响他可以构建一个生产可用的注册中心,陌陌就是个很好的例子。

RPC调用协议

redis协议作为RPC调用协议也是陌陌同学告诉我的,当时我问了他两个问题:

  • 为什么选择redis协议作为RPC调用协议

  • redis协议如何透传类似header的隐式参数

第一个问题的答案也比较出乎意料,他说是为了跨语言调用,当时觉得只有http、gRPC等协议做到了跨语言,redis协议跨语言也是第一次听说。但仔细一想,确实没毛病,现在哪个后端语言没有实现redis的客户端呢?

之所以redis协议能够做到跨语言,这也全仰仗它的设计非常简洁,易于实现,详细协议内容可以参考这个链接:

http://redisdoc.com/topic/protocol.html

我就举一个例子来证明redis协议简洁到了什么程度,这是我很久之前就关注的一个项目

https://github.com/jdp/redisent

它是一个php实现的redis客户端,只有一个php文件,共196行,这196行包含了注释,变量定义,链接建立等,真正解析协议的代码非常少,请求的编码和发送只用了17行代码,解析返回的代码只有58行!正如项目的介绍那样:simple, no-nonsense

第二个问题回答的和我的预期一致,从redis协议的层面暂时无法支持类似header的隐式参数,但陌陌的RPC框架是自研的,所以他们在框架层解决了这个问题,序列化他们选择了json,如果要透传header参数,框架将参数组装到传输体中去。

遗憾的是dubbo中的redis协议实现并不完整,无法暴露redis协议,只能调用,所以测试也只能测试client连接到redis服务器进行get、set调用,意义不大。

总结

redis目前是个用途非常广泛的存储组件,虽然在微服务领域它不是主流,但这也给我们提供了一种思路,至少这条路是可以走通的。

redis在微服务领域的贡献相关推荐

  1. 一个困扰程序员很多年的问题:微服务领域SpringCloud这么火,为何还要学习SpringCloud Alibaba?

    大家好,我是冰河~~ 大家都知道,SpringCloud Alibaba是在SpringCloud基础上开发并开源的一套微服务架构体系.那么,肯定会有小伙伴要问:在微服务领域,SpringCloud已 ...

  2. 2020 年微服务领域开源数字化报告发布,阿里扛起微服务大旗

    2020 年 8 月 18 日,由阿里云主办的首届云原生微服务大会于线上隆重召开,大会邀请25位全球顶级球微服务领域先行者和权威技术专家深入探讨云原生语境下,微服务的挑战和趋势. 国产微服务框架表现抢 ...

  3. 微服务领域是不是要变天了?Spring Cloud Alibaba正式入驻Spring Cloud官方孵化器!

    引言 微服务这个词的热度自它出现以后,就一直是高烧不退,而微服务之所以这么火,其实和近几年互联网的创业氛围是分不开的. 与传统行业不同,互联网企业有一个特点,那就是市场扩张速度非常之快,可能也就是几天 ...

  4. python的flask微服务-一次flask+redis的微服务实战

    编辑推荐: 本文来自于jianshu,主要简单介绍了一个flask的app部署的环境搭建,以及各种配置的坑等相关知识. 0x00 背景 先说一下需求的场景,策划部门想做一个垂直领域的社区产品,类似与知 ...

  5. javaee 中文帮助文档_从中游公司跳槽阿里必知:K8s、Nginx、Redis、微服务面试文档...

    前言 随着时代的进步和发展,无论哪份工作都不能因循守旧,不去创新或者去吸收新的知识,尤其是Java开发的工作者,在十几年之前,很多人都已经掌握了Java的很多知识,但是如今如果只会SSM的小伙伴,已经 ...

  6. 安装redis提示[test] error 2_技术干货分享:一次flask+redis的微服务实战

    先说一下需求的场景,策划部门想做一个垂直领域的社区产品,类似与知乎那种,但受益人群是金融行业的从业人员.产品中有一个搜索问题的需求,搜索的问题去题库中进行模糊匹配,终端支持H5/APP/小程序,甚至是 ...

  7. 微服务领域,为什么选SpringCloud而不是Dubbo?

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本篇主要解答这两个问题:Spring Clou ...

  8. 最强阿里面试126题:数据结构+并发编程+Redis+设计模式+微服务

    BAT技术面试范围 数据结构与算法:最常见的各种排序,最好能手写 Java高级:JVM内存结构.垃圾回收器.回收算法.GC.并发编程相关(多线程.线程池等).NIO/BIO.各种集合类的比较优劣势(底 ...

  9. Spring Session, Redis 实现微服务 Session 共享

    在微服务中,实现各个微服务模块之间的Session共享,可以通过 Spring Session 和 Redis 技术实现. 本实例直接在之前的两个微服务中添加同样的配置,然后测试两个接口查看 Sess ...

最新文章

  1. iPhone开发四剑客之《Objective-C基础教程》
  2. C#之Action和Func的用法(转自 https://www.cnblogs.com/LipeiNet/p/4694225.html)
  3. 高分求FP-tree算法用Delphi实现
  4. EasyUI表单验证,自定义插件验证,自定义js插件验证,远程验证,常见手机号,中英文,qq等验证规则验证...
  5. laravel5.0升级到5.1
  6. SQL结构化查询语言中的LIKE语句
  7. acme.sh签发Let‘s Encrypt证书
  8. Yahoo,希望你和微软Bing能过的幸福
  9. 写论文的用到的常用技巧
  10. php 图形用户界面GUI 开发
  11. Google 中国开发者大会最后一天报名!
  12. 第三章 文本与列表控制
  13. bayer raw RGB raw
  14. (33)STM32——485实验笔记
  15. java xps生成_Java PDF/XPS转为Word/html /SVG、PDF和XPS互转
  16. 台式计算机 按键盘字母键 没反应6,电脑键盘数字键失灵-键盘字母上面数字键有的失灵不能用怎么?键盘字母上面数字键有的失灵 爱问知识人...
  17. Chrome快捷键大全:Chrome窗口和标签页快捷键、功能快捷键、网页快捷键
  18. 在ARM板上运行Qt程序
  19. MongoDB系列六(聚合).
  20. 大白菜U盘安装win10操作系统

热门文章

  1. docker部署springboot_Docker+SpringBoot快速构建和部署应用
  2. JSP 日期处理概述
  3. html 布局兼容性,HTML+CSS入门 浏览器兼容性问题及解决方案
  4. 【Java】找到链表中倒数第k个结点
  5. 关于学习Python的一点学习总结(46->属性访问)
  6. NC14414 小AA的数列
  7. Balkan2007]Toponyms[链式前向星建字典树+getchar()读入优化]
  8. html页面sql注入,再谈SQL注入入侵动网SQL版-ASP TO HTML WITH TEMPLATE3
  9. java和jvm_Java、JVM和操作系统之间的关系,写给新人,
  10. 【学习笔记】高斯整数、高斯素数、费马平方和(全部相关概念及例题详解)《初等数论及其应用》