您现在的位置:新闻首页>数据

自己动手写一个服务网关

2018-07-08 09:37编辑:igtpro.com人气:


如图所示,在不使用网关的情况下,我们的服务是直接暴露给服务调用方。当调用方增多,势必需要添加定制化访问权限、校验等逻辑。当添加API网关后,再第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制。

本文所实现的网关源码抄袭了---Oh,不对,是借鉴。借鉴了Zuul网关的源码, pk10,提炼出其核心思路,实现了一套简单的网关源码,博主将其改名为Eatuul。

本文是业内能搜到的第一篇自己动手实现网关的文章。博主写的手把手系列的文章,目的是在以最简单的方式,揭露出中间件的核心原理,让读者能够迅速了解实现的核心。需要说明的是,这不是源码分析系列的文章,因此写出来的代码,省去了一些复杂的内容,毕竟大家能理解到该中间件的核心原理即可。

先大致说一下,就是定义一个Servlet接收请求。然后经过preFilter(封装请求参数),routeFilter(转发请求),postFilter(输出内容)。三个过滤器之间,共享request、response以及其他的一些全局变量。如下图所示

自己动手写一个服务网关

和真正的Zuul的区别?

主要区别有如下几点

(1)Zuul中在异常处理模块,有一个ErrorFilter来处理,博主在实现的时候偷懒了, pk10,略去。

(2)Zuul中PreFilters,RoutingFilters,PostFilters默认都实现了一组,具体如下表所示

自己动手写一个服务网关

博主总不可能每一个都给你们实现一遍吧。所以偷懒了,每种只实现一个。但是调用顺序还是不变,按照PreFilters-RoutingFilters-PostFilters的顺序调用

(3)在routeFilters确实有转发请求的Filter,然而博主偷天换日了,改用RestTemplate实现.

大家去spring官网上搭建一套springboot的项目,博主就不展示pom的代码了。直接将项目结构展示一下,如下图所示

自己动手写一个服务网关

EatuulServlet.java

这个是网关的入口,逻辑也十分简单,分为三步

(1)将request,response放入threadlocal中

(2)执行三组过滤器

(3)清除threadlocal中的的环境变量

源码如下

EatuulRunner.java

这个是具体的执行器。需要说明一下,在Zuul中,ZuulRunner在获取具体有哪些过滤器的时候,有一个FileLoader可以动态读取配置加载。博主在实现我们自己的EatuulRunner时候,略去动态读取的过程,直接静态写死。

源码如下

EatuulFilter.java

接下来就是一系列Filter的代码了,先上父类EatuulFilter的源码

RequestWrapperFilter.java

这个是PreFilter,前置执行过滤器,负责封装请求。步骤如下所示

(1)封装请求头

(2)封装请求体

(3)构造出RestTemplate能识别的RequestEntity

(4)将RequestEntity放入全局threadlocal之中

代码如下所示

RoutingFilter.java

这个是routeFilter,这里我偷懒了,直接做转发请求,并且将返回值ResponseEntity放入全局threadlocal中

SendResponseFilter.java

这个是postFilters,将ResponseEntity输出即可

RequestContext.java

最后是一直在说的全局threadlocal变量

自己另外起一个server端口为9090如下所示

再来一个controller

然后,你就发现可以从localhost:8080/index进行跳转访问了

(来源:新浪体育网)

织梦二维码生成器
已推荐
0
  • 凡本网注明"来源:的所有作品,版权均属于中,转载请必须注明中,http://www.igtpro.com。违反者本网将追究相关法律责任。
  • 本网转载并注明自其它来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。
  • 如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。






图说新闻

更多>>