精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

工作中最常用的六種API網關

網絡 網絡管理
有些小伙伴在工作中可能會問:我們的系統直接調用微服務不是更簡單嗎?為什么非要引入API網關這個"中間商"呢?

前言

API網關在項目中非常重要。

今天這篇文章跟大家一起聊聊工作最常用的6種網關,希望對你會有所幫助。

一、為什么需要API網關?

有些小伙伴在工作中可能會問:我們的系統直接調用微服務不是更簡單嗎?

為什么非要引入API網關這個"中間商"呢?

讓我們先來看一個實際的例子。

沒有網關的微服務困境

// 前端直接調用多個微服務 - 問題重重
@RestController
public class FrontendController {
    
    // 問題1:服務地址硬編碼
    @Value("${user.service.url:http://localhost:8081}")
    private String userServiceUrl;
    
    @Value("${order.service.url:http://localhost:8082}")
    private String orderServiceUrl;
    
    @Autowired
    private RestTemplate restTemplate;
    
    @GetMapping("/user-dashboard")
    public UserDashboard getUserDashboard(@RequestHeader("Authorization") String token) {
        // 問題2:每個服務都要重復認證邏輯
        if (!validateToken(token)) {
            throw new UnauthorizedException("Token invalid");
        }
        
        // 問題3:需要手動處理服務間調用順序
        User user = restTemplate.getForObject(userServiceUrl + "/users/current", User.class);
        List<Order> orders = restTemplate.getForObject(orderServiceUrl + "/orders?userId=" + user.getId(), List.class);
        
        // 問題4:錯誤處理復雜
        if (user == null || orders == null) {
            throw new ServiceUnavailableException("Backend service unavailable");
        }
        
        return new UserDashboard(user, orders);
    }
    
    // 問題5:重復的認證代碼
    private boolean validateToken(String token) {
        // 每個接口都要實現的認證邏輯
        return token != null && token.startsWith("Bearer ");
    }
}

引入網關后的優雅架構

// 網關統一處理所有橫切關注點
@Configuration
public class GatewayConfig {
    
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("user_service", r -> r.path("/api/users/**")
                .uri("lb://user-service"))
            .route("order_service", r -> r.path("/api/orders/**")
                .uri("lb://order-service"))
            .route("product_service", r -> r.path("/api/products/**")
                .uri("lb://product-service"))
            .build();
    }
}

// 前端只需調用網關
@RestController
public class FrontendController {
    
    @Autowired
    private RestTemplate restTemplate;
    
    @GetMapping("/api/user-dashboard")
    public UserDashboard getUserDashboard() {
        // 網關已經處理了認證、路由、負載均衡等問題
        return restTemplate.getForObject("http://gateway/api/users/current/dashboard", UserDashboard.class);
    }
}

API網關的核心價值

讓我們通過架構圖來理解網關在微服務架構中的關鍵作用:

圖片圖片

網關解決的8大核心問題:

  1. 統一入口:所有請求都通過網關進入系統
  2. 認證授權:集中處理身份驗證和權限控制
  3. 流量控制:限流、熔斷、降級等 resiliency 模式
  4. 監控統計:統一的日志、指標收集
  5. 協議轉換:HTTP/1.1、HTTP/2、gRPC 等協議適配
  6. 緩存加速:響應緩存降低后端壓力
  7. 安全防護:WAF、防爬蟲、防重放攻擊
  8. 服務治理:服務發現、負載均衡、路由轉發

下面我們一起看看工作中最常見的6種API網關有哪些。

二、Spring Cloud Gateway

有些小伙伴在Spring技術棧中開發微服務,Spring Cloud Gateway 無疑是最自然的選擇。

作為Spring官方推出的第二代網關,它基于WebFlux響應式編程模型,性能卓越。

核心架構深度解析

@Configuration
public class AdvancedGatewayConfig {
    
    @Bean
    @Order(-1)
    public GlobalFilter customGlobalFilter() {
        return (exchange, chain) -> {
            // 前置處理
            long startTime = System.currentTimeMillis();
            ServerHttpRequest request = exchange.getRequest();
            
            // 添加追蹤ID
            String traceId = UUID.randomUUID().toString();
            ServerHttpRequest mutatedRequest = request.mutate()
                .header("X-Trace-Id", traceId)
                .build();
                
               return chain.filter(exchange.mutate().request(mutatedRequest).build())
                .then(Mono.fromRunnable(() -> {
                    // 后置處理
                    long duration = System.currentTimeMillis() - startTime;
                    log.info("Request {} completed in {}ms", traceId, duration);
                }));
        };
    }
    
    @Bean
    public RouteLocator advancedRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            // 用戶服務 - 帶熔斷和重試
            .route("user_service", r -> r.path("/api/users/**")
                .filters(f -> f
                    .circuitBreaker(config -> config
                        .setName("userServiceCB")
                        .setFallbackUri("forward:/fallback/user-service"))
                    .retry(config -> config
                        .setRetries(3)
                        .setMethods(HttpMethod.GET, HttpMethod.POST)
                        .setBackoff(100L, 1000L, 2, true))
                    .requestRateLimiter(config -> config
                        .setRateLimiter(redisRateLimiter())
                        .setKeyResolver(apiKeyResolver()))
                    .modifyRequestBody(String.class, String.class, 
                        (exchange, s) -> Mono.just(validateAndTransform(s))))
                .uri("lb://user-service"))
            
