API网关的作用

我们知道,在一个微服务系统中,整个系统被划分为许多小模块,客户端想要调用服务,可能需要维护很多ip+port信息,管理十分复杂。API网关作为整个系统的统一入口,所有请求由网关接收并路由转发给内部的微服务。对于客户端而言,系统相当于一个黑箱,客户端不需要关心其内部结构。

随着业务的发展,服务端可能需要对微服务进行重新划分等操作,由于网关将客户端和具体服务隔离,因此可以在尽量不改动客户端的情况下进行。网关可以完成权限验证、限流、安全、监控、缓存、服务路由、协议转换、服务编排、灰度发布等功能剥离出来,讲这些非业务功能统一解决、统一机制处理。

Zuul原理简介

随行付微服务API网关基于Netflix的Zuul实现。Netflix是实践微服务最成功的公司之一,他们创建并开源了一系列微服务相关的框架,Zuul便是用来实现网关功能的框架。Zuul的整体架构图如下:

Zuul基于Servlet开发,ZuulServlet是整个框架的入口。Zuul的核心组件是Filter,Filter分为四类,分别是pre、route、post、error。pre-filter用来实现前置逻辑,route-filter用来实现对目标服务的调用逻辑,post-filter用来实现收尾逻辑,error-filter则在任意位置发生异常时做异常处理(此处应该注意,如果pre或route发生异常,执行error后,仍然会执行post),其示意图如下:

在Filter中可以定义某些条件下是否执行过滤器逻辑,以及同种类Filter的优先级。Filter的各个方法中并不存在入参,其参数传递是通过一个基于ThreadLocal实现的RequestContext,虽然RequestContext中定义了很多参数的读写方法,但初始的可用参数仅有req和res,对应HttpSerlvetRequest和HttpServletResponse。Filter代码范例如下:

Filter通常使用groovy编写,以便于动态加载。当我们编写好一个Filter类后,将其放在指定的磁盘路径下,FilterFileManager会启动一个守护线程去定期读取并加载。通过动态加载,我们可以在不停机的情况下添加、修改功能模块。FilterFileManager源码摘要如下:

SpringCloud-Zuul

Spring Cloud通过集成Zuul来实现API网关模块,我们来简单介绍一下它的整合原理。

SpringCloud-Zuul的核心配置类是ZuulServerAutoConfiguration以及ZuulProxyAutoConfiguration。Spring首先使用ZuulController来封装ZuulServlet,然后定义一个ZuulHandlerMapping,使得除一些特殊请求以外(如/error)的大部分请求被转发到ZuulController进行处理。源码摘要如下:

SpringCloud默认定义了一些Filter来实现网关逻辑,其中最核心的Filter——RibbonRoutingFilter是负责实际转发操作的,在它的过滤逻辑里又集成了hystrix、ribbon等其他重要框架。源码摘要如下:

加载Filter的方式通过ZuulFilterInitializer扩展为可以从ApplicationContext中获取。源码摘要:

Zuul2

随着业务的不断发展,Zuul对于Netflix来说性能已经不太够用,于是Netflix又开发了Zuul2。Zuul2最大的变革是基于Netty实现了框架的异步化,从而提升其性能。根据官方的数据,Zuul2的性能比Zuul1约有20%的提升。Zuul2架构图如下:

由于框架改为了异步的模式,Zuul2在提升性能的同时,也带来了调试、运维的困难。在实际的使用当中,对于绝大多数公司来说,并发量远远没有Netflix那样庞大,选择开发调试更简单、且性能够用的Zuul1是更合适的选择。

