目录
一、apisix介绍
1.1 apisix是什么
二、apisix特点
2.1 多平台支持
2.2 全动态能力
2.3 精细化路由
2.4 对运维友好
2.5 多语言支持
三、apisix优势
3.1 apisix生态全景图
3.2 apisix定位
3.3 apisix优点
3.4 与nginx对比
四、apisix应用场景
4.1 Load Balancer 和 API 网关
4.2 微服务网关
4.3 Kubernetes Ingress
4.4 服务网格
五、apisix架构解读
5.1 数据面
5.2 控制面
5.3 apisix的重要组件和概念
六、apisix安装
6.1 docker-compose 环境准备
6.1.1 下载docker-compose文件
6.1.2 添加可执行权限
6.1.3 检查版本
6.2 apisix安装步骤
6.2.1 获取安装包
6.2.2 解压安装包
6.2.3 启动容器
6.2.4 开启相关端口
6.2.5 WEB-UI访问控制台
七、apisix路由配置
7.1 Admin API 路由配置
7.1.1 Admin API 简介
7.1.2 Admin API Route使用
7.2 apisix与微服务整合
7.2.1 准备一个springboot工程
7.2.2 添加一个测试用的接口
7.2.3 打包并上传服务器
7.2.4 启动服务并测试接口
7.2.5 配置apisix
7.2.6 使用新的规则访问
7.2.7 负载均衡配置
八、apisix控制台dashboard使用
8.1 自定义路由配置
8.1.2 配置过程
8.1.3 测试验证
九、apisix整合nacos实现服务发现
9.1 部署nacos的server服务
9.2 搭建springboot工程,整合nacos
9.2.1 pom依赖
9.2.2 添加配置文件
9.2.3 添加测试接口
9.2.4 启动类
9.2.5 打包并上传服务器
9.2.6 启动服务
9.3 配置apisix路由规则
9.3.1 apisix配置nacos
9.3.2 dashboard配置路由规则
9.3.3 测试验证
十、写在结尾
Apache APISIX 是一个动态、实时、高性能的云原生 API 网关,提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。可以使用 Apache APISIX 处理传统的南北向流量,也可以处理服务间的东西向流量。同时,它也支持作为 k8s IngressController 来使用。官方文档:apisix文档
Apache APISIX 可以帮助企业快速、安全地处理 API 和微服务流量,比如限流认证、日志安全功能,以及支持丰富的自定义插件。目前也与很多开源项目如 Apache SkyWalking、Prometheus 等之类的组件进行了相关集成。
说到apisix,作为一款与云原生生态紧密结合的API网关,很难抛开nginx这个负载均衡组件,相比传统的负载均衡服务器,apisix也有自己的特性。
APISIX 提供了多平台解决方案,它不但支持裸机运行,也支持在 Kubernetes 中使用,还支持与 AWS Lambda、AzureFunction、Lua 函数和 Apache OpenWhisk 等云服务集成。
APISIX 支持热加载,这意味着你不需要重启服务就可以更新 APISIX 的配置。
APISIX 支持使用 NGINX 内置变量做为路由的匹配条件,你可以自定义匹配函数来过滤请求,匹配路由。
APISIX 支持与以下工具和平台集成:HashiCorp Vault、Zipkin、Apache SkyWalking、Consul、Nacos、Eureka。通过 APISIXDashboard,运维人员可以通过友好且直观的 UI 配置 APISIX。
APISIX 支持多种开发语言进行插件开发,开发人员可以选择擅长语言的 SDK 开发自定义插件。
从生态图不难看出,apisix依托云原生的优势,在整个生态体系下占据着非常重要的地位。
全流量网关(南北、东西)
结合apisix自身的特点以及生态全景,这里对apisix的突出优点做一个小结,以备后续架构技术选型参考:
1、摆脱了对数据库依赖;
2、云原生友好,与k8s生态关系密切;
3、支持多语言插件,不同插件之间也支持实时的动态编排;
4、支持集群管理和动态加载;
5、全流量网关(南北、东西);
6、多服务发现组件;
7、云与混合云场景探索;
1)上下游均支持 mTLS;
2)控制面与数据面架构完全分离;
3)加强安全管理;
4)集成更多云上标准;
可以这么讲,只要聊到网关基本上很难抛开nginx不谈,毕竟nginx经过这么多年的发展,可以说几乎是互联网公司的标配产品了。在单体服务时代,使用 NGINX 可以应对大多数的场景,而到了云原生时代,NGINX 因为其自身架构的原因则会出现两个问题:
在 Kubernetes 体系下,上游会经常发生变化,如果使用 NGINX 来处理就需要频繁重启服
务,这对于企业是不可接受的。
APISIX 的核心是高性能代理服务,自身不绑定任何环境属性。当它演变为Ingress、服务网格等产品时,都是外部服务与 APISIX 配合,变化的是外部程序而不是 APISIX 自身,下面将逐步为大家介绍 APISIX 是如何支持这些场景的。
首先是针对传统的 LB 和 API 网关场景,因为 APISIX 基于 NGINX + LuaJIT 实现,所以天然具备高性能、安全等特性,并且原生支持了动态 SSL 证书卸载、SSL 握手优化等功能,在负载均衡的服务能力上也更优秀。
从 NGINX 切换到APISIX 不仅性能不会下降,而且可以享受到动态、统一管理等特性带来的管理效率的提升。
APISIX 目前支持多种语言编写扩展插件,可以解决东西向微服务 API 网关面临的主要问题——异构多语言和通用问题。内置支持的服务注册中心有 Nacos、etcd、Eureka 等,还有标准的 DNS 方式,可以平滑替代 Zuul、Spring CloudGateway、Dubbo 等微服务 API 网关。
目前 K8s 官方 Kubernetes Ingress Controller 项目主要基于 NGINX 配置文件的方式,所以在路由能力和加载模式上稍显不足,并且存在一些明显劣势。比如添加、修改任何 API 时,需要重启服务才能完成新 NGINX 配置的更新,但重启服务,对线上流量的影响是非常大的。而 APISIX Ingress Controller 则完美解决了上面提到的所有问题:支持全动态,无需重启加载。同时继承了 APISIX 的所有优势,还支持原生 KubernetesCRD,方便用户迁移。
未来五到十年,基于云原生模式架构下的服务网格架构开始崭露头角。APISIX也提前开始锁定赛道,通过调研和技术分析后,APISIX 已经支持了 xDS 协议,APISIX Mesh 就此诞生,在服务网格领域 APISIX 也拥有了一席之地。
apisix的架构如下图所示
结合上图,不难发现,APISIX 的架构主要分成两部分:数据面和控制面。
它是真正去处理来自客户端请求的一个组件,去处理用户的真实流量,包括像身份验证、证书卸载、日志分析和可观测性等功能。数据面本身并不会存储任何数据,所以它是一个无状态结构。
使用etcd而非传统的关系型数据库,更贴合云原生,API网关存放的数据类型,具有高可用性,低于毫秒级别的变化通知。
APISIX 在底层架构上和其它 API 网关的一个很大不同就在于控制面。APISIX 在控制面上并没有使用传统的类似于像 MySQL 去做配置存储,而是选择使用 etcd。这样做的好处主要有以下几点:
使用 etcd 后,对于数据面而言只需监听 etcd 的变化即可。如果轮询数据库的话,可能需要 5-10 秒才能获取取到最新的配置;但如果监听 etcd 的配置变更,就可以将时间控制在毫秒级别之内,达到实时生效的效果。
在真正开始深入学习apisix之前,需要了解一下apisix中的几个重要概念和组件
概念/组件 | 详细描述 |
Route | 通过路由定义规则来匹配客户端请求,根据匹配结果加载并执行相应的插件,最后把请求转发给到指定的上游应用。 |
Upstream | 上游的作用是按照配置规则对服务节点进行负载均衡,它的地址信息可以直接配置到路由或服务上。 |
Admin API | 用户可以通过 Admin API 控制 APISIX 实例 |
apisix支持裸机安装或容器安装,官方建议使用容器化安装,一方面是部署简单方便,同时对资源的消耗相对较少,下面演示如何使用docker的方式部署apisix;
curl -SL https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
通过 git 命令克隆 apisix-docker 仓库:
git clone [email protected]:apache/apisix‐docker.git
cd apisix‐docker/example
如果git下载速度比较慢的话,也可以使用下面的地址进行下载
wget http://manongbiji.oss-cn-beijing.aliyuncs.com/ittailkshow/sca2023/download/apisix-docker-master.zip -O apisix-docker-master.zip
unzip apisix-docker-master.zip
进入example目录,执行如下docker-compose命令启动相关容器的服务
cd example
docker‐compose ‐f docker-compose.yml up ‐d
执行过程如下:
请确保其他系统进程没有占用 9080、9180、9443 和 2379 端口,云服务器的话需要开放这几个端口。
如果容器都能正常启动运行起来,apisix提供了web的控制台,访问地址:http://IP:9000,默认登录用户密码admin/admin;
登录进去之后如下展示效果,可以根据自身的需要在这里进行路由相关的设置;
apisix提供了动态灵活的路由功能,可以通过 Admin API 或者 Dashboard 进行配置。
Admin API文档地址:官方文档
Admin API 是一组用于配置 Apache APISIX 路由、上游、服务、SSL 证书等功能的 RESTful API。你可以通过 Admin API 来获取、创建、更新以及删除资源。同时得益于 APISIX 的热加载能力,资源配置完成后 APISIX 将会自动更新配置,无需重启服务。如果你想要了解其工作原理,请参考 Architecture Design。
Route 也称之为路由,可以通过定义一些规则来匹配客户端的请求,然后根据匹配结果加载并执行相应的插件,并把请求转发给到指定 Upstream(上游)。
使用下面的代码,我们将为路由配置匹配规则,以便 APISIX 可以将请求转发到对应的上游服务:
curl http://127.0.0.1:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
"methods": ["PUT", "GET"],
"hosts": ["example.com"],
"uri": "/anything/*",
"enable_websocket": true,
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
配置说明
当满足以下所有规则的时候,请求将被转发到上游服务:
执行上面的路由创建规则,看到下面的提示说明路由规则已经创建
可以通过以下命令访问上游服务:
curl -i -X GET "http://127.0.0.1:9080/anything/foo?arg=10" -H "Host: example.com"
输出如下结果
对于路由中的参数配置,可以结合apisix配置手册 中的Route模块的配置说明进行理解,里面提供了非常丰富的示例可以参考,主要是在工作过程中遇到了具体使用场景时,能够快速查阅即可。
接下来使用一个实际的案例,即简单模拟一个微服务的业务场景,使用apisix配置如何访问到微服务中的接口。
结构如下
@RestController
public class ProductController {
@GetMapping("/product/{id}")
public Object getById(@PathVariable("id") Integer id){
Map result = new HashMap();
result.put("id",id);
result.put("name","商品");
result.put("server-port","8083");
return result;
}
}
本地打完包之后,可以上传到服务器任意位置
可以直接使用java -jar 即可启动服务,启动成功后可以通过浏览器访问一下该接口,可以看到输出如下信息(注意:需要提前在服务器配置JDK环境,同时需要开发相关的端口)
执行下面的命令进行路由规则的创建,具体的参数配置含义结合文档参考,其实和nginx很类似;
curl http://120.55.95.42:9180/apisix/admin/routes/2 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
"methods": ["GET"],
"hosts": ["Host,一般是外部浏览器访问的域名地址,测试时可以直接使用外网IP"],
"uri": "/p/*",
"plugins": {
"proxy-rewrite": {
"regex_uri":[
"/p/(.*)",
"/$1"
]
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"路由到的后台服务地址,即上游服务,域名或IP:端口(端口默认不填监听80)": 1(权重值)
}
}
}'
然后在shell控制台执行一下,看到下面的信息,说明创建成功
也可以登录到控制台,看到上面创建的这条路由配置规则信息;
根据上面的规则,当我们访问的接口地址中以 /p 开始时,将直接路由到8083端口的服务上,可以看到下面的效果;
现在假如要配置一个负载均衡的业务场景该怎么做呢,我们现在再开启一个服务,端口为8085
即现在同时存在8083和8085对应的两个相同的服务,只需要配置upstream相关参数即可,执行下面的命令进行规则的创建;
curl http://IP:9180/apisix/admin/routes/2 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
"methods": ["GET"],
"hosts": ["IP"],
"uri": "/p/*",
"plugins": {
"proxy-rewrite": {
"regex_uri":[
"/p/(.*)",
"/$1"
]
}
},
"upstream": {
"type": "roundrobin",
"nodes":[{"host":"IP", "port":8083, "weight": 1},{"host":"IP", "port":8085, "weight": 8}]
}
}'
主要,创建完毕这个配置规则后,建议先删除之前的配置规则,避免测试时看不到效果
按照上面的配置可以知道,8085这个端口将会有更多几乎杯访问到,配置完成后,再次访问接口,在多次反复的访问中,8085被访问到的次数更多;
apisix提供了一个dashboard控制台可以方便开发运维在界面上进行路由规则的配置,上面当启动docker-compose之后,控制台就开启并可以直接访问了。
Apache APISIX Dashboard 是基于浏览器的可视化平台,用于监控、管理Apache APISIX。Apache APISIX Dashboard 可以让用户尽可能直观、便捷地通过可视化界面操作 Apache APISIX。通过 Dashboard,我们能够:
接下来演示下如何基于dashboard配置一下路由规则,,仍以上文的两个不同端口的服务为例进行说明。
点击路由配置创建
填写下面的主要路由信息即可
像使用命令创建一样,进入到这个页面后,给其中一个端口的服务配置更高的权重;
后面的可以保持默认即可,配置完成后在路由列表就可以看到上面的配置了
访问下面的接口地址,反复多刷几次接口,效果和上面差不多,8085端口的服务有更多的几乎被访问到;
nacos是springcloud-alibaba微服务生态体系下非常重要的组件,常作为服务注册和发现使用。使用注册中心可以实现服务生产者和消费者的解耦。
Apache APISIX + Nacos 可以将各个微服务节点中与业务无关的各项控制,集中在Apache APISIX 中进行统一管理,即通过 Apache APISIX 实现接口服务的代理和路由转发的能力。在 Nacos 上注册各个微服务后,Apache APISIX 可以通过 Nacos 的服务发现功能获取服务列表,查找对应的服务地址从而实现动态代理。
使用apisix对nacos实现路由配置的工作原理流程如下图所示,apisix在相当于是起到了一个服务接口的代理和路由转发功能;
接下来使用一个实际的案例来完成apisix整合nacos实现服务发现的步骤;
官网下载一个nacos的server端的压缩包,解压后,进入到bin目录,直接使用下面的命令启动即可
./startup.sh -m standalone
启动完成后,开发8848端口,浏览器可以访问nacos的控制台,查看相关的服务或配置信息
为了模拟接近真实的效果,这里需要准备一个springboot工程,与nacos进行整合
主要是nacos相关的依赖
jar
org.springframework.boot
spring-boot-starter-parent
2.2.2.RELEASE
UTF-8
1.8
1.8
1.2.17
org.springframework.boot
spring-boot-dependencies
2.2.2.RELEASE
pom
import
org.springframework.cloud
spring-cloud-dependencies
Hoxton.SR1
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.1.0.RELEASE
pom
import
org.springframework.boot
spring-boot-starter-web
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.boot
spring-boot-maven-plugin
在application.yaml配置如下内容
server:
port: 8085
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: nacos IP:8848 #服务注册中心地址
#config:
#server-addr: localhost:8848 #配置中心地址
@RestController
public class NacosController {
@GetMapping("/user/info")
public Object getObjectInfo(){
Map result = new HashMap<>();
result.put("username","jerry");
result.put("age","28");
return result;
}
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class BootApp {
public static void main(String[] args) {
SpringApplication.run(BootApp.class,args);
}
}
使用java -jar命令启动服务,启动完成后,在nacos的控制台的服务列表中可以看到nacos-provider服务已经成功进行注册;
可以通过浏览器调用接口,测试服务接口是否可正常使用;
到这里,前置准备工作就已经完成,接下来就需要进行apisix相关的路由配置即可;
在example目录下,进入 example/apisix_conf/config.yaml 文件,然后添加如下配置
discovery:
nacos:
host:
- "http://nacos IP:8848"
配置完成退出之后一定要重启docker服务
# 重启工程中所有服务的容器
docker-compose restart
# 重启工程中指定服务容器
docker-compose restart 容器名称
这里分为两步,第一步配置上游服务,第二步配置路由规则
配置上游服务
参照下面的信息进行填写配置
配置完成后在列表中就可以看到了
配置路由规则
添加一个新的路由规则,第一张图配置一下路由的路径
第二张图主要配置关联上游服务信息,后面的暂时使用默认的即可;
配置完成之后在路由列表就可以看到上面的配置规则了
浏览器通过apisix的方式访问一下,看到下面的效果,说明使用apisix的方式整合成功
本文通过较大的篇幅,全面阐述了apisix这一款云原生 API 网关的使用,从安装,配置到使用,通过实际的使用体验能够感受到,云原生的崛起已经势在必行,可编程,可配置的网关必定会成为云原生与微服务架构体系中一个不错的结合点,有必要对这个网关做深入的了解和学习。