Apisix教程 安装与使用,并与consul结合实现服务发现,负载均衡限流,统一鉴权(超级详细)

        在微服务中网关是很重要的操作,肩负了统一鉴权、熔断限流、负载均衡等责任,网关是非常重要的一部分,本篇我们就来介绍一款高性能网关Apisix,这个网关的主要特点有三个,1.全动态能力,你不需要重启就可以更改网关的各种配置(conf.yaml这个无法热加载),2.使用nginx内置变量做为路由的匹配条件,可以自定义匹配函数来过滤请求,3.支持与众多的工具与平台集成使用,并且有优化的ui界面
下面我们开始安装与配置

安装Apisix

        本节设计很多docker的使用,不会的可以去看看我写的docker教程

docker教程1 docker教程2

        安装很简单我们使用官方提供的docker-compose可以轻松安装,下面先克隆对应的文件,进入example目录,最后运行docker-compose命令就可以了

git clone https://github.com/apache/apisix-docker.git
cd apisix-docker/example
docker-compose -p docker-apisix up -d

        我们可以使用`docker ps`命令来检测是否成功,也可以发送请求给apisix来验证

# 正常会返回apisix的版本
curl "http://127.0.0.1:9080" --head | grep Server

        在example下有很多*-conf文件夹,这些文件夹里面都是各个服务的配置文件,比如我们可以通过修改apisix_conf/conf.yaml文件来修改apisix的配置,比如启用consul服务发现

discovery:
  consul:
    servers:
      - "http://192.168.31.237:8500"

        这里的地址要填写真实地址,公网内网都可以,绝对不要写127.0.0.1因为apisix是运行在一个容器内的,就算我们的consul与apisix运行在同一个电脑,但是他们也不在同一容器内 

docker run --name consul1 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 hashicorp/consul agent -server -bootstrap-expect=1 -ui -bind=0.0.0.0 -client=0.0.0.0

        本命令可以安装并运行consul,安装配置到此为止,接下来我们介绍如何使用apisix实现,路由、负载均衡、限流、统一鉴权

路由与负载均衡

        apisix是通过api请求的方式来更改路由状态的,下面来一个简单的例子

curl -i "http://127.0.0.1:9180/apisix/admin/routes" -H 'X-API-KEY: key' -X PUT -d ' {
  "id": "getting-started-ip",
  "uri": "/ip",
  "upstream": {
    "nodes": {
      "httpbin.org:80": 1
    }
  }
}'

        curl是一个用于发送 HTTP 请求的命令行工具,这里我们不过多介绍,
* -i 显示响应头信息。这在调试时很有用,因为可以查看服务器返回的 HTTP 状态码和头信息。
* -H 设置请求头,包含 `X-API-KEY`,这是用于验证的 API 密钥。APISIX 的管理 API 通常需要这个密钥来验证请求的合法性,这个密钥可以在apisix_conf/conf.yaml文件获得
* -X 1指定 HTTP 方法为PUT,这用于更新或创建资源。
* -d 后面跟的就是我们的请求头了
        请求头是json格式,我们来一一解释属
* id 指定这个路由的唯一表示,第一次出现就创建,后续再有这个id的请求就会修改之前的内容
* uri 匹配的请求路径,这里是 `/ip`。当有请求访问 `/ip` 时,APISIX 会将请求转发到上游服务。
* upstream 上游服务的配置,nodes为上游服务的节点列表,key表示地址值为权重这在后面的负载均衡很有用
        成功的话会返回200状态码,我们还可以使用下面的命令来验证

# apisix的路由都要访问9080端口,如果成功这个命令会返回本机ip地址
curl "http://127.0.0.1:9080/ip"
# 下面的命令可以删除指定路由
curl -i -X DELETE "http://127.0.0.1:9180/apisix/admin/routes/路由id" -H 'X-API-KEY: key'

        基本的路由功能就是这些了,下面我们介绍结合consul实现负载均衡

        运行这个命令可以获得两个官方实现的案例

sudo docker inspect -f='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(sudo docker ps -aq) | grep web
# 输出 
/docker-apisix_web2_1 - 172.18.0.4
/docker-apisix_web1_1 - 172.18.0.3

        接下来我们用这两个web服务来实现,服务注册与发现,还有负载均衡,我们使用curl工具将服务注册到consul,这次的请求对象是consul不是apisix了

