全新一代API网关,带可视化管理,文档贼友好!

DiaoShiYuan
• 阅读 7404
提到API网关,大家比较熟悉的有Spring Cloud体系中的Gateway和Zuul,这些网关在使用的时候基本都要修改配置文件或自己开发功能。今天给大家介绍一款功能强大的API网关apisix,自带可视化管理功能,多达三十种插件支持,希望对大家有所帮助!

SpringBoot实战电商项目mall(50k+star)地址:https://github.com/macrozheng/mall

简介

apisix是一款云原生微服务API网关,可以为API提供终极性能、安全性、开源和可扩展的平台。apisix基于Nginx和etcd实现,与传统API网关相比,apisix具有动态路由和插件热加载,特别适合微服务系统下的API管理。

全新一代API网关,带可视化管理,文档贼友好!

核心概念

我们先来了解下apisix的一些核心概念,对我们接下来的使用会很有帮助!
  • 上游(Upstream):可以理解为虚拟主机,对给定的多个目标服务按照配置规则进行负载均衡。
  • 路由(Route):通过定义一些规则来匹配客户端的请求,然后对匹配的请求执行配置的插件,并把请求转发给指定的上游。
  • 消费者(Consumer):作为API网关,有时需要知道API的消费方具体是谁,通常可以用来做身份认证。
  • 服务(Service): 可以理解为一组路由的抽象。它通常与上游是一一对应的,路由与服务之间,通常是多对一的关系。
  • 插件(Plugin):API网关对请求的增强操作,可以对请求增加限流、认证、黑名单等一系列功能。可以配置在消费者、服务和路由之上。

安装

由于官方提供了Docker Compose部署方案,只需一个脚本即可安装apisix的相关服务,非常方便,这里我们也采用这种方案来部署。

全新一代API网关,带可视化管理,文档贼友好!

  • 接下来我们把example目录上传到Linux服务器上去,来了解下这个目录里面的东西;
drwxrwxrwx. 2 root root   25 Jun 19 10:12 apisix_conf   # apisix配置文件目录
drwxrwxrwx. 2 root root   71 Jun 24 09:36 apisix_log    # apisix日志文件目录
drwxrwxrwx. 2 root root   23 Jun 23 17:10 dashboard_conf  # 可视化工具apisix-dashboard配置文件目录
-rwxrwxrwx. 1 root root 1304 Jun 19 10:12 docker-compose-alpine.yml # docker-compose 部署脚本(alpine)版本
-rwxrwxrwx. 1 root root 1453 Jun 19 10:12 docker-compose.yml # docker-compose 部署脚本
drwxrwxrwx. 2 root root   27 Jun 19 10:12 etcd_conf # ectd配置文件目录
drwxrwxrwx. 3 root root   31 Jun 23 17:06 etcd_data # ectd数据目录
drwxrwxrwx. 2 root root  107 Jun 19 10:12 mkcert
drwxrwxrwx. 2 root root   40 Jun 19 10:12 upstream # 两个测试用的Nginx服务配置
  • docker-compose.yml中我们可以发现,该脚本不仅启动了apisix、apisix-dashboard、etcd这三个核心服务,还启动了两个测试用的Nginx服务;
version: "3"

