这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

网关

1 - 使用 Nginx

kubernetes环境使用

部署polaris

如果已经部署好了polaris,可忽略这一步。

polaris支持在kubernetes环境中进行部署,注意必须保证暴露HTTP端口为8090,gRPC端口为8091。具体部署方案请参考:

访问限流

  • 部署polaris-limiter:注意,如果使用的是1.12之前版本的polaris单机版,则需要额外部署polaris-limiter,作为分布式限流的集中式token-server。部署方法可参考:polaris-limiter

  • 获取样例:下载最新版本的nginx-gateway的release,获取对应版本的源码包:Source code (zip)。

  • 部署文件说明:以1.1.0-beta.0为例,源码包名称为:nginx-gateway-1.1.0-beta.0.zip,解压后,部署文件为examples/ratelimit/nginx.yaml,里面包含有如下环境变量,用户可以按照自己的需要进行修改。

变量名 默认值 说明
polaris_address polaris.polaris-system:8091 北极星服务端地址,8091为GRPC端口
polaris_nginx_namespace default 网关服务所在的命名空间
polaris_nginx_service nginx-gateway 网关服务所在的服务名,用于查找并关联限流规则
polaris_nginx_ratelimit_enable true 是否启用限流功能
  • 部署样例:以1.1.0-beta.0为例,源码包名称为:nginx-gateway-1.1.0-beta.0.zip
unzip nginx-gateway-1.1.0-beta.0.zip
cd nginx-gateway-1.1.0-beta.0
kubectl apply -f examples/ratelimit/nginx.yaml
  • 配置限流规则

在北极星控制台新建一个限流规则,服务名和命名空间分别选择nginx-gateway以及default,设置根据http header(user=1000)进行流量限制。

  • 验证限流效果

通过postman,在http请求中带上头信息:user:1000,一分钟超过5次调用,会返回限流错误。

虚拟机环境使用

部署polaris

如果已经部署好了polaris,可忽略这一步。

polaris支持在linux虚拟机环境中进行部署,注意必须保证暴露HTTP端口为8090,gRPC端口为8091。具体部署方案请参考:

安装nginx网关

  • 下载安装包:可以在GITHUB的版本页面下载最新的虚拟机安装包,当前只提供基于ubuntu-latest编译的虚拟机安装包,如需其他版本,可以通过源码编译的方式来进行打包。版本下载地址:release

  • 解压安装包:以nginx-gateway-release-1.1.0-beta.0.linux.x86_64.tar.gz为例。

tar xf nginx-gateway-release-1.1.0-alpha.6.linux.x86_64.tar.gz
cd nginx-gateway-release-1.1.0-alpha.6.linux.x86_64
  • 修改端口号(可选):nginx默认端口号为80,如需修改端口号,可以通过编辑conf/nginx.conf配置文件进行修改。
http {
  server {
    listen 80; #这里修改成希望监听的端口号
  }
}  
  • 添加环境变量(可选):可通过添加环境变量的方式,指定nginx-gateway对应的参数设置。环境变量说明。
变量名 默认值 说明
polaris_address polaris.polaris-system:8091 北极星服务端地址,8091为GRPC端口
polaris_nginx_namespace default 网关服务所在的命名空间
polaris_nginx_service nginx-gateway 网关服务所在的服务名,用于查找并关联限流规则
polaris_nginx_ratelimit_enable true 是否启用限流功能
  • 重启nginx

    cd nginx-gateway-release-*/sbin
    bash stop.sh
    bash start.sh
    

其他资料

2 - 使用 Envoy

部署polaris

kubernetes环境使用

如果已经部署好了polaris,可忽略这一步。

polaris支持在kubernetes环境中进行部署,注意必须保证暴露HTTP端口为8090,gRPC端口为8091。具体部署方案请参考:

虚拟机环境使用

如果已经部署好了polaris,可忽略这一步。

polaris支持在linux虚拟机环境中进行部署,注意必须保证暴露HTTP端口为8090,gRPC端口为8091。具体部署方案请参考:

Envoy Gateway 启动配置

node:
  # Envoy 的 node 配置必须遵守以下规则
  id: "gateway~${envoy gateway 网关服务所在的命名空间}/${UUID}~${envoy 节点IP}"
  metadata:
    gateway_service: ${envoy gateway 网关服务名称}
    gateway_namespace: ${envoy gateway 网关服务所在的命名空间}