            // 訂單服務 - 帶JWT認證
            .route("order_service", r -> r.path("/api/orders/**")
                .filters(f -> f
                    .filter(jwtAuthenticationFilter())
                    .prefixPath("/v1")
                    .addResponseHeader("X-API-Version", "1.0"))
                .uri("lb://order-service"))
            
            // 商品服務 - 靜態資源緩存
            .route("product_service", r -> r.path("/api/products/**")
                .filters(f -> f
                    .dedupeResponseHeader("Cache-Control", "RETAIN_FIRST")
                    .setResponseHeader("Cache-Control", "public, max-age=3600"))
                .uri("lb://product-service"))
            .build();
    }
    
    @Bean
    public JwtAuthenticationFilter jwtAuthenticationFilter() {
        return new JwtAuthenticationFilter();
    }
    
    @Bean
    public RedisRateLimiter redisRateLimiter() {
        return new RedisRateLimiter(10, 20);
    }
    
    @Bean
    public KeyResolver apiKeyResolver() {
        return exchange -> {
            String apiKey = exchange.getRequest().getHeaders().getFirst("X-API-Key");
            return Mono.just(Optional.ofNullable(apiKey).orElse("anonymous"));
        };
    }
}

// JWT認證過濾器
@Component
class JwtAuthenticationFilter implements GatewayFilter {
    
    @Autowired
    private JwtUtil jwtUtil;
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = extractToken(exchange.getRequest());
        
        if (token == null) {
            return onError(exchange, "Missing authentication token", HttpStatus.UNAUTHORIZED);
        }
        
        try {
            Claims claims = jwtUtil.parseToken(token);
            String username = claims.getSubject();
            
            // 將用戶信息添加到header
            ServerHttpRequest mutatedRequest = exchange.getRequest().mutate()
                .header("X-User-Name", username)
                .header("X-User-Roles", String.join(",", claims.get("roles", List.class)))
                .build();
                
               return chain.filter(exchange.mutate().request(mutatedRequest).build());
        } catch (Exception e) {
            return onError(exchange, "Invalid token: " + e.getMessage(), HttpStatus.UNAUTHORIZED);
        }
    }
    
    private String extractToken(ServerHttpRequest request) {
        String bearerToken = request.getHeaders().getFirst("Authorization");
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
            return bearerToken.substring(7);
        }
        return null;
    }
    
    private Mono<Void> onError(ServerWebExchange exchange, String err, HttpStatus status) {
        exchange.getResponse().setStatusCode(status);
        DataBuffer buffer = exchange.getResponse().bufferFactory()
            .wrap(("{\"error\":\"" + err + "\"}").getBytes());
        return exchange.getResponse().writeWith(Mono.just(buffer));
    }
}

Spring Cloud Gateway 執行流程

圖片圖片

優點:

  • 與Spring Cloud生態完美集成
  • 基于WebFlux,性能優秀
  • 功能豐富,支持過濾器和斷言
  • 配置靈活,支持代碼和配置文件兩種方式

缺點:

  • 對非Spring技術棧不友好
  • 學習曲線相對陡峭
  • 依賴Spring Cloud組件

使用場景:

  • Spring Cloud微服務架構
  • 需要深度定制網關邏輯
  • 團隊熟悉Spring技術棧

三、Kong:企業級API網關標桿

有些小伙伴在企業級場景中需要更高的性能和更豐富的功能,Kong就是這樣一個基于Nginx和OpenResty的高性能API網關。

Kong 配置實戰

# kong.yml - 聲明式配置
_format_version:"2.1"
_transform:true

services:
-name:user-service
    url:http://user-service:8080
    routes:
      -name:user-route
        paths:["/api/users"]
        strip_path:true
    plugins:
      -name:key-auth
        config:
          key_names:["apikey"]
          hide_credentials:true
      -name:rate-limiting
        config:
          minute:10
          policy:redis
      -name:prometheus
        enabled:true

-name:order-service
    url:http://order-service:8080
    routes:
      -name:order-route
        paths:["/api/orders"]
        methods:["GET","POST","PUT"]
    plugins:
      -name:cors
        config:
          origins:["https://example.com"]
          methods:["GET","POST","PUT"]
          headers:["Accept","Authorization","Content-Type"]
      -name:request-transformer
        config:
          add:
            headers:["X-From-Kong:true"]
          remove:
            headers: ["User-Agent"]

consumers:
-username:mobile-app
    keyauth_credentials:
      -key:mobile-key-123
-username:web-app
    keyauth_credentials:
      -key:web-key-456

plugins:
-name:ip-restriction
    config:
      allow:["192.168.0.0/16","10.0.0.0/8"]
-name:correlation-id
    config:
      header_name:"X-Request-ID"
      generator:"uuid"

自定義Kong插件開發

-- kong/plugins/request-validator/handler.lua
local BasePlugin = require"kong.plugins.base_plugin"
local cjson = require"cjson"

local RequestValidator = BasePlugin:extend()

function RequestValidator:new()
  RequestValidator.super.new(self, "request-validator")
end

function RequestValidator:access(conf)
  RequestValidator.super.access(self)

local headers = kong.request.get_headers()
local method = kong.request.get_method()
local body = kong.request.get_raw_body()

-- API Key驗證
local api_key = headers["X-API-Key"]
ifnot api_key then
    kong.response.exit(401, { message = "Missing API Key" })
end

