软件架构
Apache APISIX是一个动态、实时、高性能的云原生API网关。它构建于NGINX+ngx_lua的技术基础之上,充分利用了LuaJIT所提供的强大性能。
APISIX主要分为两个部分:
- APISIX核心:包括Lua插件、多语言插件运行时(Plugin Runner)、Wasm插件运行时等;
- 功能丰富的各种内置插件:包括可观测性、安全、流量控制等。
APISIX在其核心中,提供了路由匹配、负载均衡、服务发现、API管理等重要功能,以及配置管理等基础性模块。除此之外,APISIX插件运行时也包含其中,提供原生Lua插件的运行框架和多语言插件的运行框架,以及实验性的Wasm插件运行时等。APISIX多语言插件运行时提供多种开发语言的支持,比如Golang、Java、Python、JS等。
APISIX目前也内置了各类插件,覆盖了API网关的各种领域,如认证鉴权、安全、可观测性、流量管理、多协议接入等。
插件加载流程
安装APISIX
在这里我采用docker的方式安装APISIX.
使用此方法安装APISIX,需要安装Docker和Docker Compose。
首先下载apisix-docker仓库,命令如下
git clone https://github.com/apache/apisix-docker.git
cd apisix-docker/example
然后,使用docker-compose
启用APISIX,命令为
docker-compose -p docker-apisix up -d
因为我们在安装APISIX时选择了Docker安装,那么etcd会自动安装。APISIX使用etcd作为配置中心进行保存和同步配置。
此时访问http://ip:9000可以访问APISIX的控制台,如图所示
输入账号admin,密码admin登录到apisix dashboard系统。
apisix dashboard介绍
上图是Dashboard平台的一个全景,它的功能简单紧凑,下面介绍每个菜单的功能;
- 仪表盘:监测网关请求数据、ETCD数据等,同时还支持自定义监控对象的数据;
- 路由:路由(Route)是请求的入口点,它定义了客户端请求与服务之间的匹配规则。路由可以与服务(Service)、上游(upstream)关联,一个服务可对应一组路由,一个路由可对应一个上游对象(一组后端服务节点),因此,每个匹配到路由的请求将被网关代理到路由绑定的上游服务中。
- 服务:服务由路由中公共的插件配置、上游目标信息组合而成。服务与路由、上游关联,一个服务可对应一组上游节点,可被多条路由绑定。
- 上游:上游列表包含了已经创建的上游服务(即后端服务),可以对上游服务的多个目标节点进行负载均衡和健康检查。
- 插件:APISIX内置了多个插件,在这里可以为路由配置相应的插件实现高级功能。
- 证书:证书被网关用于处理加密请求,它将与SNI关联,并与路由中主机名绑定。
配置路由
配置仪表板
首次配置Dashboard,第一次启动Dashboard仪表板为空,需要配置Grafana地址(http://127.0.0.1:3000)更改Dashboard,如果Dashboard地址改变了,系统设置中更改。
- 查看APISIX数据
- 配置路由
- 路由route:通过路由定义规则来匹配客户端请求,根据匹配结果加载并执行相应的插件,最后把 请求转发到指定的上游应用。
- 服务Service:是某类API的抽象(一组路由的抽象),通常与上游服务抽象是一一对应的,但与路由之间,通常是1:N的关系。
- 配置简单网关
项目资源
前端访问地址 | 后端服务访问地址 | 网关访问地址 |
---|---|---|
192.168.1.100 | 192.168.1.101:5000 | 192.168.1.102:9080 |
【配置上游】
在Dashboard首页点击 上游菜单,点击创建,打开上游配置页面
- 名称:通常是机房+服务器命名
- 目标节点:用户服务的地址和端口号
- 其他默认即可,点击下一步提交
【配置服务】
在Dashboard首页点击服务菜单,点击创建,打开服务配置页面 - 名称:通常以后端一个微服务为单位,一个微服务对应一个服务配置
- 上游节点:选择配置好的上游节点。
【配置路由】
在Dashboard首页点击路由菜单,点击创建,打开路由配置页面
名称:路由名称 - 标签:将一个服务下的多个路由分为一组,方便管理
- 绑定服务:选择上面创建的用户模块服务,路由:服务=N:1
- 路径:路由转发到服务的规则
当前面的网关都配置好了,在项目前端代码修改配置的axios请求后端地址,将它修改为请求网关地址192.168.1.102:9080
打开浏览器访问前端的项目,点击登录,此时前端将请求发送到网关192.168.1.102:9080,网关根据配置的路由规则讲请求转发到后端服务192.168.1.101:5000。
基本使用
已经启动了两个Nginx测试服务web1和web2,接下来我们将通过apisix的路由功能来访问他们。
1、首先我们需要创建上游(Upstream),上游相当于虚拟主机的概念,可以对真实的服务提供负载均衡的功能。
2、创建web1和 web2的上游,设置号名称、负载均衡算法和目标节点信息。
3、再创建web1的路由(Route),路由可以用于匹配客户端的请求,然后转发到上游。
4、接下来通过apisix网管下面访问web1和web2服务。
进阶使用
Apisix通过启用插件,可以实现一系列丰富的功能。
【身份认证】
使用JWT来进行身份认证是一种非常流行的方式,这种方式在apisix中也是支持的,可以通过启用jwt-auth插件来实现。
- 首先我们需要创建一个消费者对象(Consumer),创建成功后消费者列表显示如下:
- 之后在创建一个路由,路由访问路径匹配/auth/*,只需使用jwt-auth插件即可;
访问接口获取生成好的JWT Token,需要添加两个参数,key为JWT插件中配置的key,payload为JWT中存储的自定义负载数据,JWT Token生成地址:http://ip:9080/apisix/pligin/jwt/sign
-
不添加JWT Token访问路由接口,会返回401,接口地址:http://ip:9080/auth/
-
在请求头Authorization中添加JWT Token后即可正常访问
JAVA插件开发
通讯:apisix-java-plugin-runner和APISIX使用Unix Domain Socket进行进程间通信,因此需要部署在同一个实例中。
Apisix-java-plugin-runner由APISIX管理。APISIX在启动时启动apisix-java-plugin-runner,
创建Java插件项目
1、从github上获取demo(tzssangglass/java-plugin-runner-demo-1 (github.com))
2、改造demo
将java插件示例demo拉去下来之后,我妈找到 DemoFilter.java文件,在这个文件中可以修改过滤器的名称,为了方便测试,其它的文件暂时不需要修改。后期等过滤器调通后,可以在过滤器中编写代码来实现自己的业务需求。过滤器名称为AuthFilter,后面在apisix路由配置中
快速部署
1、重新制作apisix镜像
2、修改/apisix-docker/example/apisix_conf/config.yaml
3、修改/apisix-docker/example/docker-compose.yml
4、重新启动apisix网关
apisix网关路由配置插件
1、ext-plugin-pre-req
2、ext-plugin-post-resp
2.4.4验证java插件是否生效
发起apisix网关请求,请求匹配到具体的路由,路由中配置了拦截器,切换目录至/usr/local/apisix-docker/example/apisix_log,执行指令tail -200f error.log,查看是否打印插件中的日志信息,打印了代表插件执行成功。