Apache APISIX最佳实践(三):Nacos服务发现,探索实际应用场景

2024-08-30 17:02:06 浏览数 (1)

在微服务架构下,为了实现服务的注册与发现,我们通常会引入注册中心组件。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/

0 人点赞