dynamic_resources:
  ads_config:
    api_type: GRPC
    transport_api_version: V3
    grpc_services:
      - google_grpc:
          target_uri: ${北极星服务端IP}:15010
          stat_prefix: polarismesh
          channel_args:
            args:
              grpc.http2.max_ping_strikes:
                int_value: 0
              grpc.keepalive_time_ms:
                int_value: 10000
              grpc.keepalive_timeout_ms:
                int_value: 20000

创建 Envoy Gateway 使用的路由规则

假定现在有两个服务 service-a 以及 service-b,希望 Envoy Gateway 能够按照以下规则路由到特定的服务

  • 路由到 service-a
    • 条件 1: http path 为 /api/v1/service-a
  • 路由到 service-b
    • 添加 1: http path 为 /api/v1/service-b

那么需要按照下列步骤准备

准备 Envoy 启动配置

  • 参考 Envoy Gateway 启动配置 创建 gateway_xds_test.yaml
    # 这里只给出 node 节点部份的配置
    node:
      id: "gateway~default/c962adc3-673e-4637-9ba8-969d755ef66a~127.0.0.1"
      cluster: "CLUSTER_NAME"
      metadata:
        gateway_service: EnvoyGateway
        gateway_namespace: default
    
  • 在北极星上创建服务,服务名为 EnvoyGateway, 所在命名空间为 default

创建路由到 service-a 的路由规则

创建路由到 service-b 的路由规则

运行 Envoy Gateway

docker run -it --rm  -p 15001:15001 -p 15000:15000 -v $(pwd)/gateway_xds_test.yaml:/gateway_xds_test.yaml envoyproxy/envoy-contrib:v1.21.4 -c /gateway_xds_test.yaml

查看 Envoy Gateway 收到的 XDS 规则

进入 envoy 容器执行以下命令

curl http://127.0.0.1:15000/config_dump

如果 RoutesConfigDump 如下,则 XDS 规则获取成功

{
    "@type":"type.googleapis.com/envoy.admin.v3.RoutesConfigDump",
    "dynamic_route_configs":[
        {
            "version_info":"2023-04-01T01:06:47+08:00/9",
            "route_config":{
                "@type":"type.googleapis.com/envoy.config.route.v3.RouteConfiguration",
                "name":"polaris-router",
                "virtual_hosts":[
                    {
                        "name":"gateway-virtualhost",
                        "domains":[
                            "*"
                        ],
                        "routes":[
                            {
                                "match":{
                                    "path":"/api/v1/service-a"
                                },
                                "route":{
                                    "weighted_clusters":{
                                        "clusters":[
                                            {
                                                "name":"service-a",
                                                "weight":100,
                                                "metadata_match":{
                                                    "filter_metadata":{
                                                        "envoy.lb":{
                                                            "env":"prod"
                                                        }
                                                    }
                                                }
                                            }
                                        ],
                                        "total_weight":100
                                    }
                                }
                            },
                            {
                                "match":{
                                    "path":"/api/v1/service-b"
                                },
                                "route":{
                                    "weighted_clusters":{
                                        "clusters":[
                                            {
                                                "name":"service-b",
                                                "weight":100,
                                                "metadata_match":{
                                                    "filter_metadata":{
                                                        "envoy.lb":{
                                                            "env":"prod"
                                                        }
                                                    }
                                                }
                                            }
                                        ],
                                        "total_weight":100
                                    }
                                }
                            },
                            {
                                "match":{
                                    "prefix":"/"
                                },
                                "route":{
                                    "cluster":"PassthroughCluster"
                                }
                            }
                        ]
                    }
                ],
                "validate_clusters":false
            },
            "last_updated":"2023-03-31T17:06:47.547Z"
        }
    ]
}

请求验证

curl http://127.0.0.1:15001/api/v1/service-a

# 期望输出:I'm service-a

curl http://127.0.0.1:15001/api/v1/service-b

# 期望输出:I'm service-b

附录:Demo 程序

package main

import (
	"io"
	"log"
	"net/http"
	"os"
)

func main() {
	handler := func(w http.ResponseWriter, req *http.Request) {
		io.WriteString(w, "I'm "+os.Getenv("SERVICE_NAME"))
	}

	http.HandleFunc("/", handler)
	log.Fatal(http.ListenAndServe(":"+os.Getenv("PORT"), nil))
}