2019 年 12 月 14 日,又拍云联合 Apache APISIX 社区举办 API 网关与高性能服务最佳实践丨Open Talk 广州站活动,Apache APISIX PPMC 温铭做了题为《Apache APISIX 的 Apache 之路》的分享。本次活动,邀请了来自ApacheAPISIX、又拍云、腾讯云、HelloTalk 等企业的技术专家,分享网关和高性能服务的实战经验。

温铭,深圳支流科技创始人,Apache APISIX PPMC,《OpenResty 从入门到实战》专栏作者,创业之前在互联网安全公司工作了 10 年,主要从事服务端的开发和架构,负责开发过木马云查杀、反钓鱼系统和企业安全产品。曾在奇虎 360 担任架构师,开源委员会发起人、委员。支流科技是一家开源底层技术初创公司,致力于微服务相关技术的创新和实现。

下面我会从以下几个方面介绍今天的主题:

  • Apache APISIX 是什么,能解决什么问题

  • 回顾微服务是怎么从单体变成现在的 Service Mesh

  • 介绍 Service Mesh 是银弹吗,以及我眼里的下一代微服务架构

Apache APISIX

简单来说 Apache APISIX 是一个微服务 API 网关,它不仅可以处理南北向的流量,也可以处理东西向的流量即服务之间的流量。很多 API 网关的数据库可能是 postgreSQL、mysql 等,它在云原生的环境下需要几秒钟才能启动,而作为 sidecar 也特别重,我们希望 Apache APISIX 在容器里面能够很轻巧地、毫秒级别地启动,和 K8S 的技术栈很接近,基于 Nginx 和 etcd 来实现。

Apache APISIX 集成了控制面板和数据面,与其他 API 网关相比,Apache APISIX 的上游、路由、插件全是动态的,修改这些东西时都不用重启。并且 Apache APISIX 的插件也是热加载,可以随时插拔、修改插件。

Apache APISIX 今年快速地成长,从 6 月 6 日开源,7 月被纳入 CNCF 全景图,8 月迎来首家付费央企,9 月份贝壳找房上生产环境,每日处理近 5 亿流量。10 月进入 Apache 孵化器,是国内唯一由初创公司贡献的项目,11 月全面支持 ARM64 平台,并推出 apisix-ingress-controller,拥有动态路由的能力,解决了官方 K8S 的一些痛点。

上图是目前 Apache APISIX 的部分用户,NASA(美国的航空航天局)也在使用 Apache APISIX,而且是在一个很重要的地方——火箭推进实验室,包括探月项目、火星探测的项目都是在这个实验室做的,他们使用 Apache APISIX 去处理微服务之间和南北向之间的流量。

Apache APISIX 的功能和作用

API 网关的传统功能包括反向代理、负载均衡、动态 SSL 证书、动态限流限速、主动/被动健康检查、服务熔断等功能,这些功能 Nginx 也同样具备。

在云原生的架构下,会衍生出很多新的功能需求:

  • 对接更多的监控和链路追踪,希望 API 和微服务之间的流量做到可视化,如 Prometheus、Zipkin、Skywalking

  • gRPC 代理和协议转换(REST <=> gRPC)、websocket

  • 身份认证:OpenID Relying Party、OP(Auth0、okta…)

  • Serverless

  • 高性能、无状态、随意扩容和缩容

  • 支持多云、混合云

  • 容器优先,Kubernetes 友好

性能上,Apache APISIX 比空转的 OpenResty 性能只低了 15%,在我们下一个商业版本里,即使有插件的逻辑存在,也会保持和 OpenResty 空转的性能相同,这里有我们的一些黑科技在里面。

Apache APISIX 能够帮助用户处理 L4、L7 层流量:HTTP、HTTPS、TCP、UDP、MQTT、Dubbo、gRPC、TLS…如果用户有自定义的 4 层RPC 协议也可以实现。

Apache APISIX 可以替代 Nginx,把它从一个静态的配置文件管理的服务器变成一个纯动态的 API 控制的 Web 服务器。也可以用 Apache APISIX 替代 Envoy 处理服务间的东西向的流量,它会更加高效且稳定。