-- 驗證API Key格式
ifnotstring.match(api_key, "^%x%x%x%-%x%x%x%-%x%x%x$") then
    kong.response.exit(401, { message = "Invalid API Key format" })
end

-- 請求體驗證
if method == "POST"or method == "PUT"then
    ifnot body or body == ""then
      kong.response.exit(400, { message = "Request body is required" })
    end
    
    local ok, json_body = pcall(cjson.decode, body)
    ifnot ok then
      kong.response.exit(400, { message = "Invalid JSON format" })
    end
    
    -- 業務規則驗證
    if json_body.amount andtonumber(json_body.amount) <= 0then
      kong.response.exit(400, { message = "Amount must be greater than 0" })
    end
end

-- 添加驗證通過標記
  kong.service.request.set_header("X-Request-Validated", "true")
  kong.service.request.set_header("X-API-Key", api_key)

-- 記錄審計日志
  kong.log.info("Request validated for API Key: ", api_key)
end

return RequestValidator

Kong 集群架構

圖片圖片

優點:

  • 基于Nginx,性能極高
  • 插件生態豐富
  • 支持集群部署
  • 成熟的監控和管理界面

缺點:

  • 依賴數據庫(PostgreSQL/Cassandra)
  • 插件開發需要Lua知識
  • 配置相對復雜

使用場景:

  • 高并發企業級應用
  • 需要豐富插件功能的場景
  • 已有Kong技術棧的團隊

四、Nginx:經典反向代理網關

有些小伙伴在傳統架構或簡單場景中,Nginx仍然是最可靠的選擇。它雖然功能相對簡單,但性能卓越且穩定。

Nginx 配置詳解

# nginx.conf - 生產環境配置
http {
    # 基礎配置
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    # 日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" '
                    'rt=$request_time uct="$upstream_connect_time" '
                    'uht="$upstream_header_time" urt="$upstream_response_time"';

    # 上游服務配置
    upstream user_service {
        server user-service-1:8080 weight=3;
        server user-service-2:8080 weight=2;
        server user-service-3:8080 weight=1;

        # 健康檢查
        check interval=3000 rise=2 fall=3 timeout=1000;
    }

    upstream order_service {
        server order-service-1:8080;
        server order-service-2:8080;

        # 會話保持
        hash $cookie_jsessionid;
        hash_again 1;
    }

    upstream product_service {
        server product-service:8080;

        # 備份服務器
        server backup-product-service:8080 backup;
    }

    # API網關配置
    server {
        listen 80;
        server_name api.example.com;

        # 全局限流
        limit_req_zone $binary_remote_addr znotallow=api:10m rate=10r/s;

        # 用戶服務路由
        location /api/users/ {
            limit_req znotallow=api burst=20 nodelay;

            # 反向代理配置
            proxy_pass http://user_service;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            # 超時配置
            proxy_connect_timeout 5s;
            proxy_read_timeout 10s;
            proxy_send_timeout 10s;

            # 重試機制
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_next_upstream_tries 3;
            proxy_next_upstream_timeout 10s;

            # 緩存配置
            proxy_cache api_cache;
            proxy_cache_key "$scheme$request_method$host$request_uri";
            proxy_cache_valid 200 302 5m;
            proxy_cache_valid 404 1m;

            # 添加安全頭
            add_header X-Frame-Options DENY;
            add_header X-Content-Type-Options nosniff;
            add_header X-XSS-Protection "1; mode=block";
        }

        # 訂單服務路由
        location /api/orders/ {
            # JWT驗證
            auth_request /auth;
            auth_request_set $user $upstream_http_x_user;
            proxy_set_header X-User $user;

            proxy_pass http://order_service;

            # CORS配置
            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type';
                add_header 'Access-Control-Max-Age' 86400;
                return 204;
            }
        }

        # 認證端點
        location = /auth {
            internal;
            proxy_pass http://auth_service/validate;
            proxy_pass_request_body off;
            proxy_set_header Content-Length "";
            proxy_set_header X-Original-URI $request_uri;
        }

        # 健康檢查端點
        location /health {
            access_log off;
            return 200 "healthy\n";
            add_header Content-Type text/plain;
        }

        # 監控端點
        location /nginx-status {
            stub_status on;
            access_log off;
            allow 192.168.0.0/16;
            deny all;
        }
    }
}

Nginx 請求處理流程

圖片圖片

優點:

  • 性能極高,C語言編寫
  • 配置相對簡單
  • 資源消耗低
  • 社區成熟,資料豐富

缺點:

  • 動態配置能力弱
  • 功能相對基礎
  • 需要reload生效配置變更

使用場景:

  • 高性能要求的簡單路由
  • 靜態資源服務
  • 傳統架構升級

五、APISIX:云原生API網關新星

有些小伙伴在云原生環境中需要動態配置和高性能,APISIX就是這樣一個基于etcd的云原生API網關。

APISIX 路由配置

