花椒直播 Kong 应用实践

标签: 花椒 直播 kong | 发表时间:2020-02-26 00:10 | 作者:玻璃樽
出处:http://weekly.dockone.io

什么是 Kong

Kong 是面向现代架构(混合云,混合组织)的下一代 API 网关平台,具有云原生、高性能,易用、可扩展等特性。

适用于 API Gateway,Kubernetes Ingress,Service Mesh Sidecar 等场景。

主要特性有:
  • 云原生:与平台无关,Kong 可以从裸机运行到 Kubernetes
  • 高性能:背靠非阻塞通信的 Nginx,性能自不用说
  • 插件机制:提供众多开箱即用的插件,且有易于扩展的自定义插件接口,用户可以使用 Lua 自行开发插件
  • 熔断:可以通过插件实现熔断,避免系统雪崩
  • 日志:可以记录通过 Kong 的 HTTP,TCP,UDP 请求和响应
  • 鉴权:权限控制,IP 黑白名单,同样是 OpenResty 的特性
  • SSL:Setup a Specific SSL Certificate for an underlying service or API
  • 监控:Kong 提供了实时监控插件
  • 认证:如数支持 HMAC,JWT,Basic,OAuth 2.0 等常用协议
  • 限流:可以通过插件实现单个服务某些接口的限流,避免服务过载导致不可用
  • REST API:通过 REST API 进行配置管理,从繁琐的配置文件中解放
  • 健康检查:自动检查,被动检查;节点不可用同步到所有的 Kong 节点需要 1 - 2 秒
  • 动态路由:Kong 的背后是 OpenResty + Lua,所以从 OpenResty 继承了动态路由的特性


为什么使用Kong?

目前我们需要解决的问题:
  • 统一入口:服务端微服务框架中,接口权限验证,IP 限制,限流等在各个服务中都单独实现。没有统一入口,不方便统一管理。
  • 易用性,扩展性:服务端技术栈主要是LNMP开发,目前在逐步转型到基于Spring Boot、Spring Clound 微服务技术栈上开发。这是一个灰度迁移的过程,我们需要Proxy能操作简单,管理方便。
  • 持续集成发布:互联网 2C 产品,用户无时不刻不在使用服务,同时产品还在不断的迭代,服务每时每刻都可以发布,所以必须要热部署能力,并且是自动化的。但是基于Spring Boot的服务启动 15 -30 秒,我们需要 Kong 的蓝绿发布功能。


Kong 可以完美的解决以上问题,解决方案如下:

1、统一入口:可以作为微服务统一入口,将限流,权限验证,日志,IP 限制等统一实现。

2、易用性,扩展性:提供了 Restful 操作方式,并且有 Dashboard 管理工具。
# 创建一个名称 hello 的 upstream  
curl -X POST http://localhost:8001/upstreams --data "name=hello"

# 为 hello 添加两个负载均衡节点
curl -X POST http://localhost:8001/upstreams/hello/targets --data "target=localhost:8080" --data "weight=100"

curl -X POST http://localhost:8001/upstreams/hello/targets --data "target=localhost:8081" --data "weight=100"

# 配置一个service
curl -X POST http://localhost:8001/services --data "name=hello" --data "host=hello"

# 为service 配置路由
curl -X POST http://localhost:8001/routes --data "paths[]=/hello" --data "service.id={$service.id 配置上面service返回的}"

Dashboard工具截图:

3、持续集成发布:与 GitLab CI/CD 配合,代码提交代码库后,自动打包,运行测试用例,蓝绿部署。

我们如何使用Kong

当前使用 Kong 架构图:

Kong集群

1、所有节点连接到数据中心。
  • 使用 PostgreSQL 主从机制,保证数据库高可用,注意使用 9.6 以上版本。


2、所有节点将周期性执行任务,同步数据最终一致。
  • 配置选项:db_update_frequency(默认:5 秒)
  • 每 db_update_frequency 秒,所有节点将从数据库中拉取所有更新,如果有同步到更新变化,将清理本地相关缓存。
  • 如果 PostgreSQL 数据库异常,节点使用原有数据还可以提供服务。


3、节点有本地缓存,可以设置缓存过期时间。
  • 配置选项:db_cache_ttl (default: 0s)
  • 当数据中心异常,依赖本地缓存依旧可以提供服务


4、支持动态扩容,参考上方架构图,Kong 集群在 LVS 后面。
  • 新增节点,同步其他节点配置后,验证正常,加到到Lvs的RS里即可,就提供服务了
  • 删除节点,直接将 LVS 的 RS 删除即可,他就不提供服务了
  • 修改节点配置,先从 LVS 后摘除kong RS,修改完成后重启,验证正常,放回到 LVS 的 RS 里面


