阿里雷卷:RSocket从入门到落地,RSocket让AJP换发青春

简介: 借助 RSocket 的架构提供,我们可以将之前比较复杂的方案简化,当然最最重要的是性能的提升,即便之前的一些性能提升技术点,可能由于一些约束等,现在和 RSocket 对接,那些问题都不存在啦!这篇文章只是一个架构启发,不会浪费你时间让你学习 20 年前的技术和知识。

image.png
考虑很久,决定还是写一下这篇文章,主要是 AJP 技术太老,我只能说 Long long ago ,估计我在用这个技术的时候,很多同学小学还没有毕业。但是没有问题,这篇文章只是一个架构启发,不会浪费你时间让你学习 20 年前的技术和知识。

Apache JServ Protocol

Apache JServ 协议,简称 AJP ,是一种二进制协议,可以将来自 Web 服务器的入站请求代理到位于 Web 服务器后面的应用程序服务器,部署结构如下:
image.png
通常我们不希望直接将应用服务暴露到互联网上,有安全问题,当然还涉及到 DNS,IP等问题,我们会做一个互联网请求入口的 Gateway,也就是一个Web服务负责入站请求,然后再转发给内部的Web应用服务器,这样架构就灵活很多。

为何要使用 AJP 这个二进制协议?我们知道 HTTP 1.1 是文本协议,所以解析协议的工作量还是有的,如果 Gateway 的 Web 服务器已经将 HTTP 协议解析啦,为何不复用解析后的结果,形成一个更高效的二进制结构,然后传送给后端的 Web 服务器,这样后端 Web 服务器就会省去解析 HTTP 文本协议这个动作,节约了计算,速度也快啦;

此外 AJP 是长连接,和 HTTP 1.1 的短连接也不一样,可以避免反复的 HTTP 短连接创建,也提高了网络的传输效率,这些就是 AJP 的作用。如果 Gateway 直接是反向代理到后端服务器,还是走普通 HTTP 请求,就会涉及大量短连接、 HTTP 协议重新解析的问题。

当然在实际的开发中,进行 AJP 配置非常少的,大家还是采取的标准的 HTTP 协议的反向代理方式,其中一个主要的原因,就是 AJP 还是有些复杂。首先 gateway 上要配置 AJP ,同时应用还需要提供 AJP 接入能力,如果使用 Tomcat 还好,现在基本都是基于 Netty 的嵌入式 Web Server ,几乎没有人考虑 AJP 这件事情啦。当然我个人也是这样的,早期大家都是 Apache + mod_jk + tomcat 部署的,现在也都是 HTTP 协议的。

负载均衡之动态主机问题

假设我们有了下图的部署结构, Gateway 负责入站请求,然后由 Nginx 进行转发,可以选择 HTTP 1.1 或者 AJP ,都还好。
image.png
上图的这个结构,大家会发现要解决一个问题,就是维护后端服务列表的问题,也就是 Nginx 中所说 Upstreams 主机动态维护的问题,看一个典型的 Nginx 配置,如下:
image.png
如果 appservers 背后的应用有上线下线的问题,那该怎么办?也好办,就是通知 Nginx ,动态更新 upstream 对应的主机列表,这样就是可以啦。这个特性,你需要购买 Nginx Plus,当然也有一些 Nginx 开源的方案,都会提供对应的 upstream 主机动态更新的特性。

当然如果你的服务架构中有服务注册中心,如采用 Spring Cloud Gateway 架构,如果有了 Eureka 等服务注册中心,那么就不用担心这些 upstream 主机动态维护的问题,服务注册中心就会解决这个问题,如下图:
image.png

RSocket 和 AJP 整合