此外,你也可以把 Apache APISIX 作为 k8s ingress controller ;基于灵活的插件,提供了 MQTT 的插件可以作为 IoT 网关,借助 IdP 插件成为零信任网关。我们希望 Apache APISIX 能够快速处理所有业务的流量。

微服务演进史

我们先来回顾微服务的演进史,回顾历史才能更好地知道未来做什么。

  • 从单体到微服务

如上图,这其实是一个单体,下面有 3 个服务,3 个服务分别做了 3 件不同的事,但它们里面有很多重复的功能,比如限流限速、身份认证等,是每个接口都要做的。每个 API 做了很多与业务不关但是又不得不做的事情。这种模式的痛点是做了大量的重复开发,如果在容器里面跑,不仅重,修改起来也麻烦,并且一旦把限流限速的逻辑修改了,那么每个服务都要修改。

API 网关的作用就是把业务无关的功能剥离出来,让你的 API 只关心业务本身,与业务无关的功能全都丢给 API 网关,包括协议的转换、限流限速、安全、统计、可追踪、缓存、日志报表等。如此,业务才能跑得更快,这就是为什么微服务会从单体变成 API 网关的架构。

  • 微服务从类库到 proxy

很多 Java 工程师微服务架构会选择 Spring Cloud 或者 Dubbo, 这种是语言绑定的,它用类库的方式放在代码里,升级困难,如果团队是多语言就需要维护多个类库,假设你有 10 个版本,10 个语言,就需要维护 100 个类库。

这里可以使用 proxy 的方式来解决,即 API 网关,它用代理的方式把多版本和多语言的问题解决了。

  • 微服务从 proxy 到 sidecar

很多 proxy 都是基于 Nginx 来实现的,众所周知 Nginx 所有的功能都是根据配置文件实现的,因此 proxy 存在路由、上游、证书等不能动态的痛点。在 K8S 体系下,上游与证书经常会发生变化,如果使用 Nginx 来处理就需要频繁重启服务,因此我们就抛弃了 proxy 的方式,转而采用 sidecar 的模式,即 Service Mesh。

服务对 Sidecar 是无感知的,进来的流量和出去的流量都会被边车劫持。API 网关做的与业务无关的功能,都在边车里面来实现。简单地来说,把 API 网关打横了,其实就变成了边车,功能基本相同,区别就在于一个是处理南北向流量,一个处理东西向流量,

  • 从 sidecar 到 Service Mesh

如果只是简单的边车,它还不够通用,并且抽象的层次也不足,因此有了 Service Mesh 想作为基础设施下沉到每个服务旁边。在此之前,边车其实是可选的,但是在 Service Mesh 里边车是一个必选项,Istio 和 Envoy 一个做控制面,一个做数据面,挂在每个服务旁边。

但是这种方式也是存在问题的,每个微服务都要带 sidecar,如果做多次流量转发,性能是有问题的,Istio 和 Envoy 经常会被大家吐槽性能的问题和稳定性。

下一代微服务

我认为 sidecar 的模式到最后也会消失,它会变成一个可选项,而非在 ServiceMesh 里的必选项。我们希望通过 Apache APISIX 把 sidecar 从微服务的边车模式抽取出来,用户可以部署一个或多个 APISIX,可以和微服务部署在同一台机器上,也可以分开部署,走向中心节点或者集群的模式。我们认为下一代的网关可以替代掉 Service Mesh,因为大家解决用户的问题是一样的,包括服务治理、流量管理、及时动态感知变化等。

Apache APISIX 能够做到全动态、全协议支持、高性能、云原生友好。我们希望 Apache APISIX 不仅能把 Nginx 的南北向流量吃掉,同时把微服务东西向的流量吃掉,我们也希望 Apache APISIX 不仅能做 API 网关,也能做 k8s ingress controller,更可以在 Service Mesh 里做流量管理的控制。

推荐阅读

从 0 到 1:Apache APISIX 的 Apache 之路

说说 WebSocket,3 分钟让你全面认识它

