徒手撸了一个API网关,理解更透彻了,代码已上传github,自取~.docxVIP

徒手撸了一个API网关,理解更透彻了,代码已上传github,自取~.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
徒手撸了一个API网关,理解更透彻了,代码已上传github,自取~ 烟味i 2021-02-17 点击上方 关注,?星标或置顶一起成长 免费送 1024GB 精品学习资源? 一、背景 最近在github上看了soul网关的设计,突然就来了爱好预备本人从零开头写一个高功能的网关。经过两周时间的开发,我的网关ship-gate核心功能基本都已完成,最大的缺陷就是前端功底太差没有管理后台??。 二、设计 2.1 技术选型 网关是全部恳求的入口,所以要求有很高的吞吐量,为了实现这点可以使用恳求异步化来处理。目前一般有以下两种方案: Tomcat/Jetty+NIO+Servlet3 Servlet3已经支持异步,这种方案使用比较多,京东,有赞和Zuul,都用的是这种方案。 Netty+NIO Netty为高并发而生,目前唯品会的网关使用这个策略,在唯品会的技术文章中在相同的情况下Netty是每秒30w+的吞吐量,Tomcat是13w+,可以看出是有肯定的差距的,但是Netty需要本人处理HTTP协议,这一块比较麻烦。 后面发觉Soul网关是基于Spring WebFlux(底层Netty)的,不用太关怀HTTP协议的处理,于是打算也用Spring WebFlux。 网关的其次个特点是具备可扩展性,比如Netflix Zuul有preFilters,postFilters等在不同的阶段便利处理不同的业务,基于责任链模式将恳求进行链式处理即可实现。 在微服务架构下,服务都会进行多实例部署来保证高可用,恳求到达网关时,网关需要依据URL找到全部可用的实例,这时就需要服务注册和发觉功能,即注册中心。 现在流行的注册中心有Apache的Zookeeper和阿里的Nacos两种(consul有点小众),由于之前写RPC框架时已经用过了Zookeeper,所以这次就选择了Nacos。 2.2 需求清单 首先要明确目标,即开发一个具备哪些特性的网关,总结下后如下: 自定义路由规章 可基于version的路由规章设置,路由对象包括DEFAUL,HEADER和QUERY三种,婚配方式包括=、regex、like三种。 跨言语 HTTP协议天生跨言语 高功能 Netty本身就是一款高功能的通信框架,同时server将一些路由规章等数据缓存到JVM内存避开恳求admin服务。 高可用 支持集群模式防止单节点毛病,无形态。 灰度发布 灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户连续用产品特性A,一部分用户开头用产品特性B,假如用户对B没有什么反对意见,那么逐渐扩大范围,把全部用户都迁移到B上面来。通过特性一可以实现。 接口鉴权 基于责任链模式,用户开发本人的鉴权插件即可。 负载均衡 支持多种负载均衡算法,如随机,轮询,加权轮询等。利用SPI机制可以依据配置进举动态加载。 2.3 架构设计 在参考了一些优秀的网关Zuul,Spring Cloud Gateway,Soul后,将项目划分为以下几个模块。 它们之间的关系如图: 网关设计 留意: 这张图与实际实现有点出入,Nacos push到本地缓存的那个环节没有实现,目前只要ship-sever定时轮询pull的过程。ship-admin从Nacos猎取注册服务信息的过程,也改成了ServiceA启动时自动发生HTTP恳求通知ship-admin。 2.4 表结构设计 三、编码 3.1 ship-client-spring-boot-starter 首先创建一个spring-boot-starter命名为ship-client-spring-boot-starter,不晓得如何自定义starter的可以看我以前写的《开发本人的starter》。 其核心类?AutoRegisterListener?就是在项目启动时做了两件事: 1.将服务信息注册到Nacos注册中心 2.通知ship-admin服务上线了并注册下线hook。 代码如下: *?Created?by?2YSP?on?2021/12/21 */ public?class?AutoRegisterListener?implements?ApplicationListenerContextRefreshedEvent?{ ???private?final?static?Logger?LOGGER?=?LoggerFactory.getLogger(AutoRegisterListener.class); ???private?volatile?AtomicBoolean?registered?=?new?AtomicBoolean(false)

文档评论(0)

bob157641554 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档