Kong Api Gateway 简介
一、为什么要用API网关?
API网关 = 路由转发 + 过滤器
1、路由转发:接收一切外界请求,转发到后端的微服务上去;
2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。
如上图,这其实是一个单体,下面有 3 个服务,3 个服务分别做了 3 件不同的事,但它们里面有很多重复的功能,比如限流限速、身份认证等,是每个接口都要做的。每个 API 做了很多与业务不关但是又不得不做的事情。这种模式的痛点是做了大量的重复开发,如果在容器里面跑,不仅重,修改起来也麻烦,并且一旦把限流限速的逻辑修改了,那么每个服务都要修改。
API 网关的作用就是把业务无关的功能剥离出来,让你的 API 只关心业务本身,与业务无关的功能全都丢给 API 网关,包括协议的转换、限流限速、安全、统计、可追踪、缓存、日志报表等。如此,业务才能跑得更快,这就是为什么微服务会从单体变成 API 网关的架构。
优点:
- 在前端和后端服务之间提供松耦合,降低前端复杂度
- 减少客户端和微服务之间的调用次数。
- 通过 SSL 终端、身份验证和授权实现高安全性。
- 集中管理的横切关注点,公共服务,例如,日志记录和监视、节流、负载平衡。
由于每个服务引入了这个公共服务,那么相当于在每个服务中都引入了相同的权限校验的代码,使得每个服务的jar包大小无故增加了一些,尤其是对于使用docker镜像进行部署的场景,jar越小越好;
由于每个服务都引入了这个公共服务,那么我们后续升级这个服务可能就比较困难,而且公共服务的功能越多,升级就越难,而且假设我们改变了公共服务中的权限校验的方式,想让所有的服务都去使用新的权限校验方式,我们就需要将之前所有的服务都重新引包,编译部署。
缺点
- 可能导致微服务架构中的单点故障。
- 额外的网络调用带来的延迟增加。
- 如果不进行扩展,它们很容易成为整个企业应用的瓶颈。
- 额外的维护和开发费用。
网关应具备以下功能
- 性能:API高可用,负载均衡,容错机制。
- 安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
- 日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
- 缓存:数据缓存。
- 监控:记录请求响应数据,api耗时分析,性能监控。
- 限流:流量控制,错峰流控,可以定义多种限流规则。
- 灰度:线上灰度部署,可以减小风险。
- 路由:动态路由规则。
1、优点
- 与微服务进行松散解耦,将鉴权功能做在网关层
- 业务服务的扩缩灵活度高,支持快速业务整合。因为它可以通过RESTFul API配置网关代理,也支持可视化操作,更适合RD。将微服务的扩缩闭环在RD内部,不需要麻烦SRE修改Nginx配置项,缩短工作流程,节省沟通成本。
- 开发维护成本低,kong、konga可以下载docker镜像在mice上部署,关联的2个mysql数据库向DBA提工单创建。
- kong的底层是Nginx + Openresty,代理性能损耗低。kong本身做代理、负载均衡,一般不会进行二次开发,kong的功能扩展通过插件实现。kong本身支持service、route、global级别的插件配置,kong自带插件支持Auth鉴权、Acl流量控制、性能分析、日志、修改请求体,同时也支持加载自定义开发插件。
- 开发kong插件,仅需要了解一些lua语法。
2、缺点
- 需要维护一个项目,基础服务负责
二、kong网关性能怎么样?
性能测试,压力测试,手动实现
一、什么是Kong Api Gateway
基于Nginx + Openresty Api 网关
优势:
- 用RESTful风格api配置Nginx
- 搭配可视化操作界面konga:konga-ui-cl62726.staging.ingress.mice.cc.d.xiaomi.net/#!/dashboar…
- 可开发插件,灵活。目前支持midun-proxy(米盾鉴权)、business-auth(通用后台业务鉴权)、replace-uri(uri部分替换)。后面可考虑加入日志、飞书报警等
kong支持哪些插件?
- Authentication 身份认证插件:Kong 提供了 Basic Authentication、Key authentication、OAuth2.0 authentication、HMAC authentication、JWT、LDAP authentication 等等实现。
- Security 安全控制插件:ACL(访问控制)、CORS(跨域资源共享)、动态SSL、IP 限制、爬虫检测等等实现。
- Traffic Control 流量控制插件:请求限流(基于请求计数限流)、上游响应限流(根据 upstream 响应计数限流)、请求大小限制等等实现。限流支持本地、Redis 和集群三种限流模式。
- Analytics & Monitoring 分析监控插件:对接 Datadog、Prometheus、Zipkin 等等监控系统的实现。
- Transformations 协议转换插件:请求转换(在转发到 upstream 之前修改请求)、响应转换(在 upstream 响应返回给客户端之前修改响应)。
- Logging 日志应用插件:支持 TCP、UDP、HTTP、File、Syslog、StatsD、Loggly 等等方式传输日志。
- Serverless 插件:提供对 AWS Lambda、Azure Functions、Apache OpenWhisk、Kong 自带 Serverless Functions 等等的 Serverless 解决方案的支持。
- Deployment 插件
三、kong怎么用?(kong的优缺点)
konga-ui-cl62726.staging.ingress.mice.cc.d.xiaomi.net/#!/dashboar…
操作指南
1、接口转发配置步骤
- 添加Service,配置Host(如本机IP,port 7001)、Name,其他可不填。
- 在Service页面添加Routes。配置Name、Paths(如/local-test)(敲回车录入),其他可不填。Hosts如果是https协议的需要上传证书,一般Hosts用不到。
- 测试接口是否转发成功。10.46.207.50:8000是网关服务地址
yaodi@yaodideMacBook-Pro kong $ http http://10.46.207.50:8000/local-test
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 12
Content-Type: text/plain; charset=utf-8
Date: Tue, 16 Mar 2021 09:32:30 GMT
Via: kong/1.0.0
X-Kong-Proxy-Latency: 27
X-Kong-Upstream-Latency: 76
set-cookie: csrfToken=DztVbWDT3Qqq8euf_f7yyQs7; path=/
x-content-type-options: nosniff
x-download-options: noopen
x-frame-options: SAMEORIGIN
x-readtime: 1
x-xss-protection: 1; mode=block
Hi,egg
2、负载均衡(暂不需要)
- 添加UPSTRAMS,相当于Nginx里的upstreams
- 添加targets,即 upstream里的 service,可设置权重
- 添加services,host填写第一步的upstream name。
- 添加service的routes信息
- 验证
3、插件(支持业务鉴权、米盾鉴权、uri替换)
插件的enable、disable按钮有bug,操作不生效。
- replace-uri插件功能是对uri部分进行替换,如
/panel/(.*)--->/$1。用的也是正则匹配,注意lua正则表达式和Nginx的正则不同,%后面的字符将转义 - business-auth插件功能是对userCode和path进行业务权限校验,主要是针对通用后台用户权限管理。需要提供权限校验接口
- midun-proxy插件功能是对添加米盾的域名进行RSA验密,解密,并将解密出来的userCode添加到request.headers的x-user-code里。x-user-code可自定义。
四、kong开发成本如何?
- kong + konga + psql + mice
- kong + mysql
- kong + dbless
kong、konga相关技术文档
二、Todos
1、日志收集
2、飞书告警