services:
  # 可视化管理工具apisix-dashboard
  apisix-dashboard:
    image: apache/apisix-dashboard:2.7
    restart: always
    volumes:
    - ./dashboard_conf/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
    ports:
    - "9000:9000"
    networks:
      apisix:
  
  # 网关apisix
  apisix:
    image: apache/apisix:2.6-alpine
    restart: always
    volumes:
      - ./apisix_log:/usr/local/apisix/logs
      - ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
    depends_on:
      - etcd
    ##network_mode: host
    ports:
      - "9080:9080/tcp"
      - "9443:9443/tcp"
    networks:
      apisix:
  
  # apisix配置数据存储etcd
  etcd:
    image: bitnami/etcd:3.4.15
    user: root
    restart: always
    volumes:
      - ./etcd_data:/bitnami/etcd
    environment:
      ETCD_ENABLE_V2: "true"
      ALLOW_NONE_AUTHENTICATION: "yes"
      ETCD_ADVERTISE_CLIENT_URLS: "http://0.0.0.0:2379"
      ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
    ports:
      - "2379:2379/tcp"
    networks:
      apisix:

  # 测试用nginx服务web1,调用返回 hello web1
  web1:
    image: nginx:1.19.0-alpine
    restart: always
    volumes:
      - ./upstream/web1.conf:/etc/nginx/nginx.conf
    ports:
      - "9081:80/tcp"
    environment:
      - NGINX_PORT=80
    networks:
      apisix:

  # 测试用nginx服务web2,调用返回 hello web2
  web2:
    image: nginx:1.19.0-alpine
    restart: always
    volumes:
      - ./upstream/web2.conf:/etc/nginx/nginx.conf
    ports:
      - "9082:80/tcp"
    environment:
      - NGINX_PORT=80
    networks:
      apisix:

networks:
  apisix:
    driver: bridge
  • docker-compose.yml文件所在目录下,使用如下命令可以一次性启动所有服务;
docker-compose -p apisix-docker up -d
  • 启动成功后,使用如下命令可查看所有服务的运行状态;
docker-compose -p apisix-docker ps
              Name                            Command               State                       Ports                     
--------------------------------------------------------------------------------------------------------------------------
apisix-docker_apisix-dashboard_1   /usr/local/apisix-dashboar ...   Up      0.0.0.0:9000->9000/tcp                        
apisix-docker_apisix_1             sh -c /usr/bin/apisix init ...   Up      0.0.0.0:9080->9080/tcp, 0.0.0.0:9443->9443/tcp
apisix-docker_etcd_1               /opt/bitnami/scripts/etcd/ ...   Up      0.0.0.0:2379->2379/tcp, 2380/tcp              
apisix-docker_web1_1               /docker-entrypoint.sh ngin ...   Up      0.0.0.0:9081->80/tcp                          
apisix-docker_web2_1               /docker-entrypoint.sh ngin ...   Up      0.0.0.0:9082->80/tcp 
  • 接下来就可以通过可视化工具来管理apisix了,登录账号密码为admin:admin,访问地址:http://192.168.5.78:9000/

全新一代API网关,带可视化管理,文档贼友好!

  • 登录之后看下界面,还是挺漂亮的,apisix搭建非常简单,基本无坑;

全新一代API网关,带可视化管理,文档贼友好!

全新一代API网关,带可视化管理,文档贼友好!

全新一代API网关,带可视化管理,文档贼友好!

使用

apisix作为新一代的网关,不仅支持基本的路由功能,还提供了丰富的插件,功能非常强大。

基本使用

我们先来体验下apisix的基本功能,之前已经启动了两个Nginx测试服务web1web2,接下来我们将通过apisix的路由功能来访问它们。
  • 首先我们需要创建上游(Upstream),上游相当于虚拟主机的概念,可以对真实的服务提供负载均衡功能;

全新一代API网关,带可视化管理,文档贼友好!

  • 创建web1的上游,设置好名称、负载均衡算法和目标节点信息;

全新一代API网关,带可视化管理,文档贼友好!

  • 再按照上述方法创建web2的上游,创建完成后上游列表显示如下;

全新一代API网关,带可视化管理,文档贼友好!

  • 再创建web1的路由(Route),路由可以用于匹配客户端的请求,然后转发到上游;

全新一代API网关,带可视化管理,文档贼友好!

  • 再选择好路由的上游为web1

全新一代API网关,带可视化管理,文档贼友好!

  • 接下来选择需要应用到路由上的插件,apisix的插件非常丰富,多达三十种,作为基本使用,我们暂时不选插件;

全新一代API网关,带可视化管理,文档贼友好!

  • 再创建web2的路由,创建完成后路由列表显示如下;