我们都知道 RSocket 采取是的外连方式,就是我不提供端口监听,我会连接到一个 Broker ,然后 Broker 来帮助我处理入站请求。借助 RSocket 这一模式,我们将 Gateway 的模式调整为如下:
image.png
首先我们通过 Webflux 对外提供 HTTP 访问需求,这个是异步化的。当然 Webflux 会默认解析 HTTP 头, Body 设置为不解析,还是 Netty 的 ByteBuf 。接下来我们将 HTTP 请求转为换为 AJP 的数据结构,其实就是上面讲到那个高效的二进制结构,大概的结构如下:
image.png
接下来 Gateway 会将 AJP 的二进制结构体添加到为 RSocket Payload 的 header 中,将 HTTP Body 设置为 Payload 的 data ,然后根据虚拟主机名或服务名从连接到 Gateway 的 RSocket 连接中找到对应的 TCP 连接,然后将这个 RSocket Payload 发送给后端 Web 服务器。

后端 web 服务器在收到 RSocket 请求后,然后读取出 AJP 数据,构建出内部的 HTTPRequest 对象,然后转发给对应的 HTTPHandler 完成 HTTP 请求处理,最后将返回的 HTTPResponse 对象再进行 AJP 处理,构建出 Payload ,返回给 Gateway ,然后 Gateway 再解析 AJP ,输出 HTTP Response ,当然这个也是标准的 AJP 流程。

这里我们进行了一些调整,传统的是给 Web 应用配置 AJP 监听端口,相当于 AJP Server ,接受 AJP 请求,现在调整为 RSocket ,没有监听端口,而是直接连接到 Gateway 。

RSocket AJP 这种架构有什么好处?

无监听端口:RSocket 采用的是外连的方式,本地并没有启动 HTTP 端口和 AJP Server端口,这样比较安全,同时也节省了系统的资源。

负载均衡简单:由于后端 web 服务器都主动连接到 Gateway 上啦,而且提供了对应的元信息,如对应的域名等, Gateway内部就建立好路由表啦,不需要服务注册中心等接入,当然也不需要你手动维护,都只自动化的,只要控制应用上下线就可以。

AJP 序列化方式非常高效,这个前面说过,对比 HTTP 解析,这个性能不用说啦。

部分 Zero Copy 支持:如 HTTP Body 这部分,基于 Netty 的 ByteBuf,这个是完全没有问题的,不需要反复的内存 copy ,而且 RSocket 是直接支持 Netty 的 ByteBuf 构建 Payload 的。

长连接支持:RSocket 是长连接的,这个和 AJP 是一致的,不用在担心 HTTP 短连接搞出的 TIME WAIT 问题啦,而不用搞什么 TIME WAIT 优化等,默认就可以啦。你不相信 TIME WAIT 问题?你在 ATA 上搜索一下试试,都有 1274 篇文章,不我不知道有多少同学碰到过,反正我不止一次啦。

非常好的灵活性:gateway 已经进行了 http 解析,我们经常说的 session sticky ,也就是根据 cookie 绑定到某一台 backend server ,这个就非常容易实现。

这种方式非常有灵活性,开发阶段打开 HTTP 服务,直接 HTTP REST API 测试,这些都没有问题,在上线后,只要开启 RSocket ,然后连接到 Gateway Broker 上就可以,然后这一切都是自动化的。

拓扑扩展延伸

当然这个架构,还可以扩展到各种部署结构上,如 Kubernetes 上,你不需要什么 ingress ,容器启动后直接连接得到 gateway broker 就可以啦,只需要提供 web 应用对应的接入域名或者服务名就可以啦,也不需要你创建什么服务名, DNS 等。这种方式完全对网络和运维系统无任何要求,无论你使用任何容器管理系统都可以。

多语言扩展

由于 AJP 是标准的协议,所以同样可以套用在其他的语言开发上,其实就是减少 HTTP 协议解析,然后从 AJP 中构建出 HTTP 请求,然后安装标准的 Web 框架处理就可以。如和 JavaScript 结合时, 你完全基于 AJP 构建出 Request 对象,然后交给特定函数处理,其实就是遵循 Service Worker 规范。

image.png
其他语言,也都有对应的 webserver interface 规范,如 Ruby的 Rack , Python 的 WSGI 等,主要 AJP 和这些规范对接即可.

总结

