- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)
您可能关注的文档
最近下载
- 2024年中级注册安全工程师-矿山-考前资料.pdf VIP
- 2025年高级工具钳工《理论知识》考试真题(新版解析).pdf VIP
- 红色资源讲解员服务规范 DB32 T 5069-2025.pdf VIP
- 第9课+水墨井冈+++课件+2025-2026学年赣美版(2024)初中美术八年级上册.pptx VIP
- 《习作:“漫画”老师》优质教案(第一课时).docx VIP
- 第7课+中国传统色++课件+2025-2026学年赣美版(2024)初中美术八年级上册.pptx VIP
- 查理和巧克力工厂.ppt VIP
- 第7课 中国传统色 课件 2025赣美版美术八年级上册.pptx
- 医美整形面部美学设计及微整产品知识课件.ppt
- 第一财经商业数据中心&自然堂:2024中国女性肌肤衰老趋势变化报告.pdf VIP
文档评论(0)