全新一代API网关,带可视化管理,文档贼友好!

全新一代API网关,带可视化管理,文档贼友好!

全新一代API网关,带可视化管理,文档贼友好!

进阶使用

apisix通过启用插件,可以实现一系列丰富的功能,下面我们来介绍几个实用的功能。

身份认证

使用JWT来进行身份认证是一种非常流行的方式,这种方式在apisix中也是支持的,可以通过启用jwt-auth插件来实现。
  • 首先我们需要创建一个消费者对象(Consumer);

全新一代API网关,带可视化管理,文档贼友好!

  • 然后在插件配置中启用jwt-auth插件;

全新一代API网关,带可视化管理,文档贼友好!

  • 启用插件时配置好插件的keysecret

全新一代API网关,带可视化管理,文档贼友好!

  • 创建成功后消费者列表时显示如下;

全新一代API网关,带可视化管理,文档贼友好!

  • 之后再创建一个路由,路由访问路径匹配/auth/*,只需启用jwt-auth插件即可;

全新一代API网关,带可视化管理,文档贼友好!

  • 访问接口获取生成好的JWT Token,需要添加两个参数,key为JWT插件中配置的key,payload为JWT中存储的自定义负载数据,JWT Token生成地址:http://192.168.5.78:9080/apis...

全新一代API网关,带可视化管理,文档贼友好!

全新一代API网关,带可视化管理,文档贼友好!

  • 在请求头Authorization中添加JWT Token后即可正常访问;

全新一代API网关,带可视化管理,文档贼友好!

  • 当然apisix支持的身份认证并不只这一种,还有下面几种。

全新一代API网关,带可视化管理,文档贼友好!

限流功能

有时候我们需要对网关进行限流操作,比如每个客户端IP在30秒内只能访问2次接口,可以通过启用limit-count插件来实现。
  • 我们在创建路由的时候可以选择配置limit-count插件;

全新一代API网关,带可视化管理,文档贼友好!

  • 然后对limit-count插件进行配置,根据remote_addr进行限流;

全新一代API网关,带可视化管理,文档贼友好!

  • 当我们在30秒内第3次调用接口时,apisix会返回503来限制我们的调用。

全新一代API网关,带可视化管理,文档贼友好!

跨域支持

如果你想让网关支持跨域访问的话,可以通过启用cors插件来实现。
  • 我们在创建路由的时候可以选择配置cors插件;

全新一代API网关,带可视化管理,文档贼友好!

  • 然后对cors插件进行配置,配置好跨域访问策略;

全新一代API网关,带可视化管理,文档贼友好!

  • 调用接口测试可以发现接口已经返回了CORS相关的请求头。

全新一代API网关,带可视化管理,文档贼友好!

总结

体验了一把apisix这个全新一代的API网关,有可视化管理的网关果然不一样,简单易用,功能强大!如果你的微服务是云原生的话,可以试着用它来做网关。

其实apisix并不是个小众框架,很多国内外大厂都在使用了,如果你想知道哪些公司在使用,可以参考下面的连接。

https://github.com/apache/api...

参考资料

apisix的官方文档非常友好,支持中文,简直是业界良心!过一遍官方文档基本就能掌握apisix了。

全新一代API网关,带可视化管理,文档贼友好!

官方文档:https://apisix.apache.org/zh/...

项目源码地址

https://github.com/apache/api...

本文 GitHub https://github.com/macrozheng/mall-learning 已经收录,欢迎大家Star!
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
ISO27001信息安全管理体系
0x00前言初入甲方,刚开始接触的应该就是ISO27001信息安全管理体系,你拿到的应该就是一整套安全管理类的文档。在甲方,稍微有点规模的公司很注重制度和流程,岗位职责分工明细,那么这些安全管理制度,就是你所能掌控的游戏规则,几个人的信息安全部生存之道。0x01ISO27001简介ISO/IEC27001信息安全管理体系
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(