借助 RSocket 的架构提供,我们可以将之前比较复杂的方案简化,当然最最重要的是性能的提升,即便之前的一些性能提升技术点,可能由于一些约束等,现在和 RSocket 对接,那些问题都不存在啦。

有同学可能问,要实现这个架构复杂否?如果你基于 Spring 架构的话,我可以说任何人都能开发出来。你只需要创建一个 Spring Boot 应用,启动 RSocket 监听,然后其他 Spring Boot Web 应用通过 RSocketRequester 连接上来,接下来就是一些AJP相关的编解码工作,然后调用一下 Spring Web 提供的 HTTPHandler 接口,就这些工作量,Spring RSocket 已经提供对应的功能。

 

原文链接
本文为阿里云原创内容,未经允许不得转载。

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

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

相关文章

英特尔拥抱开源,岂能没有杀手锏?

10 年前,Netscape 创始人、硅谷著名投资人马克安德森说“软件吞噬世界”,如今已发展为“开源吞噬世界”。据《2020年度 GitHub Octoverse 报告》显示,GitHub 上开发者数量达到 5600 万,新增 6000 万个存储库以及 19 亿个 contribu…

Java全能手册火了!Redis/Nginx/Dubbo/Spring全家桶啥都有!

前言本文是为了帮大家快速回顾了Java中知识点,这套面试手册涵盖了诸多Java技术栈的面试题和答案,相信可以帮助大家在最短的时间内用作面试复习,能达到事半功倍效果。本来想将文件上传到github上,但由于文件太大有的都无法显示所以…

云原生实时数仓首次在2020双11核心数据场景落地

简介: 这是史上数据量、计算量最大的一年,是实时处理要求最高、与机器智能结合性最强的一次双11,也是全球最大规模的一次云原生实践。背后作为数据核心支撑的大数据平台更是创下新的世界纪录。 刚刚结束的2020天猫双11又创下两项新记录&…

Flink + 强化学习搭建实时推荐系统

