单独安装access_微服务之Kong网关(安装部署篇)

Kong

Kong是一个在 Nginx 中运行的Lua应用程序,并且可以通过lua-nginx模块实现,Kong不是用这个模块编译Nginx,而是与 OpenResty 一起发布,OpenResty已经包含了 lua-nginx-module, OpenResty 不是 Nginx 的分支,而是一组扩展其功能的模块。

它的核心是实现数据库抽象,路由和插件管理,插件可以存在于单独的代码库中,并且可以在几行代码中注入到请求生命周期的任何位置。

Traefik

Traefik 是一个现代 HTTP 反向代理和负载均衡器,可以轻松部署微服务,Traeffik 可以与您现有的组件(Docker、Swarm,Kubernetes,Marathon,Consul,Etcd,…)集成,并自动动态配置。

Ambassador

Ambassador 是一个开源的微服务 API 网关,建立在 Envoy 代理之上,为用户的多个团队快速发布,监控和更新提供支持,支持处理 Kubernetes ingress controller 和负载均衡等功能,可以与 Istio 无缝集成。

Tyk

Tyk是一个开源的、轻量级的、快速可伸缩的 API 网关,支持配额和速度限制,支持认证和数据分析,支持多用户多组织,提供全 RESTful API。基于 go 编写。

Zuul

Zuul 是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器。

单独安装access_微服务之Kong网关(安装部署篇)_第1张图片
单独安装access_微服务之Kong网关(安装部署篇)_第2张图片
单独安装access_微服务之Kong网关(安装部署篇)_第3张图片

从开源社区活跃度来看,无疑是Kong和Traefik较好;从成熟度来看,较好的是Kong、Tyk、Traefik;从性能角度来看,Kong要比其他几个领先一些;从架构优势的扩展性来看,Kong、Tyk有丰富的插件,Ambassador也有插件但不多,而Zuul是完全需要自研,但Zuul由于与Spring Cloud深度集成,使用度也很高,近年来Istio服务网格的流行,Ambassador因为能够和Istio无缝集成也是相当大的优势。

因需要实现服务限流、熔断、认证等功能,并且对原有系统尽量减少侵入性,结合当前系统情况,选择Kong作为网关实现方案,以下是本次测试的整个过程:

  • Kong网关部署:

使用阿里云服务器,Docker形式部署

1.使用docker创建网络和数据卷

docker network create kong-netdocker volume create kong_data

2.创建 pg 数据库docker容器

docker run -d --name kong-database --network=kong-net -p 5432:5432 -e "POSTGRES_USER=kong" -e "POSTGRES_PASSWORD=kong@8888" -e "POSTGRES_DB=kong" -v kong_data:/var/lib/postgresql/data postgres:9.6

3.kong 数据迁移到 pg

docker run --rm --network=kong-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_PG_PASSWORD=kong@8888" -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" kong:latest kong migrations bootstrap

4.创建 kong 容器并启动 此处修改了默认端口(8000->28000)

docker run -d --name kong --network=kong-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_PG_PASSWORD=kong@8888" -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" -e "KONG_PROXY_ERROR_LOG=/dev/stderr" -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" -p 28000:8000 -p 28443:8443 -p 28001:8001 -p 28444:8444 kong:latest

5.kong GUI 之konga安装 此处修改了默认端口(1337 ->21337 )

docker run --rm pantsel/konga:latest -c prepare -a postgres -u postgresql://kong:kong@[email protected]:5432/kong
docker run -p 21337:1337  --name konga -e "TOKEN_SECRET=jiangkun" -e "DB_ADAPTER=postgres" -e "DB_HOST=39.97.254.143" -e "DB_PORT=5432" -e "DB_USER=kong" -e "DB_PASSWORD=kong@8888" -e "DB_DATABASE=kong" -e "NODE_ENV=production" pantsel/konga

docker运行截图:

dbdeb81cbd2004bac05a3903b49efa34.png