zuul 网关的用途_微服务之基于Zuul自研服务网关相关推荐

  1. 网关转发其他微服务后头信息拿不到_微服务之基于Zuul自研服务网关

    API网关的作用 我们知道,在一个微服务系统中,整个系统被划分为许多小模块,客户端想要调用服务,可能需要维护很多ip+port信息,管理十分复杂.API网关作为整个系统的统一入口,所有请求由网关接收并 ...

  2. 用samba服务构建基于企业级的文件共享服务

    用samba服务可轻松构建基于企业级的文件共享服务,配置起来比windows的NTFS+共享权限更简单,更容易,而且samba可以直接通过内核和用户交互数据,访问效率更高. ------------- ...

  3. netty 工控网关_开源软件分享-基于.NET的工控网关和组态软件

    最近逛github发现一款不错的组态软件,其包括了工控网关和组态界面.其中他的工控网关已支持(Modbus TCP/RTU. OPC DA. Siemens S300/200/1200/1500. P ...

  4. 微众银行的金融级消息服务平台建设实践和思考

    来自:阿里巴巴中间件 导读: 近年来,随着微服务架构的流行,分布式消息引擎在物联网.分布式事务.实时计算和大规模缓存同步等场景中的应用日益增多.本文将分享微众银行基于RocketMQ构建消息服务平台的 ...

  5. 基于阿里云容器服务的微服务实践 - Part 1. 微服务与Docker

    基于阿里云容器服务的微服务实践 基于阿里云容器服务的微服务实践 - Part 1. 微服务与Docker 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blo ...

  6. 基于 Apache APISIX 的服务网格方案

    服务网格(Service Mesh)是处理服务间通信的基础设施层.它负责构成现代云原生应用程序的复杂服务拓扑来可靠地交付请求.通常会为每个服务实例提供一个"边车"(sidecar) ...

  7. [享学Eureka] 一、源生Eureka介绍 --- 基于注册中心的服务发现

    凡事皆有代价,一切皆是取舍. 本专栏所有文章均计划逐步重写搬迁至本人公号:Java方向盘,且免费开放!故不再建议下单购买,可关注我公号前往免费学习.交流 –> 返回Netflix OSS套件专栏 ...

  8. 自研服务治理框架----文章汇总

    2019独角兽企业重金招聘Python工程师标准>>> 自研服务治理框架----获取本机IP地址 自研服务治理框架----服务注册 自研服务治理框架----服务地址发现 自研服务治理 ...

  9. 微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关

    微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关 1. 微服务简介 1.1 服务架构演变 1.2 SpringCloud ...

最新文章

  1. SQLServer之创建非聚集索引
  2. Part1_1 pycharm的一些基础设置
  3. [七]RabbitMQ-客户端源码之AMQPImpl+Method
  4. 在html中超链接_4.html5中超链接
  5. MySQL工具名字_MySQL客户端工具及SQL讲解
  6. 【IoT最佳实践】设备获取实时天气信息
  7. UEFI---(NT32)的第一个代码
  8. 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。...
  9. AngularJS控制器和AngularJS过滤器的学习(3)
  10. 【归并排序+递归】LeetCode 148. Sort List
  11. staf linux运行模式,IBM 自动化测试框架STAF介绍
  12. 网易大数据面试题试解
  13. 《软件方法》第8章 分析 之 分析类图(2)
  14. linux IRQ Management(六)- DTS及调试
  15. html像素测量尺,屏幕尺子:ruul.Screen ruler
  16. 小实践之网络打印机的设置(实际操作篇)
  17. linux rm -rf 通配符,linux 通配符删除文件和目录rm命令
  18. Defensive Programming in PHP(PHP中的防御性编程)
  19. An 逐帧动画的制作
  20. 如何在 Mac 上使用第三方鼠标?

热门文章

  1. 计蒜客——回文平方数
  2. linux源代码剖析之三fs
  3. 【李宏毅2020 ML/DL】P8-9 Optimization for Deep Learnin | 优化器技术总结,SGDM 与 Adam 对比与使用建议
  4. putty远程登录linux无ssh,收集的linux远程ssh连接putty失败解决办法!
  5. docker安装mysql以及设置navicat远程访问
  6. Oracle数据库使用Navicat premium创建用户时遇到的坑
  7. winform listbox 没有listitem的问题
  8. android SQLite常用数据类型
  9. java 二进制是什么类型_Java基础类型与其二进制表示
  10. 基于html5 Canvas图表库 : ECharts