大家好,我叫许日花名欢伯,在2016年盒马早期的时候,我就转到了盒马的事业部作为在线数据平台的研发负责人,现在阿里云的计算平台负责DataWorks的建模引擎团队。今天的分享内容也来源于另一位嘉宾李启平(首义&#xff09…

MySQL 避坑指南之隐式数据类型转换

作者 | 不剪发的Tony老师责编 | 欧阳姝黎出品 | CSDN博客????知之为知之,不知为不知,是知也。——《论语》今天我们来聊聊 MySQL 中存在的隐式数据类型转换以及可能带来的问题。当两个不同类型的数据进行运算时,为了使得它们能够兼容&…

二级java题型及分值_计算机二级java考试内容

计算机二级java考试内容Java支持快速原型和容易试验,它将导致快速程序开发。这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的精巧的开发过程。下面是小编整理的关于计算机二级java考试内容,希望大家认真阅读!基本要求1.掌握Java语言的特点、…

淘宝直播在冲刺最复杂的人工智能技术!

01 上周,主播林珊珊测试了一下淘宝直播团队依据他个人形象打造的虚拟主播,也就是林珊珊下播以后,让虚拟主播上场,粉丝在直播间可以跟虚拟主播互动,虚拟主播则实时介绍商品,回答消费者提问。 第二天&#x…

2020双十一,阿里云GRTN拉开直播和RTC技术下半场的序幕

直播,已经成为了“剁手党”们最喜闻乐见的一种购物形式。对直播体验的极致追求,也是淘宝技术人们长期的努力方向。为了提升用户购物体验,让直播更加丝滑,让剁手更快一些,在2020双十一期间,淘宝首次启用了阿…

开拓新格局 共赢新 Power 2021浪潮商用机器新布局

6月25日,以“新格局新核心新Power”为主题的2021浪潮商用机器客户大会在沪隆重举行,本次大会吸引了来自证券、保险、医疗、制造、交通等重点行业的上百位客户代表以及ISV等渠道合作伙伴。会上,浪潮商用机器正式发布了面向关键计算的浪潮全新K…

大促场景系统稳定性保障实践经验分享

每到双11,如何保障系统高峰扛得住、长期平稳是每个大促人必须面对的问题。在今年双11之前,阿里云在上海举办了一场线下交流,阿里大促和稳定性保障负责人、中间件专家、解决方案专家等将历年总结的大促经验分享给参会嘉宾,我们选取…

考拉海购全面云原生迁移之路

今年 8 月底,入驻“阿里动物园”一周年的考拉海购首次宣布战略升级,在现有的跨境业务基础上,将重点从以“货”为中心变成以“人”为中心,全面发力会员电商。 外界不知道的是,对考拉海购来说,不只是完成了业…

新零售:从上云到云原生 Serverless

作者 | 七凌来源 | 阿里巴巴中间件头图 | 付费下载于 IC Photo某零售商超行业的龙头企业,其主要业务涵盖购物中心、大卖场、综合超市、标准超市、精品超市、便利店及无人值守智慧商店等零售业态,涉及全渠道零售、仓储物流、餐饮、消费服务、数据服务、金…

企业双11业绩增长156% 、成交额突破151亿元...... 这背后是阿里云数据中台的场景赋能

红星美凯龙天猫数字化卖场累计成交金额突破151.52亿元;杜蕾斯全网销售额突破1.7亿元,天猫官方旗舰店销售额同比增长105%;滴露全网销售额突破1.8亿元,天猫官方旗舰店销售额同比增长156%;波司登首铺准确率提升79%…… 在…

Gartner:2020年全球IaaS公有云服务市场增长40.7%

编辑 | 宋 慧 供稿 | Gartner 头图 | 付费下载于视觉中国 根据全球信息技术研究和顾问公司Gartner的统计结果,2020年全球基础设施即服务(IaaS)市场达到643亿美元,相比2019年的457亿美元增长40.7%。2020年亚马逊仍在IaaS市场排名第…

jmeter+mysql+set_jmeter学习指南之操作 mysql 数据库

JMeter 通过 JDBC Connection Configuration 和 JDBC Request 可以连接数据库,并进行增删改查操作,支持各种常见的数据库,本文以最常用的 MySQL 数据库为例讲解,其它数据库的使用方法类似。一、下载驱动包在使用之前,需…

如何快速实现精准的个性化搜索服务

简介: 用户行为数据如何实时的应用在搜索服务中那? 怎样在1天内就可实现【精准的个性化搜索系统】搭建那? 今天小编将通过【阿里云开放搜索】中的三大“个性化搜索算法模型”给大家详细介绍,希望给予您更多解决思路~ 一、个性化排…

写代码时发现......还得是 SpringBoot !一篇拿下

关注了很多技术类公众号的读者肯定有这样一个感受,SpringBoot相关的文章铺天盖地,并且SpringBoot相关的文章阅读量、收藏量都很高,这也从侧面反映了SpringBoot技术的火爆。一切都在证明,SpringBoot已经成为了Java程序员必备的技能…

当 TiDB 与 Flink 相结合:高效、易用的实时数仓

简介: 利用实时数仓,企业可以实现实时 OLAP 分析、实时数据看板、实时业务监控、实时数据接口服务等用途。但想到实时数仓,很多人的第一印象就是架构复杂,难以操作与维护。而得益于新版 Flink 对 SQL 的支持,以及 TiDB…

云原生时代微服务的高可用架构设计

简介: 在8月20日“阿里巴巴技术质量精品课”上,来自蚂蚁的经国分享了对云原生时代微服务的高可用架构设计的全面解析,为大家介绍了应用架构演进路径、云原生时代的技术福利、高可用架构的设计原则以及经典案例的设计。 演讲嘉宾简介&#xf…

“精耕细作”桌面云市场的锐捷,重磅发布三擎云桌面

编辑 | 宋 慧 出品 | CSDN云计算 头图 | 付费下载于IC photo 在教育行业VDI与桌面云具有优势的锐捷,仍在不断扩充自身技术与产品方案的实力。 6月30日,锐捷正式对外发布新一代云桌面解决方案——锐捷三擎云桌面解决方案。会上针对三擎云桌面的终端云化…