5、支持 gRPC。
# /etc/kong/kong.conf  
proxy_listen = 0.0.0.0:8000, 0.0.0.0:8443 ssl, 0.0.0.0:9080 http2

6、服务监控。
  • 使用Prometheus,Grafana 和 Kong 天然配合


注意事项:
  1. Kong/Templates/nginx_kong.lua 模板文件统一
  2. 对于 Kong 日志要做好切割,我们使用 Logrotate


Kong插件

Kong 的插件功能很多其内置了很多包括认证,限流,日志等相关插件,当然也可以自定义插件,加载成功后就可以在这个界面进行添加使用。

不同的插件有不同的参数,需要进行设定,设定完成后就会启用。

例如:这是内置的 key-auth 插件,作用是进行 API 认证,设定 key 之后只有认证通过的才能访问。

自定义开发和部署,根据业务需要开发插件。

基本流程:

1、下载模板

base简单版:
simple-plugin  
├── handler.lua
└── schema.lua

advanced高级版:
complete-plugin  
├── api.lua
├── daos.lua
├── handler.lua
├── migrations
│   ├── cassandra.lua
│   └── postgres.lua
└── schema.lua

必要文件就是 handler.lua 和 schema.lua。

2、修改 handler.lua 文件,有很多函数,自定义逻辑就是在这些函数中写 Kong 会在一些特定阶段调用对应的函数。
local BasePlugin = require "kong.plugins.base_plugin"  

-- The actual logic is implemented in those modules
local access = require "kong.plugins.my-custom-plugin.access"
local body_filter = require "kong.plugins.my-custom-plugin.body_filter"

local CustomHandler = BasePlugin:extend()

function CustomHandler:new()
CustomHandler.super.new(self, "my-custom-plugin")
end

function CustomHandler:access(config)
CustomHandler.super.access(self)

-- Execute any function from the module loaded in `access`,
-- for example, `execute()` and passing it the plugin's configuration.
access.execute(config)
end

function CustomHandler:body_filter(config)
CustomHandler.super.body_filter(self)

-- Execute any function from the module loaded in `body_filter`,
-- for example, `execute()` and passing it the plugin's configuration.
body_filter.execute(config)
end

return CustomHandler

