微服务网关

时间:2024-11-05 07:04:19

网关是微服务架构里不可或缺的重要组件

微服务架构中,API网关扮演着至关重要的角色。它作为系统内外通信的唯一入口,能够统一管理和控制所有对外提供的微服务接口。例如,当企业希望将内部开发的服务开放给合作伙伴或公众使用时,通过微服务API网关可以轻松实现这一点。更重要的是,这样的设计允许我们在网关层面集中处理安全性问题,比如认证授权、流量清洗等,从而保护后端服务免受未授权访问或其他潜在威胁。此外,API网关还支持服务发现与路由管理功能,使得即便是在复杂多变的微服务体系结构下也能灵活地调整服务调用逻辑而无需修改客户端代码。总之,微服务API网关不仅简化了外部接入流程,也增强了整个系统的可维护性和安全性。

微服务网关的主要作用

微服务网关作为连接外部请求与内部微服务的桥梁,具备多种核心功能。首先,协议转换是其重要能力之一,它能够将HTTP请求转换为gRPC或其他内部服务使用的协议,比如用户通过浏览器发送一个HTTP GET请求,网关可以将其转化为后端服务所需的gRPC调用。其次,在安全隔离方面,网关充当了第一道防线的角色,通过实施认证(如JWT验证)和授权机制来确保只有合法请求才能访问到后端服务,保护系统免受未授权访问的影响。此外,流量控制也是网关不可或缺的功能,它能根据预设规则动态调整到达不同服务的请求量,例如当某一微服务出现过载时,网关可以通过限流策略暂时拒绝部分请求,从而保证整个系统的稳定运行。

微服务网关选择的关键因素与解析

在选择微服务网关时,有如下几个关键的考量要素

生态兼容性:是一个非常重要的考量因素。良好的生态兼容性能确保网关可以无缝集成到现有的技术栈中,无论是与Kubernetes、Docker等容器编排平台的整合,还是支持Spring Cloud、gRPC等多种微服务框架,都能够极大地降低开发和维护成本,加快项目上线速度。同时,广泛的社区支持和丰富的插件库也是良好生态的一部分,它们为开发者提供了更多解决问题的方法。

性能:对于微服务网关来说至关重要,特别是在处理高并发请求时。一个高效的网关应该能够提供低延迟的服务响应时间以及较高的吞吐量,这样才能保证即使是在流量高峰期也能平稳运行,不成为整个系统的瓶颈。此外,优秀的缓存机制和支持异步处理能力也是提升性能的关键点之一。

扩展性:是指随着业务增长或需求变化,微服务网关能够容易地添加新功能或调整配置的能力。理想的网关设计应该是模块化的,允许通过增加新的模块来引入额外的功能而无需重写现有代码。这样的灵活性有助于团队快速适应市场变化和技术进步,同时也简化了长期维护工作。

安全性:是任何网络应用不可忽视的一环,在微服务架构中尤为重要。一个好的微服务网关需要具备强大的安全特性,如支持SSL/TLS加密通信、身份验证(包括OAuth2.0)、授权控制及API密钥管理等功能,以保护敏感数据免受未授权访问,并防御常见的网络攻击,比如DDoS攻击。此外,还应定期更新安全补丁,保持对最新威胁模式的认识,从而为后端服务提供坚固的安全屏障。

API网关选型对比参考表:

我们依托于上面的考量因素,构建了一个比较详细的对比表,可以批判性参考。

注: 在笔者发文以后,有可能部分产品会新增功能,如果您发现有类似的问题欢迎留言。

核心维度

子维度

说明

Higress

Java 类网关(典型:Spring Cloud Gateway)

OpenResty 类网关(典型:Kong)

Envoy 类网关(典型:Gloo)

Go 类网关(典型:Traefik)

生态兼容性

K8s 微服务生态

(Ingress/Istio/Kruise/Argo/...)

对云原生应用友好

Java 微服务生态(Nacos/Dubbo/Spring Cloud/...)

对传统微服务应用友好

扩展性

Wasm 多语言扩展

