==================================
为什么需要API gateway?
==================================
企业后台微服务互联互通, 因为在内网, 安全基本没问题, 再配合使用Basic Auth就足够了, 同时也能利用上服务注册的优点, 有效隔离微服务之间的相互依赖. 但如果通过javascript/原生app直接访问微服务, 就会有下面的问题:
1. 接口安全问题, 很容易就能查看到js调用微服务api的代码, api肯定不能再裸奔, 需要加入安全检查机制. 每个微服务都要加同样的安全机制, 重复工作量很大.
2. 网络安全问题, 我们不应该将所有的微服务机器都暴露到外网, 网络风险较大.
3. 前后端耦合问题, 在调用api时候, 必须写死微服务ip信息, 如果微服务IP有变动, 前端也要及时更改才行.
4. 容易有单点问题, js 无法利用服务注册机制, 必须写死一个微服务主机ip, 即使我们的微服务往往会部署多套, 也有单点问题.

引入 api 网关就是要解决上述问题, api 网关作为对外服务的 facade 层. 另外, api 网关还可以实现智能路由功能, 以及动态扩容缩容, 甚至上可以聚合一些微服务操作, 以减少网络交互次数, 改善用户体验, 这个 ESB 的作用类似, 当然要谨慎使用, 比如体量较大的To C应用, 如果提供web/手机不同的访问形式, 可以考虑使用这一优化手段.

API 网关的管理范围:
1. 仅仅管理API访问(无状态的那部分), 并不负责管理普通web服务器.
2. 仅仅管理对外服务的API, 不负责微服务内部的数据请求, 如果要将微服务内部通讯管起来, API 网关的网络压力太大, 会是性能的瓶颈.

API 网关使用场景:
1. 开放平台, 比如微信或微博的开放平台, 这样的平台是专门针对第三方应用接入的, 提供 API 接入是最优选择.
2. 支持大型原生app, 大型原生app后台需要很多微服务项目, 通过 api 网关和这些微服务对接是比较方便的.
3. 网页js埋点采集, 埋点采集api不需要关心权限, 引入api网关主要是利用其自动扩容特性, 比如引入kong.

下图是引入 api 网关后的架构图(不含 WebUI 项目)

==================================
企业内部微服务架构有必要引入 API gateway 吗?
==================================
企业内部一般情况是: 仅仅有web应用, 没有移动端应用, 所有的用户都在局域网内部.
针对这样的情形, 我认为引入 API 网关的意义并不大, 理由是: web 项目肯定会有一个Web 后台应用服务器, 后台应用服务器可以承担api网关的主要职责, 包括api流量转发和安全检查.

简答一个常见的疑问:
典型 web 项目的 UI 往往是由后端模板渲染+前端ajax调用api组成. 后端模板肯定是本应用的web 后台提供, 但ajax调用的api是本应用后台提供, 还是其他微服务项目提供呢?
我的答案是: ajax调用的api最好还是本应用的web后台提供, 这样 jquery 和 api 属于同域, ajax 请求会自动带上本域的cookie, 这台web服务器本身也有相应的 session 信息, 所以ajax请求能通过 session-cookie 完成身份验证, 整个过程非常自然. 如果 ajax调用的api 是另一个微服务提供的, 为了保证微服务无状态特性, 同时避免api不会被滥用, 需要完善方案, 可选方案如下:
1. 在微服务项目中引入 redis集群来共享session存储, 将状态转移到redis集群中. 这个方案比较重, 并且 jquery 和 微服务不是同源, 需要在ajax调用时加上cookie, 可参考: https://blog.csdn.net/wzl002/article/details/51441704
2. 微服务项目不使用session做身份验证, 而是引入 jwt. 本方案的缺点: 想想有那么多的微服务项目都要加上jwt机制, 肯定比较麻烦, 另外js 调用微服务的url, 无法利用上服务注册的好处.
3. 引入api 网关, 将jwt身份验证前移到api网关层. 该方案能避免方案2的缺点, 但因为引入了新的一层, 整体架构变得复杂了.

下图是一个基于微服务的 WebUI 项目架构图,

==================================
API 网关的选型
==================================
常用的API网关候选, 主要有 Kong/Netflix Zuul/Spring Cloud Gateway, 详见下面博客
https://www.cnblogs.com/savorboard/p/api-gateway.html

Kong 是一个非常优秀的开源 API 网关产品, 基于 OpenResty + Cassandra/PostgreSQL, 以插件的形式提供很多功能(身份认证/权限控制/日志/流量控制), 也可以使用 Lua 编写插件, 底层是 Nginx , 所以性能非常好, 社区插件也较多, 但要定制插件难度较大, 需要使用 Lua 编写.

Spring 社区主要是 Netflix Zuul 和 Spring Cloud Gateway, Netflix Zuul 是基于Servlet 2.5, 使用阻塞 API, 它不支持任何长连接, 如 WebSocket. Spring Cloud Gateway 是Spring社区主推的解决方案, 采用了更新的技术, 它基于Spring framework 5, Project Rector 和 Spring Boot 2, 使用的是非阻塞API, 支持 Websocket.