3、修改 schema.lua 文件,主要是配置一些参数,以及参数检查。
return {  
no_consumer = true, -- this plugin will only be applied to Services or Routes,
fields = {
    -- Describe your plugin's configuration's schema here.
},
self_check = function(schema, plugin_t, dao, is_updating)
    -- perform any custom verification
    return true
end


4、配置部署。

插件文件在:
/data/kong/plugins/simple-plugin/  

则配置 kong.conf:
lua_package_path = /data/?.lua;($default);  
plugins = bundled,simple-plugin

然后重新 reload kong,如果 Lua 插件没有错误,就可以在后台看到加载出来了。

线上碰到问题

1、返回的内容太大,需要加大 buffer(upstream response cache error) 修改配置:
nginx_proxy_proxy_buffer_size=128k  
nginx_proxy_proxy_buffers=4 256k
nginx_proxy_proxy_busy_buffers_size=256k

2、需要注意配置属性

strip_path 属性:
如果设置为 true, paths 设置有值,那么请求将会被替换掉  
{ "paths": ["/service"], "strip_path": true, "service": { "id": "..." }}
请求:GET /service/path/to/resource HTTP/1.1Host: …
Proxy: GET /path/to/resource HTTP/1.1

{ "paths": ["/version/\d+/service"], "strip_path": true, "service": { "id": "..." }}
请求:GET /version/1/service/path/to/resource HTTP/1.1
Proxy: GET /path/to/resource HTTP/1.1

preserve_host 属性:
如果设置为 true,代理后仍然保留 header 请求 host  
请求:GET / HTTP/1.1Host: service.com
Proxy: GET / HTTP/1.1Host: service.com

设置为false,将不保留header host
GET / HTTP/1.1Host: service.com
GET / HTTP/1.1Host: 

总结

Kong 是行业内较为成熟的网关开源产品,无论是性能,易用,扩展方面都表现不错。

Kong 就是服务治理的翅膀,可以更优雅,更便捷,更智能的实现服务降级,熔断,流量调度等工作。

让我们在自建 Kunernetes 私有云,Hulk云,阿里云等复杂的架构中任意翱翔。

原文链接: https://mp.weixin.qq.com/s/o4NqA-zsgRPco4hop6Q4hQ

相关 [花椒 直播 kong] 推荐:

花椒直播 Kong 应用实践

- - DockOne.io
Kong 是面向现代架构(混合云,混合组织)的下一代 API 网关平台,具有云原生、高性能,易用、可扩展等特性. 适用于 API Gateway,Kubernetes Ingress,Service Mesh Sidecar 等场景. 云原生:与平台无关,Kong 可以从裸机运行到 Kubernetes.

API 网关 Kong

- - IT瘾-tuicool
所谓网关,主要作用就是连接两个不同网络的设备,而今天所讲的 API 网关是指承接和分发客户端所有请求的网关层. 最初是单体服务时,客户端发起的所有请求都可以直接请求到该服务,但随着产品用户越来越多,单体应用存在显而易见的单点问题,除此之外,当单体应用大小升至几个 G 时,持续发布将会非常缓慢,所以服务的拆分成为了必然趋势.

深度学习在花椒直播的应用(Tensorflow 原理篇)

- - IT瘾-dev
殷雅俊,2018年北京邮电大学硕士毕业,自2017年下半年来一直在花椒实习,随后进入花椒直播智能工程组担任算法工程师,主要负责花椒直播个性化推荐算法研发,花椒图像识别算法研发等工作. 1.花椒直播的深度学习使用. 使用Spark进行数据清洗,构建用户画像和物品画像,挖掘数据特征,形成数据集存储在HDFS.

基于kong的微服务解决方案 | kong

- -
最近处理了几个客户的需求,需求有相似之处,解决方案迭代几次以后也具备了一定的复制性. 目前应用用springboot写的,以业务分块,大概形成了几十个(30+)部署单元;每个部署单元都是独立的jar,其中每个包含十个左右的endpoints. 目前用了eureka和zuul做服务注册/发现以及负载均衡;在整体部署规模超过200个jvm之后,出现了一些问题.

[travel]香港天際100之旅:W HOTEL HONG KONG

- C. - 太妃糖憂鬱狂歡節│Carol's Carnival
8月底時,有幸受邀與迴紋針老師、大方、Via、Venus以及KEN一起同遊香江,參觀目前香港最高的摩天大樓景觀台"天際100",關於天際100的參觀分享將會在下一篇文章中介紹,現在先來看看世界頗負盛名的高級時尚設計酒店W HOTEL HONG KONG吧. 亞洲的W Hotel目前共有6家,分別位於台北、首爾、香港、峇里島、蘇美島、馬爾地夫(後三者是渡假村),2012年~2014年之間,亞洲區預計將於各國陸續開幕數家W HOTEL,例如明年的廣州W、曼谷W、新加坡W等等.

基于Kong网关的管理平台Konga(9.9)

- - 人月神话的BLOG
在年中我们重新修订了ESB服务总线和API网关的产品规划后,初步决策还是基于Kong网关来定制开放API网关平台,对于Kong网关前面已经有文章做过介绍,下面再总结下Kong网关的一些关键特点. 1.可扩展性: 通过简单地添加更多的服务器,可以轻松地进行横向扩展,这意味着您的平台可以在一个较低负载的情况下处理任何请求;.

基于Kong和Kubernetes的Web API多版本解决方案

- - DockOne.io
今天分享一个我们正在使用的一个基于Kubernetes以及Kong网关的Web API多版本管理的解决方案,这种方案已经在我们的生产环境运行了将近两年,也迭代了很多个版本,我们觉得这个方案非常的适合用在微服务当中. 什么是Web API多版本. 版本的概念大家应该都知道,那么什么是Web API的版本呢.

Kong 开源的的服务网格Kuma爬过了K8S这座大山

- -
2019年9月10日,Kong正式宣布开源一款Service Mesh:Kuma. 此消息一出,立即在云原生社区引起反响,各大媒体争相报道. 让我们跟随SDxCentral的总编辑,一起来看看Kong的CTO如何介绍Kuma这款Service Mesh产品以及对于SMI的看法. 关于Kuma的具体功能介绍可以阅读官网博客以及Github.

现场直播

- 纸条 - 新闻跟帖局
核心提示:8月29日上午,福建气象台发布“沿海地区台风警报”与“台风黄色预警信号”称,台风“南玛都”可能于30日白天在福建省中南部沿海登陆. 受台风影响,福建自29日起3日内多地将有大雨到暴雨. [查看原文]好友向您推荐这条跟贴. 网易福建省泉州市网友 [小小小书童] 的原贴:1. 你好,主持人,我现在在泉州惠安西沙湾,现在风力非常大,屁股对准海边保你菊花都被吹开,现场的情况就是这样,现在把画面交给演播室.

有花椒鸡的望京一号

- Ray - 槽边往事
望京一号貌似高端饭馆,其实不过是“大望京村一号”这个地址的缩略语. 地点诡异,不通公交车,散场出来无出租车,所以只适合自驾一族. 出五环,奔京顺路,第一个红绿灯口掉头回来,过一大桥,再往前开50米. 右转有两岔路口,左手一条上五环,顺右手一条前行100米,是一个路边停满车辆小坡. 小坡中间右手,四合院小门,对联斑驳,油漆剥落,那就是正地方.