(C++/Rust/GO/JS/...)

  • 通过沙箱隔离确保内存安全
  • 支持多种编程语言
  • 有编译过程,类型检查,相比 Lua 弱类型更可靠(例子:7行代码让B站崩溃3小时

  • 40+ 插件生态
  • 100+ 开发者生态
  • 插件版本可以独立于网关版本升级,且流量完全无损

Lua 语言扩展

脚本型扩展,适合写简单逻辑

高性能

无 GC 开销

高并发下,低 CPU,低内存

lua 扩展有 GC 开销

CryptoMB/QAT 等适配

可以适配Intel等特定CPU实现软硬件结合的加速能力

配置热更新

(含插件变更)

短连接无损

适用:

  • HTTP 1.0
  • HTTP 1.1(将长连接变为短连接)

长连接无损

适用:

  • HTTP 2
  • gRPC
  • WebSocket

AI 业务亲和性

多 LLM Provider 支持

统一协议对接所有 LLM 厂商

kong 支持一部分

收费功能

模型 fallback 能力

当主用模型不可用时,自动降级到备用模型,提高依赖 AI 业务的稳定性

AIGC 安全防护

  • 数据脱敏
  • 输入/输出封禁

支持对接阿里云内容安全服务

基于单词Token的限流

用于实现对单个调用方或IP等维度,限制每分钟/每天允许的单词 Token 开销,用于精确控制 AI 业务成本

收费功能

语义化缓存

基于语义相似度进行结果缓存,在 RAG 场景下可大幅提升响应速度,以及降低成本

收费功能

收费功能

语义化路由策略

支持基于 LLM 识别请求意图,将特定请求转发给特定模型,或者对特定意图开启语义化缓存等

收费功能,仅支持语义化路由

Higress 介绍:阿里开源的高性能微服务网关

Higress 是阿里巴巴基于多年实战经验推出的开源 API 网关,完全免费且开源。

它具备出色的生态兼容性,遵循开源 Ingress/Gateway API 标准,并支持 Nacos、K8s Service 等多种注册中心。

在性能方面,Higress 面向超大规模路由配置与转发表现出色,即便是在 10000 个路由的情况下,也能在 3 秒内完成配置生效,相比 Ingress Nginx,CPU 成本节省高达 50%,内存成本更是节省了 90%。

此外,Higress 支持动态配置热更新,并可以通过 Java 编程模型进行扩展,极大地提升了其灵活性和可定制性。

安全性上,Higress 全面支持主流的鉴权能力如 key-auth、hmac-auth 和 jwt-auth 等,确保服务的安全可靠。总之,作为一款来自阿里的开源项目,Higress 不仅功能强大而且具有高度的实用性。

Higress基于Docker的单机快速部署指南

Higress 是一个高性能、云原生的API网关,支持多种协议和服务发现机制。以下是如何通过Docker在单机环境中快速部署Higress,并配置一个简单的Hello World示例。

前提条件
  • 安装了Docker环境(建议使用最新版本)
  • 有基本的Docker操作知识
步骤1: 拉取Higress Docker镜像

首先,你需要从Docker Hub拉取最新的Higress镜像。打开终端并运行以下命令:

docker pull higress/higress-gateway:latest
步骤2: 准备Higress配置文件

创建一个新的目录来存放Higress相关的配置文件,比如higress-configs,然后在这个目录里创建两个文件:higress.yamlhello-service.yaml

higress.yaml
这个文件用于定义Higress的基本设置和监听端口等信息。

apiVersion: networking.higress.io/v1alpha1
kind: Gateway
metadata:
  name: my-higress-gateway
spec:
  selector:
    app: higress
  listeners:
  - port: 80
    protocol: HTTP
    routes:
      - match: /hello
        services:
          - name: hello-world-service
            port: 8080

hello-service.yaml
定义你的服务如何被暴露。

apiVersion: v1
kind: Service
metadata:
  name: hello-world-service
spec:
  ports:
  - port: 8080
    targetPort: 8080
  selector:
    app: hello-world-app
步骤3: 启动Hello World应用

为了测试Higress是否正确转发请求到后端服务,我们需要先启动一个简单的HTTP服务器作为例子。这里我们选择使用Python的SimpleHTTPServer模块。

确保你安装了Python环境,然后在同一目录下创建一个名为app.py的文件:

from http.server import BaseHTTPRequestHandler, HTTPServer

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'Hello, world!')

def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler):
    server_address = ('', 8080)
    httpd = server_class(server_address, handler_class)
    print(f'Starting httpd on {server_address[0]}:{server_address[1]}')
    httpd.serve_forever()

if __name__ == "__main__":
    run()

接着,以容器形式运行此应用:

docker run --name hello-world-app -p 8080:8080 -d python:3.9-slim bash -c "pip install http.server && python3 -m http.server 8080"

注意:上述命令假设了一个更简单的HTTP服务器实现;如果要使用app.py中的代码,请适当调整Docker命令来执行它。

步骤4: 配置并启动Higress

现在我们可以用之前准备好的配置文件启动Higress了。执行如下命令:

docker run --name higress-gateway -v $(pwd)/higress-configs:/configs -p 80:80 -d higress/higress-gateway:latest --config-path=/configs/higress.yaml
测试部署

打开浏览器或使用curl工具访问http://localhost/hello,你应该能看到"Hello, world!"的信息显示出来。

这表明整个设置已经成功完成,Higress正正确地将请求路由至后台的Hello World服务。


以上就是基于Docker的Higress单机版快速部署过程。Higress也支持使用Kubernetes等方式来做部署和集成,具体可以去higress官网查询更多详情。