==================================
为什么需要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. PMM Client 安装异常报错

    1.PMM架构 如下图所示 2.Client主要组件 PMM Client是安装在你要监视的MySQL或MongoDB主机上的一组代理组件.组件收集关于一般系统和数据库性能的各种数据,并将该数据发送到 ...

  2. 阿里云安装MySQL5.7

    长话短说: step1:下载mysql源安装包:wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm ste ...

  3. NTFS权限和共享权限的区别

    共享权限 共享权限有三种:完全控制.更改.读取 共持本地安全性.换句话说,他在同一台计算机上以不同用户名登录,对硬盘上同一文件夹可以有不同的访问权限. 注意:NTFS权限对从网络访问和本机登录的用户都 ...

  4. Windows中通过命令行启动打开Service 管理工具

    经常需要打开Services 管理工具操控Service 的启动,停止. 通过控制面板 --> 管理工具 -->Service  太慢. 学到一个快捷方式. windows + R  启动 ...

  5. Windonws基本命令手册

    1. gpedit.msc-----组策略  2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 4. explorer-------打开资源管理器 5. ...

  6. Shell企业案例实战和企业面试题

    shell企业面试题 1.批量创建带有随机小写字符文件程序 使用for循环在/pizza目录下创建10个html文件,其中每个文件包含10个随机小写字母加固定字母_pizza 1.思路分析: 核心是: ...

  7. Linux新手随手笔记1.7

    配置网卡(本地电脑) Vment1   仅主机模式 Vment8   nat模式 物理机 : 192.16810.1  /255.255.255.0 服务器 : 192.168.10.10 /255. ...

  8. 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading)

    前言 接下来会陆续详细讲解EF Core 2.1新特性,本节我们来讲讲EF Core 2.1新特性延迟加载,如果您用过EF 6.x就知道滥用延迟加载所带来的灾难,同时呢,对此深知的童鞋到了EF Cor ...

  9. 转载:img是什么元素?置换元素?

    转载: https://blog.csdn.net/kingliguo/article/details/52643594 img是什么元素? 应是行内元素,判断一个元素是行内元素,还是块元素,无非就是 ...

  10. 升级:DNAtools for Excel工具箱,2.x英文版- VBA代码破解工具

    原始出处:www.cnblogs.com/Charltsing/p/DnaTools.html QQ:564955427 DNA工具箱全部功能一览:    单元格焦点指示(支持Excel 2007~2 ...