基于 Apache APISIX 的下一代微服务架构的更多相关文章

  1. 基于Golang设计一套微服务架构[转]

      article- @嘟嘟噜- May/26/2018 18:35:30 如何基于Golang设计一套微服务架构 微服务(Microservices),这个近几年我们经常听到.那么现在市面上的的微服 ...

  2. 唯品会的Service Mesh三年进化史 2018 年 Service Mesh 元年,被誉为是下一代微服务架构

    2018 年 Service Mesh 元年,被誉为是下一代微服务架构 https://www.sohu.com/a/225324586_465914 唯品会的Service Mesh三年进化史 - ...

  3. 基于 Spring Cloud 完整的微服务架构实战

    本项目是一个基于 Spring Boot.Spring Cloud.Spring Oauth2 和 Spring Cloud Netflix 等框架构建的微服务项目. @作者:Sheldon地址:ht ...

  4. 基于 Docker 的微服务架构实践

    本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...

  5. 几种常见的微服务架构方案简述——ZeroC IceGrid、Spring Cloud、基于消息队列

    微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合 ...

  6. 几种常见的微服务架构方案——ZeroC IceGrid、Spring Cloud、基于消息队列、Docker Swarm

    微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合 ...

  7. 面试都在问的微服务、服务治理、RPC、下一代微服务框架... 一文带你彻底搞懂!

    文章每周持续更新,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 单体式应用程序 与微服务相对的另一个概念是传统的单体式应用程序( ...

  8. 面试都在问的「微服务」「RPC」「服务治理」「下一代微服务」一文带你彻底搞懂!

    ❝ 文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) ❞ 单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程 ...

  9. 庐山真面目之三微服务架构Consul版本实现

    庐山真面目之三微服务架构Consul版本实现 一.简介           在上一篇文章<庐山真面目之二微服务架构NGINX版本实现>中,我们已经探讨了如何搭建基于Nginx 网关的微服务 ...

随机推荐

  1. HZOJ Dash Speed

    测试点1-2:暴力. 测试点3-4:可以将边按r从大到小排序不断加入,然后用并茶几维护深度.好像也可以用猫树做. 好吧其他的部分分并没有看懂. 正解: 线段树分治,求出每个速度的答案. 对于速度区间$ ...

  2. PHP判断图片格式的七种方法小结

    <?php $imgurl = "http://www.jb51.net/images/logo.gif"; //方法1 echo $ext = strrchr($imgur ...

  3. 前端基础☞CSS

    css的四种引入方式 1.行内式 行内式是在标记的style属性中设定CSS样式.这种方式没有体现出CSS的优势,不推荐使用. <p style="background-color: ...

  4. 在WPF中使用谷歌地图和高德地图

    原文:在WPF中使用谷歌地图和高德地图 在桌面软件开发中可能会遇到这样的需求:显示地图. 常用的地图API有Google Map和高德地图.二者都提供了各种平台的API. 为了方便集成,本文使用Jav ...

  5. POJ-3159_Candies

    Candies Time Limit: 1500MS Memory Limit: 131072K Description During the kindergarten days, flymouse ...

  6. Java8 Date与LocalDate互转

    Java8 日期时间API,新增了LocalDate.LocalDateTime.LocalTime等线程安全类,接下来要说的是LocalDate与java.util.Date之间的转换. 1.Loc ...

  7. oracle函数 userenv(parameter)

    [功能]返回当前会话上下文属性. [参数]Parameter是参数,可以用以下参数代替: Isdba:若用户具有dba权限,则返回true,否则返回false. Language:返回当前会话对应的语 ...

  8. Vue点击事件失效

    在做项目时给button添加click事件,发现没反应,但另外写了一个button添加同样的事件,却能触发.原因是使用了better-scroll,默认它会阻止touch事件.所以在配置中需要加上cl ...

  9. 小程序中使用threejs

    webgl调试 起初使用threejs 在小程序里面调试,明明是按着官方的文档来,但是会发现开发者工具上面会提示getContext,经过一翻摸索,发现webgl调试只能在手机端调试. 总结:webg ...

  10. js实现圆形的碰撞检测

    文章地址:https://www.cnblogs.com/sandraryan/ 碰撞检测这个东西写小游戏挺有用der~~~ 注释写的还挺全,所以就不多说了,看注释 这是页面结构.wrap存放生成的小 ...