# apisix-config.yaml
routes:
-uri:/api/users/*
    name:user-service
    methods:[GET,POST,PUT,DELETE]
    upstream:
      type:roundrobin
      nodes:
        user-service-1:8080:1
        user-service-2:8080:2
        user-service-3:8080:1
    plugins:
      proxy-rewrite:
        uri:"/users$1"
      limit-count:
        count:100
        time_window:60
        key:remote_addr
        rejected_code:503
      jwt-auth:
        key:user-service
        secret:my-secret-key
        exp:86400

-uri:/api/orders/*
    name:order-service
    upstream:
      type:chash
      key:arg_user_id
      nodes:
        order-service-1:8080:1
        order-service-2:8080:1
    plugins:
      cors:
        allow_origins:"https://example.com"
        allow_methods:"GET,POST,PUT,DELETE"
        allow_headers:"*"
      response-rewrite:
        body:'{"code": 0, "message": "success", "data": $body}'
      fault-injection:
        abort:
          http_status:500
          body:"service unavailable"
          percentage:5

-uri:/api/products/*
    name:product-service
    upstream:
      type:roundrobin
      nodes:
        product-service:8080:1
    plugins:
      proxy-cache:
        cache_key:["$uri","$args"]
        cache_zone:disk_cache_one
        cache_ttl:300
      uri-blocker:
        block_rules:["^/admin/",".php$"]
        rejected_code:403

# 全局插件
plugins:
-name:prometheus
    enable:true
-name:zipkin
    enable:true
    config:
      endpoint:http://zipkin:9411/api/v2/spans
      sample_ratio:0.001

APISIX 插件開發

-- apisix/plugins/rate-limit-advanced/init.lua
local core = require("apisix.core")
local plugin_name = "rate-limit-advanced"

local schema = {
    type = "object",
    properties = {
        rate = {type = "integer", minimum = 1},
        burst = {type = "integer", minimum = 0},
        key = {type = "string"},
        window = {type = "integer", minimum = 1},
        rejected_code = {type = "integer", default = 429},
        rejected_msg = {type = "string", default = "rate limit exceeded"}
    },
    required = {"rate", "key"}
}

local _M = {
    version = 1.0,
    priority = 1000,
    name = plugin_name,
    schema = schema,
}

function _M.check_schema(conf)
    return core.schema.check(schema, conf)
end

function _M.access(conf, ctx)
    local key = conf.key
    if key == "remote_addr"then
        key = ctx.var.remote_addr
    elseif key == "server_addr"then
        key = ctx.var.server_addr
    end
    
    local rate = conf.rate
    local burst = conf.burst or0
    local window = conf.window or60
    
    -- 使用redis進行分布式限流
    local redis = require("resty.redis")
    local red = redis:new()
    
    local ok, err = red:connect("127.0.0.1", 6379)
    ifnot ok then
        core.log.error("failed to connect to redis: ", err)
        return500
    end
    
    local current_time = ngx.now()
    local key_name = "rate_limit:" .. key
    
    -- 使用令牌桶算法
    local tokens = red:get(key_name)
    if tokens then
        tokens = tonumber(tokens)
    else
        tokens = burst
    end
    
    local last_update = red:get(key_name .. ":time")
    if last_update then
        last_update = tonumber(last_update)
        local elapsed = current_time - last_update
        local new_tokens = elapsed * rate / window
        
        if new_tokens > 0then
            tokens = math.min(tokens + new_tokens, burst)
        end
    end
    
    if tokens < 1then
        red:setex(key_name .. ":time", window, current_time)
        return conf.rejected_code, conf.rejected_msg
    end
    
    tokens = tokens - 1
    red:setex(key_name, window, tokens)
    red:setex(key_name .. ":time", window, current_time)
end

return _M

優點:

  • 配置熱更新,無需重啟
  • 性能卓越
  • 插件生態豐富
  • 云原生友好

缺點:

  • 相對較新,生態不如Kong成熟
  • 依賴etcd
  • 學習成本較高

使用場景:

  • 云原生環境
  • 需要動態配置的場景
  • 高性能要求的微服務架構

六、Zuul:Netflix經典網關

有些小伙伴在傳統Spring Cloud項目中可能還在使用Zuul,雖然它已被Spring Cloud Gateway取代,但了解其原理仍有價值。

Zuul 過濾器實戰

// Zuul前置過濾器 - 認證和限流
@Component
public class AuthPreFilter extends ZuulFilter {
    
    @Autowired
    private RateLimiterService rateLimiter;
    
    @Autowired
    private JwtTokenProvider tokenProvider;
    
    @Override
    public String filterType() {
        return "pre";
    }
    
    @Override
    public int filterOrder() {
        return 1;
    }
    
    @Override
    public boolean shouldFilter() {
        return true;
    }
    
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        
        // 1. 限流檢查
        String clientId = getClientId(request);
        if (!rateLimiter.tryAcquire(clientId)) {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(429);
            ctx.setResponseBody("{\"error\": \"Rate limit exceeded\"}");
            return null;
        }
        
        // 2. JWT認證
        String token = extractToken(request);
        if (token == null && requiresAuth(request)) {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            ctx.setResponseBody("{\"error\": \"Authentication required\"}");
            return null;
        }
        
        if (token != null) {
            try {
                Claims claims = tokenProvider.parseToken(token);
                ctx.addZuulRequestHeader("X-User-Id", claims.getSubject());
                ctx.addZuulRequestHeader("X-User-Roles", 
                    String.join(",", claims.get("roles", List.class)));
            } catch (Exception e) {
                ctx.setSendZuulResponse(false);
                ctx.setResponseStatusCode(401);
                ctx.setResponseBody("{\"error\": \"Invalid token\"}");
                return null;
            }
        }
        
        // 3. 添加追蹤信息
        ctx.addZuulRequestHeader("X-Request-ID", UUID.randomUUID().toString());
        ctx.addZuulRequestHeader("X-Forwarded-For", request.getRemoteAddr());
        
        return null;
    }
    
    private String getClientId(HttpServletRequest request) {
        String apiKey = request.getHeader("X-API-Key");
        return apiKey != null ? apiKey : request.getRemoteAddr();
    }
    
    private String extractToken(HttpServletRequest request) {
        String bearerToken = request.getHeader("Authorization");
        if (bearerToken != null && bearerToken.startsWith("Bearer ")) {
            return bearerToken.substring(7);
        }
        return null;
    }
    
    private boolean requiresAuth(HttpServletRequest request) {
        String path = request.getRequestURI();
        return !path.startsWith("/api/public/") && 
               !path.equals("/health") && 
               !path.startsWith("/actuator/");
    }
}

// Zuul后置過濾器 - 響應處理
@Component
public class ResponsePostFilter extends ZuulFilter {
    
    private static final Logger logger = LoggerFactory.getLogger(ResponsePostFilter.class);
    
    @Override
    public String filterType() {
        return "post";
    }
    
    @Override
    public int filterOrder() {
        return 1000;
    }
    
    @Override
    public boolean shouldFilter() {
        return true;
    }
    
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        HttpServletResponse response = ctx.getResponse();
        
        long startTime = (Long) ctx.get("startTime");
        long duration = System.currentTimeMillis() - startTime;
        
        // 記錄訪問日志
        logger.info("{} {} {} {} {}ms", 
            request.getRemoteAddr(),
            request.getMethod(),
            request.getRequestURI(),
            response.getStatus(),
            duration);
        
        // 添加響應頭
        response.setHeader("X-Response-Time", duration + "ms");
        response.setHeader("X-API-Version", "1.0");
        
        // 統一響應格式
        if (ctx.getResponseBody() != null && 
            response.getContentType() != null && 
            response.getContentType().contains("application/json")) {
            
            String originalBody = ctx.getResponseBody();
            String wrappedBody = "{\"code\": 0, \"data\": " + originalBody + ", \"timestamp\": " + 
                System.currentTimeMillis() + "}";
            ctx.setResponseBody(wrappedBody);
        }
        
        return null;
    }
}

優點:

  • 與Netflix集成良好
  • 過濾器機制靈活
  • 文檔資料豐富

缺點:

  • 性能較差(阻塞IO)
  • 已被Spring Cloud Gateway取代
  • 社區活躍度下降

使用場景:

  • 遺留Spring Cloud項目
  • Netflix技術棧
  • 非性能敏感場景

七、Traefik:云原生動態網關

有些小伙伴在容器化環境中需要自動服務發現,Traefik就是為云原生而生的動態網關。

Traefik 配置示例

# traefik.yaml
api:
dashboard:true
insecure:true

entryPoints:
web:
    address:":80"
    http:
      redirections:
        entryPoint:
          to:websecure
          scheme:https
          
websecure:
    address:":443"

certificatesResolvers:
myresolver:
    acme:
      email:admin@example.com
      storage:/etc/traefik/acme.json
      httpChallenge:
        entryPoint:web

providers:
docker:
    endpoint:"unix:///var/run/docker.sock"
    exposedByDefault:false
    
file:
    filename:/etc/traefik/dynamic.yaml
    watch:true

log:
level:INFO

accessLog:
filePath:"/var/log/traefik/access.log"
bufferingSize:100

metrics:
prometheus:
    entryPoint:websecure

# 動態配置
# dynamic.yaml
http:
middlewares:
    # 認證中間件
    auth-middleware:
      basicAuth:
        users:
          -"admin:$2y$05$YOUR_HASHED_PASSWORD"
          
    # 限流中間件  
    rate-limit-middleware:
      rateLimit:
        burst:100
        period:1m
        
    # 重試中間件
    retry-middleware:
      retry:
        attempts:3
        
    # 熔斷中間件
    circuit-breaker-middleware:
      circuitBreaker:
        expression:"NetworkErrorRatio() > 0.5"
        
    # 壓縮中間件
    compress-middleware:
      compress:{}

routers:
    # 用戶服務路由
    user-service:
      rule:"PathPrefix(`/api/users`)"
      entryPoints:
        -websecure
      middlewares:
        -rate-limit-middleware
        -compress-middleware
      service:user-service
      tls:
        certResolver:myresolver
        
    # 訂單服務路由  
    order-service:
      rule:"PathPrefix(`/api/orders`)"
      entryPoints:
        -websecure
      middlewares:
        -auth-middleware
        -rate-limit-middleware
        -circuit-breaker-middleware
      service:order-service
      tls:
        certResolver:myresolver

services:
    user-service:
      loadBalancer:
        servers:
          -url:"http://user-service-1:8080"
          -url:"http://user-service-2:8080"
        healthCheck:
          path:/health
          interval:10s
          timeout:5s
          
    order-service:
      loadBalancer:
        servers:
          -url:"http://order-service-1:8080"
          -url:"http://order-service-2:8080"

優點:

  • 自動服務發現
  • 配置簡單
  • 云原生友好
  • 內置監控和Dashboard

缺點:

  • 功能相對簡單
  • 性能不如Nginx系網關
  • 高級功能需要企業版

使用場景:

  • 容器化環境
  • 需要自動服務發現的場景
  • 快速原型開發

八、6大網關對比

通過前面的分析,我們現在對這六種API網關有了深入的了解。

讓我們通過一個全面的對比來幫助大家做出正確的技術選型。

詳細對比表格

特性維度

Spring Cloud Gateway

Kong

Nginx

APISIX

Zuul

Traefik

性能

高(WebFlux)

極高(Nginx)

極高(C)

極高(Nginx)

中(阻塞IO)

配置方式

代碼/配置

聲明式YAML

配置文件

動態配置

代碼/配置

動態配置

服務發現

Spring Cloud

插件支持

需手動配置

支持

Spring Cloud

自動發現

K8s支持

良好

良好

需Ingress

優秀

一般

優秀

監控

Micrometer

Prometheus

基礎監控

Prometheus

Hystrix

內置

學習曲線

中高

中高

適用場景

Spring Cloud

企業級

傳統架構

云原生

傳統Spring

容器化

選型決策指南

選擇Spring Cloud Gateway當:

  • 技術棧以Spring為主
  • 需要深度定制網關邏輯
  • 已經使用Spring Cloud組件
  • 團隊熟悉響應式編程

選擇Kong當:

  • 企業級高并發場景
  • 需要豐富插件生態
  • 有專業運維團隊
  • 需要成熟的管理界面

選擇Nginx當:

  • 性能要求極高
  • 場景相對簡單
  • 團隊熟悉Nginx
  • 資源受限環境

選擇APISIX當:

  • 云原生環境
  • 需要動態配置
  • 追求最新技術
  • 高性能要求

選擇Zuul當:

  • 維護遺留Spring Cloud項目
  • Netflix技術棧
  • 非性能敏感場景

選擇Traefik當:

  • 容器化部署
  • 需要自動服務發現
  • 快速開發部署
  • 配置簡單要求

總結

通過本文的介紹,我們對6種主流API網關有了全面的認識。

在選擇網關時需要考慮以下關鍵因素:

  1. 技術棧匹配:選擇與團隊技術棧最匹配的方案
  2. 性能要求:根據業務并發量選擇性能合適的網關
  3. 功能需求:評估需要的功能特性,如限流、認證、監控等
  4. 運維成本:考慮部署、監控、維護的復雜度
  5. 團隊能力:評估團隊對網關技術的掌握程度

核心建議

  1. 新項目優先考慮:Spring Cloud Gateway(Spring技術棧)或 APISIX(云原生)
  2. 高并發場景:Kong 或 Nginx
  3. 快速原型:Traefik
  4. 遺留系統:根據現有技術棧選擇

記住,沒有最好的網關,只有最合適的網關。

合理的網關選型可以大大提升系統的可維護性、可擴展性和性能表現。

責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2024-03-18 08:22:15

OOM問題java線上問題

2024-12-11 08:20:57

設計模式源碼

2025-11-10 02:11:00

2025-10-17 08:22:32

2025-08-12 08:22:29

2017-10-30 13:34:22

深度學習KerasAPI

2024-05-09 08:19:09

OOMJVM內存

2023-09-06 11:35:11

2025-04-25 07:10:00

GenAIAI工具人工智能

2023-11-03 15:35:59

2024-11-08 13:34:24

2025-06-16 08:22:23

2023-11-09 07:59:57

2015-10-12 17:17:50

用戶體驗設計錯誤

2021-09-16 11:02:49

Python線程

2024-04-28 11:22:18

2019-12-03 12:16:36

物聯網ZigBee藍牙低功耗

2025-04-17 07:10:03

API架構項目

2010-05-25 09:19:13

MySQL管理工具

2019-08-02 08:50:47

API架構微服務
點贊
收藏

51CTO技術棧公眾號

日本一区二区网站| 午夜精品福利一区二区三区蜜桃| 亚洲女同精品视频| 亚洲xxx在线观看| 神马午夜伦理不卡| 久久久久亚洲蜜桃| 成人免费在线视频网站| 日韩免费av片| 欧美高清视频在线观看mv| 日韩精品在线网站| 污污视频网站免费观看| av片在线观看| 久久精品欧美日韩| 国产99在线免费| 波多野结衣一区二区三区在线| 欧美在线91| 一区二区三区国产在线观看| 人妻av一区二区三区| 小明成人免费视频一区| 亚洲成a人片在线不卡一二三区| 日本不卡二区高清三区| 你懂的网站在线| 精品一区在线看| 日本精品在线视频 | 国产成人精品无码高潮| 久久久久久黄| 日本三级亚洲精品| 欧美一二三区在线| 日韩在线第三页| 爱啪视频在线观看视频免费| 亚洲精品美腿丝袜| 日本黄色播放器| av在线免费观看网| 久久久久久久久伊人| 国产精品视频入口| h片在线免费看| 久久精品999| 国产精品免费久久久久久| 久久青青草视频| 亚洲国产专区校园欧美| 欧美大学生性色视频| 99热这里只有精品4| 青青草国产免费一区二区下载 | 久草在线网址| 91美女福利视频| 国产伦精品一区二区三区四区免费| 国产女人18毛片18精品| 极品少妇xxxx精品少妇| 国产欧美va欧美va香蕉在线| 中文字幕+乱码+中文乱码91| 日本欧美在线观看| 国产精品一区二区性色av| 五月婷婷激情五月| 欧美a级理论片| 久久综合99re88久久爱| 欧美第一页在线| 国产亚洲精品成人| 亚洲私人影院| 午夜精品在线视频| 在线观看免费国产视频| 国产精品毛片在线| 日本亚洲欧洲色α| 亚洲婷婷久久综合| 精品一区二区三区视频在线观看| 91在线观看免费高清| 国产美女免费看| 国产成人高清视频| 狠狠色噜噜狠狠狠狠色吗综合| 人妻偷人精品一区二区三区| 99久久精品费精品国产一区二区| 欧美久久久久久久| 北岛玲一区二区三区| 国产精品成人在线观看| a级网站在线观看| 丰满大乳少妇在线观看网站| 岛国精品视频在线播放| 五月婷婷狠狠操| 99综合99| 亚洲国产欧美一区| 国产又黄又粗视频| 亚洲成人99| 97色在线观看| 精品乱码一区内射人妻无码| 国产在线视频不卡二| 国产精品入口免费| 国产youjizz在线| 亚洲欧美激情插 | 国产精品1区2区在线观看| 成人免费毛片糖心| 久久一级电影| 欧美精品18videosex性欧美| 天堂网av手机版| 美女视频一区在线观看| 91|九色|视频| 你懂得网站在线| 亚洲欧美韩国综合色| 日韩伦理在线免费观看| 日本另类视频| 亚洲电影免费观看高清完整版在线观看| 欧美多人猛交狂配| 欧美三级免费| 国产精品一区二区三区久久久| 可以免费看毛片的网站| 欧美国产日韩精品免费观看| 国产天堂视频在线观看| 外国电影一区二区| 亚洲国产精品悠悠久久琪琪| 日本女人性生活视频| 国产精品视区| 痴汉一区二区三区| 黄色的网站在线观看| 欧美日韩中文字幕在线| 超碰成人在线播放| 妖精一区二区三区精品视频| 欧美国产视频日韩| 中文字幕一区二区人妻痴汉电车 | 精品国产无码在线观看| 欧美激情亚洲| 国产精品视频精品| 毛片网站在线| 天天色天天爱天天射综合| 亚洲一区二区三区四区精品| 欧美顶级大胆免费视频| 国产精品久久久久福利| 国产精品秘入口18禁麻豆免会员 | 久久成人av少妇免费| 久久亚裔精品欧美| 成人免费网站观看| 精品国产一区二区三区四区四| 国产精品视频看看| 欧美a级理论片| 日韩精品不卡| 成人精品三级| 这里只有精品视频在线| 欧美日韩a v| 久久久精品国产99久久精品芒果| 日本中文字幕网址| 成人看片黄a免费看视频| 欧美乱大交xxxxx| 国产精品自产拍| 中文字幕一区二区在线观看| 亚洲成人av免费看| 欧美中文一区二区| 国产精品嫩草影院久久久| 国产永久免费高清在线观看视频| 日韩欧美在线看| 丰满大乳奶做爰ⅹxx视频| 日韩视频在线一区二区三区 | 在线观看精品一区| 国产一二三四五区| 麻豆精品久久久久久久99蜜桃| 欧美国产高潮xxxx1819| 91在线视频导航| caoporn免费在线视频| 欧美一级高清片| 精品爆乳一区二区三区无码av| 国产精品自拍在线| 国产精品久久国产| 欧美尿孔扩张虐视频| 26uuu另类亚洲欧美日本一| 三级视频在线| 欧美亚洲高清一区| 亚洲一级二级片| 国产激情视频一区二区三区欧美| 日韩成人三级视频| 欧美黑人做爰爽爽爽| 欧洲永久精品大片ww免费漫画| 国产网站在线播放| 欧美精品久久久久久久久老牛影院| 国产97免费视频| 成人aa视频在线观看| 欧美成人xxxxx| 日韩成人精品一区二区| 成人欧美在线视频| wwww亚洲| 在线看片第一页欧美| 国产熟女精品视频| 五月婷婷久久综合| 神马久久久久久久久久久 | 一区二区三区人妻| 宅男噜噜噜66国产日韩在线观看| 色视频一区二区三区| 日韩免费成人| 日韩免费av片在线观看| www.亚洲自拍| av网站网址在线观看| 精品国产乱码久久久久久夜甘婷婷 | 国产ts一区二区| 久久国产精品一区| 亚洲第一精品电影| 国产偷人爽久久久久久老妇app| 亚洲人成小说网站色在线 | 亚洲三级免费观看| 国产亚洲无码精品| 久久国产精品区| 男人用嘴添女人下身免费视频| 日韩精品午夜| 精品欧美一区二区三区久久久 | 丝袜诱惑亚洲看片| 久久久久久久久久伊人| 国产欧美一区| 国产精品三区四区| 国产成人视屏| 国产精品久久激情| 嗯~啊~轻一点视频日本在线观看| 日韩中文字幕免费| 亚洲欧洲综合在线| 日韩精品一区二区三区中文精品| 日韩三级一区二区| 香蕉成人伊视频在线观看| 韩国一级黄色录像| 久久久久国产精品麻豆| 国产污在线观看| 国产精品综合视频| 亚洲人视频在线| 日韩中文欧美在线| 青青视频在线播放| 亚洲精品1区2区| 妺妺窝人体色www看人体| 97精品国产福利一区二区三区| 欧美高清一区二区| 国产美女性感在线观看懂色av| 91日韩免费| 91在线国产电影| 成人亚洲综合| 日韩美女福利视频| 日本不卡1234视频| 98精品在线视频| 欧美大片黄色| 色综合老司机第九色激情| 日本精品在线| 最近免费中文字幕视频2019| 黄色免费在线播放| 国产视频精品免费播放| 熟妇高潮一区二区高潮| 日韩精品一区二| 精品毛片在线观看| 欧美一级视频精品观看| 国产免费无遮挡| 欧美乱熟臀69xxxxxx| 中文字幕在线观看国产| 精品视频一区二区三区免费| 波多野结衣电车| 欧美午夜理伦三级在线观看| 无码人妻aⅴ一区二区三区有奶水 无码免费一区二区三区 | 欧美乱妇23p| 97精品人妻一区二区三区| 欧美日韩午夜影院| 一级片免费观看视频| 7777精品伊人久久久大香线蕉| 夜夜嗨aⅴ一区二区三区| 欧美精品一二三| 国产情侣在线播放| 日韩欧美一区二区久久婷婷| www.com欧美| 91成人国产| 国产精品美女www| 成人h在线观看| 国产专区精品视频| 精品国产一级| 国产精品免费在线| 性欧美xxxx免费岛国不卡电影| 久久精品人人做人人爽电影| 国产精品探花在线观看| 亚洲综合第一| 欧美区日韩区| 日本福利视频在线| 日本午夜精品视频在线观看| 一个色综合久久| 国产mv日韩mv欧美| 国产男女猛烈无遮挡a片漫画 | 蜜桃麻豆91| 成人羞羞视频在线看网址| 欧美三级午夜理伦三级老人| 亚洲国产一区二区精品专区| 日日摸天天爽天天爽视频| 久久99九九99精品| 人妻换人妻a片爽麻豆| 久久这里只有精品6| 小向美奈子av| 五月天激情综合| 中文字幕有码无码人妻av蜜桃| 欧美成人官网二区| 国产乱视频在线观看| 欧美成人免费va影院高清| 天堂√中文最新版在线| 国产日韩专区在线| 欧美丝袜美腿| 在线综合视频网站| 国产一区二区三区久久| 午夜激情av在线| 日韩精品极品| 欧美精品少妇一区二区三区| 亚洲精品网站在线| 中文字幕精品久久| 久久久123| 国产日韩欧美在线| 精品网站aaa| 最新精品视频| 久久久久国产一区二区| av影片在线播放| 国产精品国产自产拍高清av| xxxx.国产| 日韩一区二区高清| 国产三级电影在线| 91精品国产高清久久久久久久久| 青青青国产精品| 蜜桃麻豆91| 91久久综合| www.亚洲自拍| 国产精品免费视频网站| www欧美在线| 欧美v国产在线一区二区三区| yw193.com尤物在线| 午夜精品美女自拍福到在线| 精品91福利视频| 亚洲精品tv久久久久久久久| 一区二区三区导航| 五月天丁香社区| 亚洲日本一区二区三区| 成人黄色片在线观看| 亚洲男人天堂2024| 55av亚洲| 国产精品一区二区三区免费观看| 91精品啪在线观看国产81旧版| wwwwww.色| 国产午夜一区二区三区| 91精品国产乱码久久久张津瑜| 日韩欧美国产麻豆| 97影院秋霞午夜在线观看| 国产精品视频久久久久| 成人网视频在线观看| 国产日韩三级在线| 在线观看成人毛片| 在线成人免费视频| 免费在线观看黄| 国产日韩av在线播放| 久久日文中文字幕乱码| 亚洲欧洲日本精品| 国产精品私房写真福利视频| 伊人成年综合网| 在线视频免费一区二区| 成人深夜福利| 亚洲免费在线精品一区| 麻豆精品久久久| 战狼4完整免费观看在线播放版| 欧洲精品视频在线观看| 国产日产精品久久久久久婷婷| 日本伊人精品一区二区三区介绍| 亚洲精品国产动漫| 国产又粗又长又大的视频| 亚洲国产精品ⅴa在线观看| 日韩xxx视频| 色妞一区二区三区| 国产精品亚洲四区在线观看| japanese在线播放| 国产99精品国产| 国产一区二区三区影院| 日韩精品在线电影| 日韩高清中文字幕一区二区| 亚洲视频精品一区| 国产尤物一区二区| 久久久久久蜜桃| 日韩精品日韩在线观看| 欧美日韩五码| 正在播放一区二区三区| 国产很黄免费观看久久| 亚洲一区 视频| 亚洲四色影视在线观看| 成人污污视频| 成年人网站国产| 国产片一区二区| 国产口爆吞精一区二区| 97香蕉久久超级碰碰高清版| 啪啪亚洲精品| 亚洲一区二区三区四区精品| 天天影视色香欲综合网老头| 国产精品一区二区婷婷| 91久久精品国产| 樱花草涩涩www在线播放| 欧美变态口味重另类| 午夜av在线免费观看| 久久精品中文字幕一区二区三区 | 蜜芽在线免费观看| 高清视频在线观看一区| 老司机亚洲精品| 精品国产乱码久久久久久鸭王1 | 亚洲在线视频观看| 日韩午夜av| h色网站在线观看| 精品在线欧美视频| av在线播放一区二区| 欧美牲交a欧美牲交| 中文字幕一区不卡| 香港一级纯黄大片| 亚洲999一在线观看www| 欧美一级久久| 久久久国产精品黄毛片| 自拍偷拍亚洲在线| 亚洲精品亚洲人成在线观看|