对于企业内应用, 研发主导的话推荐是使用 Spring Cloud Gateway, 运维主导的话推荐 kong.
对于大型互联网开放平台, 推荐性能更好的 kong.

买单侠微服务的API网关演化之路
https://blog.csdn.net/omnistack/article/details/77185188
https://blog.csdn.net/OmniStack/article/details/77881185

==================================
Spring Cloud Gateway 参考
==================================
Spring Cloud Gateway 入门
https://www.jianshu.com/p/598f302dadba
https://www.jianshu.com/p/76d2da1d0dd7
Spring Cloud(十三):Spring Cloud Gateway(路由)
https://windmt.com/tags/API-Gateway/
Spring Gateway配置使用(一)
https://www.jianshu.com/p/d011a0e5539d
Spring Cloud Gateway入门案例
https://www.jianshu.com/p/44a0d6adcdea
Spring Cloud(十八):Spring Cloud Gateway(读取、修改 Request Body)
http://www.liuhaihua.cn/archives/549430.html

Spring cloud gateway的更多相关文章

  1. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析

    API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...

  2. Spring Cloud Gateway Ribbon 自定义负载均衡

    在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...

  3. 简单尝试Spring Cloud Gateway

    简单尝试Spring Cloud Gateway 简介 Spring Cloud Gateway是一个API网关,它是用于代替Zuul而出现的.Spring Cloud Gateway构建于Sprin ...

  4. spring cloud gateway的stripPrefix配置

    序 本文主要研究下spring cloud gateway的stripPrefix配置 使用zuul的配置 zuul: routes: demo: sensitiveHeaders: Access-C ...

  5. Spring Cloud Gateway中异常处理

    最近我们的项目在考虑使用Gateway,考虑使用Spring Cloud Gateway,发现网关的异常处理和spring boot 单体应用异常处理还是有很大区别的.让我们来回顾一下异常. 关于异常 ...

  6. api网关揭秘--spring cloud gateway源码解析

    要想了解spring cloud gateway的源码,要熟悉spring webflux,我的上篇文章介绍了spring webflux. 1.gateway 和zuul对比 I am the au ...

  7. SpringCloud无废话入门05:Spring Cloud Gateway路由、filter、熔断

    1.什么是路由网关 截至目前为止的例子中,我们创建了一个service,叫做:HelloService,然后我们把它部署到了两台服务器(即提供了两个provider),然后我们又使用ribbon将其做 ...

  8. spring cloud gateway - RequestRateLimiter

    1. Official website 5.7 RequestRateLimiter GatewayFilter Factory The RequestRateLimiter GatewayFilte ...

  9. Spring Cloud Gateway入门

    1.什么是Spring Cloud GatewaySpring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技 ...

随机推荐

  1. matplotlib正弦和余弦图

    代码: # -*- coding: utf-8 -*- """ Created on Thu Jul 12 16:37:47 2018 @author: zhen &qu ...

  2. ORM(二)常用字段小记

    常用字段类型: AutoField:字段自增,多用于ID主键字段,每个表中只能有一个AutoField字段类型. id = models.AutoField(primary_key=True) # 设 ...

  3. JVM内存结构简单认知

    关于JVM的面试传送门:https://blog.csdn.net/shengmingqijiquan/article/details/77508471 JVM内存结构主要划分为:堆,jvm栈,本地方 ...

  4. 浏览器中 F12 功能的简单介绍

    chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首 ...

  5. pip "Cannot uninstall 'six'. It is a distutils installed project..." 解决方法

    安装 mysql-connector-python 时,由于依赖包 six 之前已经安装过,但是不能自动更新到所需版本.有如下错误提示: pip "Cannot uninstall 'six ...

  6. gdb cheat sheet

    0x01 控制流 r run,运行程序. r < a.txt   run,重定向输入 si   step instruction 进入函数 ni      next instruction 下一 ...

  7. 第一次java作业

    学习了c语言半个学期,好像刚开始并不担心Java,因为Java也是类同于C语言的一种语言,可是Java学到现在也将近一个月,在我脑子里现在却还没有一个框架,有点着急了.

  8. Golang 入门 : 打造开发环境

    工欲善其事,必先利其器!在学习和使用 Golang 时如果有一款得心应手的 IDE,相信一定可以事半功倍.虽然很多 IDE 都提供了对 Golang 的支持,但真正好用的没几个.VSCode 算是不错 ...

  9. TypeError: argument 1 must be an integer, not _subprocess_handle/OSError: [WinError 87]

    Error Msg: Traceback (most recent call last): File "c:\python27\lib\site-packages\celery\worker ...

  10. Aninteresting game HDU - 5975 (数学+lowbit)

    Let’s play a game.We add numbers 1,2...n in increasing order from 1 and put them into some sets. Whe ...