kong admin访问地址:

http://39.97.254.143:28001/

访问后会返回json数据

单独安装access_微服务之Kong网关(安装部署篇)_第4张图片

konga控制台访问地址:

http://39.97.254.143:21337/ 进入后先注册admin账号后并登录

再次访问可以看到登录页面

单独安装access_微服务之Kong网关(安装部署篇)_第5张图片

此处注册的管理员账号为admin=admin123,暂时不具备部署条件的同学可以使用本服务器做验证,但是尽量验证完成后删除自己配置的内容,不去修改他人的配置。到这里部署过程就完成了。

  • 测试程序开发

为了测试网关功能,使用SpringBoot开发了一个接口用作测试。

package com.example.demo;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import java.text.SimpleDateFormat;import java.util.Date;/** * @author jiangkun * @description 网关测试类 * @date 2020/11/3 */@Controller@RequestMapping(value = "kong")public class KongController {    @ResponseBody    @RequestMapping(value = "test")    public String Test() {        String time = new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(new Date());        return "hello from KongController---Test---"+time;    }}

这里接口仅返回了hello...+当前时间(精确到毫秒级),便于测试每秒返回的情况。

接口写好后打包部署,这里为了方便测试,直接将jar包在阿里云服务器上运行起来

nohup java -jar demo-0.0.1-SNAPSHOT.jar > log.txt 2>&1 &

这样就算关掉终端页面,程序运行不受影响。

如果需要停止应用程序,则需要先查看java程序占用了哪些进程,再将进程杀死

ps -aux |grep java

因为知道本应用运行的端口,也可以通过端口去找进程号,再将进程杀死

netstat -anlp | grep java

应用服务部署完成后,测试运行情况直接访问http://39.97.254.143:8999/kong/test观察返回即可,在浏览器访问后正确情况下返回:

hello from KongController---Test---2020/11/05-00:33:28:189
  • 网关策略配置

目前,KONG开源版本一共开放28个插件,如下:

acl、aws-lambda、basic-auth、bot-detection、correlation-id、cors、datadog、file-log、galileo、hmac-auth、http-log、ip-restriction、jwt、key-auth、ldap-auth、loggly、oauth2、rate-limiting、request-size-limiting、request-termination、request-transformer、response-ratelimiting、response-transformer、runscope、statsd、syslog、tcp-log、udp-log。

以上这些插件主要分五大类,Authentication认证,Security安全,Traffic Control流量控制,Analytics & Monitoring分析&监控,Logging日志,其他还有请求报文处理类。插件类似AOP开发中的横切功能,可以灵活的配置进行拦截控制,下面选择一些关键性的插件进行简单的说明。

限流插件 rate-limiting

Kong当前提供的限流相对来说还是比较弱,即主要是控制某一个API接口服务在单位时间内最多只能够调用多少次,如果超过这个次数那么网关就直接拒绝访问并返回错误提示信息。

熔断插件 request-termination

该插件用来定义指定请求或服务不进行上层服务,而直接返回指定的内容.用来为指定的请求或指定的服务进行熔断。注意Kong的熔断插件感觉是临时对服务的禁用,而不是说当达到某一种监控阈值的时候自动触发熔断,或者相关内容还没有了解到。从官方文档的应用场景也可以看到这点。

Temporarily disable a Service (e.g. it is under maintenance).

Temporarily disable a Route (e.g. the rest of the Service is up and running, but a particular endpoint must be disabled).

Temporarily disable a Consumer (e.g. excessive consumption).

如果仅仅是这种方式的熔断话,实际上意义并不是很大。但是可用的地方就在于当某个业务系统进行发版部署的时候我们可以对该业务系统或该业务系统所提供的所有服务进行熔断。

安全认证类插件

当前Kong网关提供basic-auth,key-auth、ldap-auth,hmac-auth多种认证插件。

以上三类插件为本次开发验证的主要内容。


未完待续...

你可能感兴趣的:(单独安装access)