在微服务架构下,为了实现服务的注册与发现,我们通常会引入注册中心组件。APISIX 提供了从注册中心获取服务实例的功能,可以实现高效的服务发现和动态负载均衡,从而提高系统的灵活性和可靠性。目前,APISIX支持的服务发现机制包括Consul、Nacos、Eureka、Etcd等。
01、背 景
在 Java 技术栈的微服务架构中,不少企业会选择 Nacos 作为服务发现和配置中心,Spring Cloud Gateway 作为微服务 API 网关。然而,随着企业对 API 网关性能和灵活性的要求不断提高,越来越多的企业开始关注 Apache APISIX 作为替代方案。本文将介绍如何在 Java 技术栈中使用 Apache APISIX 替代 Spring Cloud Gateway 作为微服务 API 网关。
02、方 案
APISIX Nacos 可以将各个微服务节点中与业务无关的各项控制,集中在APISIX 中进行统一管理,即通过APISIX 实现接口服务的代理和路由转发的能力。各个微服务在 Nacos 上注册后,APISIX 可以通过 Nacos 的服务发现功能获取服务列表,查找对应的服务地址从而实现动态代理。
目的
替换Spring Cloud Gateway,然后在APISIX做路由,最终能够通过 /api/<服务名> 访问到Nacos注册的微服务
准备条件
Kubernetes(APISIX和Nacos都是在k8s环境搭建)
APISIX
APISIX-Ingress
04、实践环节
1、修改APISIX配置config.yaml,在顶级配置增加如下内容,用于发现注册到Nacos的微服务,修改后需要滚动重启APISIX的Pods
代码语言:javascript复制discovery:
nacos:
host:
- "http://nacos.test:8848" # Nacos的服务地址
prefix: "/nacos/v1/"
fetch_interval: 30 # 可选项, 获取服务实例列表的时间间隔, 默认是30s
weight: 100 # 可选项, 获取到的服务实例的默认权重值, 默认是100
2、创建Route和Upstream,我们这里用Admin API实现,当然也可以在dashboard上直接创建,有兴趣的可以在创建后登录dashboard看下具体的配置,后面也可以通过白屏化进行配置
代码语言:javascript复制curl http://<apisix-admin>:9180/apisix/admin/routes
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
-X POST -i -d '
{
"uri": "/api/*", # 路由规则
"host": "test.example.com",
"name": "my-test-route",
"upstream": {
"service_name": "my-service", # 微服务名称
"type": "roundrobin",
"discovery_type": "nacos",
"discovery_args": {
"namespace_id": "public" # 微服务所在的Nacos命名空间
}
}
}'
创建成功后返回内容,状态码201,状态为Created,id则为Route规则的id,是唯一的
代码语言:javascript复制HTTP/1.1 201 Created
Date: Sat, 4 May 2024 8:11:25 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/3.9.1
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: *
Access-Control-Max-Age: 3600
X-API-VERSION: v3
{"key":"/apisix/routes/00000000000000000483","value":{"host":"test.example.com","update_time":1714784004,"upstream":{"type":"roundrobin","service_name":"my-service","scheme":"http","hash_on":"vars","discovery_type":"nacos","pass_host":"pass","discovery_args":{"namespace_id":"public"}},"priority":0,"status":1,"create_time":1714784004,"name":"my-test-route","uri":"/api/*","id":"00000000000000000483"}}
3、我们可以通过Route规则的id查询路由具体信息
代码语言:javascript复制curl http://<apisix-admin>:9180/apisix/admin/routes/00000000000000000483 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
返回内容:
代码语言:javascript复制{
"value": {
"name": "my-test-route",
"update_time": 1714784004,
"upstream": {
"scheme": "http",
"service_name": "my-service",
"type": "roundrobin",
"hash_on": "vars",
"discovery_type": "nacos",
"pass_host": "pass",
"discovery_args": {
"namespace_id": "public"
}
},
"host": "test.example.com",
"id": "00000000000000000483",
"create_time": 1714784004,
"status": 1,
"uri": "/api/*",
"priority": 0
},
"createdIndex": 484,
"modifiedIndex": 484,
"key": "/apisix/routes/00000000000000000483"
}
4、在配置好后,我们可以通过APISIX-Ingress访问注册到Nacos的微服务了
05、知识拓展
如果是反向代理k8s的service,那就更简单,可以参考如下案例
代码语言:javascript复制apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: nginx-route
namespace: gray # 这里填写你微服务的命名空间
spec:
http:
- name: nginx-route
match:
hosts:
- "test.example.com" # 这里填写你的域名
paths:
- "/api/*"
backends:
- serviceName: nginx-v1 # 这里填写你微服务的名称
servicePort: 80 # 这里填写你微服务的服务端口
06、总 结
APISIX的路由配置更简单,可以通过Admin API或者dashboard进行配置,整体感觉比Spring Cloud Gateway的配置管理更友好,当然性能也不在话下,本次分享就到这里,如果有什么问题欢迎留言一起探讨,谢谢!
参考文档:
https://nacos.io/zh-cn/blog/apisix/
https://apisix.apache.org/zh/docs/apisix/discovery/nacos/