❝本文原发表于公司内网,现重新整理,略去一些公司相关的信息。
❞
随着公司业务的飞速发展,基于php的模块化架构难以支持未来业务的发展:
尽管很早我们就做了会员、商品、交易的服务化,但流量入口还是php主站,php实际上仍是一个单体应用,单体应用无需网关。当全站java化之后,单体应用将被拆分为微服务,自然需要一个网关来负责统一流量入口、鉴权、安全防护、业务统一处理等。
在2019年3月,我们发起了代号为诺曼底
的全站java化项目,将微服务网关项目命名为airborne101
,第101空降师(101st Airborne Division (Air Assault))是美国陆军的一支空中突击部队,创建时是一支空降部队,在二战期间,该师首先参加了诺曼底战役。
简单来说网关就是个web应用,接收转发http请求。它的难点在于需要用少量机器支撑起全站的流量,方便快速地支持业务的发展且足够稳定。总结起来就是如下三点:
网关技术选型考虑主要考虑两点:
按语言分类,主要考虑如下三类:
公司的rpc框架为dubbo,首选已经实现了dubbo客户端的语言,像openrestry虽然性能非常优秀,但其开发语言为lua,没有现成的java客户端,如果自研lua的客户端需要完成协议的编解码、路由、负载均衡等等一系列功能,工程浩大。go虽然有dubbo的客户端,但目前还不够成熟,且go语言在公司运用不多,配套设施不够齐全(如监控、发布等系统)。故我们选择使用java来实现。
选择开源需要对开源代码进行熟悉,测试,定制,可能还会存在未知的bug。网关的逻辑并不复杂,与其选择开源,不如自研,更加能hold住。
参考开源的java网关实现以及如上难点,我们有如下设计与技术选型
dubbo泛化调用
,无需引入业务方的jar包对dubbo接口发起调用spring-webflux
的响应式编程责任链
模式开发,易于扩展初期为了快速上线,网关在调用后端dubbo服务时采用同步的方式,即将请求放在线程池中同步阻塞直到请求完成或者超时。这就导致了一个很致命的问题,假设集群中有一些接口响应慢,如果请求量稍微大一点,占满了网关的线程池,则正常的请求也会被拒绝。
我们的解决手段有两个,一是物理隔离
,将网关按业务的重要程度划分,如分为普通集群与交易集群,交易集群只处理交易相关的接口,这样交易与非交易就不会互相影响。但这样在同一个集群中仍然会相互影响,如慢的交易请求影响正常的交易请求。此时我们实现了一个线程池隔离
机制。
线程池隔离机制将原先的dubbo线程池拆分为三个:正常线程池、异常线程池、心跳线程池。正常请求走正常线程池、慢请求走异常线程池,快慢请求不相互影响。还需要一个心跳线程池,因为当异常线程池满之后,慢请求可能无法正常处理,如果此时有两个或以上的慢请求,当其中一个恢复时无法被拉回正常线程池。所以需要心跳线程池定时检测异常线程池中的请求是否已经恢复。
看一个例子:
测试两个接口airborne.test.void与airborne.test,让airborne.test.void变慢并堵死线程池,airborne.test也受到影响,随后网关将airborne.test.void放入异常线程池执行,airborne.test恢复正常。
上述的物理隔离与线程池隔离帮我们度过了2019年的双十一,但其仍然存在吞吐率上不去的问题,内存压力与线程切换的开销导致线程池大小不可能无限大,所以网关的吞吐率受限于后端接口的响应时间。
经过压测,网关的dubbo线程池设置为600(正常)+600(异常)+20(心跳)时,压测50至500ms的接口响应时,可达400-2000rps。
如果dubbo的同步调用改为异步调用,则可避免该问题。在dubbo 2.7之前dubbo底层返回Future
,需要轮询获取结果,对异步编程支持的不够友好,dubbo 2.7之后返回CompletableFuture
,很方便地可以执行回调,且与spring-webflux结合地很好。在dubbo请求响应时驱动网关处理返回结果,不用一直占用一个线程。由于网关只发起调用,所以只要dubbo 2.7与公司所用的2.6.6协议兼容即可,升级成本比较小。
经过压测,dubbo异步调用版本的网关吞吐率不再受后端接口响应时间影响,稳定在单机(4C8G)5000rps。自从升级到异步调用后,集团只需要个位数的机器就能抗起全站的接口流量,且没有接口相互影响的烦恼(线程池隔离就废弃了)。
前面说了为了稳定性将网关拆分为核心网关与嵌入式网关,嵌入式网关实际上就是一个jar包,需要业务方引入,前期好处很多,但后期出现一个问题就是版本无法统一,升级困难。
需要经常升级嵌入式网关主要有如下几点情况:
第一点必须要升级才能解决,不过后期也会逐渐稳定,频率较低。第二点最频繁,新业务接入需要增加新业务的逻辑与配置文件,第三点可以忽略,嵌入式网关提供的扩展能力可以让业务方自己实现扩展,无需升级。
针对第二点,我们重构了代码,让新业务接入无需修改代码,将其配置化,并且将配置与嵌入式网关逻辑分开,使用grade动态引入配置文件,达到无需业务方感知就能添加新业务的效果。
当然如果嵌入式网关不是作为一个jar包被业务方引入,而是作为一个类似service mesh中的sidecar
,或许这个问题就能更好的被解决。
这可能是网关上线以来遇到的最大的问题,具体可以查看这篇文章:[《一次漫长的dubbo网关内存泄露排查经历》]
刚开始时设置网关的dubbo调用线程池为动态大小加一个缓冲队列,如核心线程数为500,最大线程数为800,缓冲队列为5000。在压测时会发现接口可以正常返回,但接口rt很高。其原因是当线程占满500后,不会立马扩容,而是将请求放入缓冲队列中等待,自然接口rt变长。解决办法是不用伸缩的线程池而使用一个固定大小的线程池,处理不了的请求快速失败。
刚从php切换到java网关时,没有注意php上的nginx还开启了gzip,导致服务端监控看到接口响应时间很短,但客户端监控到页面打开时间变长。
嵌入式网关需要通过反射序列化和反序列化对象,当返回结果嵌套很深,数据量很大时,序列化耗时非常严重,通过arthas
的trace命令可发现是序列化时反射耗性能严重
解决办法是通过一个LRU cache缓存反射过程中的对象。
公司的微服务网关上线以来服务了全站所有java接口流量,至今未发生线上故障。异步化达到了业界的及格水平,仍有许多需要完善和演进的地方需要我们努力。
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/qyD-8ovFoZW_N5eAxEY20w
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。