curl --location --request PUT 'http://127.0.0.1:8500/v1/agent/service/register' \  
--header 'Content-Type: application/json' \  
--data '{  
"ID": "service_a1",  
"Name": "service_a",  
"Tags": ["primary", "v1"],  
"Address": "172.18.0.4",  
"Port": 80,  
"Weights": {  
"Passing": 10,  
"Warning": 1  
}  
}'  
  
curl --location --request PUT 'http://127.0.0.1:8500/v1/agent/service/register' \  
--header 'Content-Type: application/json' \  
--data '{  
"ID": "service_a2",  
"Name": "service_a",  
"Tags": ["primary", "v1"],  
"Address": "172.18.0.3",  
"Port": 80,  
"Weights": {  
"Passing": 10,  
"Warning": 1  
}  
}'

        运行这两个命令就会将服务注册到consul中,我们可以在浏览器访问8500端口通过gui来查看是否成功,在第一章时已经配置好了consul的地址,接下来我们只需要添加对应的路由规则就可以了

curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: key' -X PUT -i -d '
{
	"id": "consul-test"
    "uri": "/consul/web/*",
    "upstream": {
        "service_name": "service_a",
        "type": "roundrobin",
        "discovery_type": "consul"
    }
}'

        在upstream下多路几个新参数,service_name表示服务中心的key,type为负载均衡策略roundrobin为轮询,discovery_type是服务发现类型

# 多次访问本命令,一切正常的话每次输出会不一样
curl -s http://127.0.0.1:9080/consul/web/

限流与统一鉴权

        要实现限流与鉴权需要先在apisix_conf/conf.yaml添加下面的内容

plugins:
  - jwt-auth
  - limit-count

        这是为了启用两个必要的插件
        要实现鉴权我们需要使用apisix的创建,这里我们使用jwt-auth创建来实现鉴权,我们需要通过创建消费者来启用创建

# 创建用户名为global_jwt_consumer的JWT消费者
curl http://127.0.0.1:9180/apisix/admin/consumers \
-H 'X-API-KEY: key' -X PUT -d '
{
    "username": "global_jwt_consumer", 
    "plugins": {
        "jwt-auth": {
            "key": "你的key",  
            "secret": "你的密钥",
            "exp": 86400
        }
    }
}'

# 查看所有消费者
curl -H 'X-API-KEY: key' http://127.0.0.1:9180/apisix/admin/consumers
# 删除指定消费者
 curl -X DELETE -H 'X-API-KEY: key' http://127.0.0.1:9180/apisix/admin/consumers/{username}

        有几个需要的点是,username和key必须是全局唯一的,secret和exp必须与你生成时token的配置保持一致,创建完成消费者后我们需要给路由启动jwt-auth鉴权,我们使用http的PATCH请求来更新部分数据

curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -H 'X-API-KEY: key' -X PATCH -d '
{
  "plugins": {
    "jwt-auth": {
        "header": "Authorization",
        "disable": false
    }
  }
}'

        header是请求头值为请求头的key,disable为false表示启动为true是停止,在路由中不需要指定消费者,如果存在多个消费者会通过key来区分,这个key在生成token时必须填写,他是用来区分消费者的

# 这样使用,如果不带token或者无效了,就会直接退出返回错误
curl http://127.0.0.1:9080/ip -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJqd3RfdG9rZW5fa2V5IiwidWlkIjo1LCJuYW1lIjoiMTExIiwiZXhwIjoxNzQxNTk4NjgwfQ.naXO06q4THpZdeAMj7elnAgno5qZN4UWXh8PQXg2320" -i

启动限流

curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -H 'X-API-KEY: key' -X PATCH -d '
{
  "plugins": {
    "limit-count": {
        "count": 2,
        "time_window": 10,
        "rejected_code": 503
     }
  }
}'

        `limit-count` 插件用于限制每个客户端在指定时间窗口内的请求数量。这个配置的限流规则是**每个客户端每 10 秒最多 2 个请求**。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值