统一网关--gateway(仅供自己参考)

1、网关的概念:

2、网关的功能:

(1):身份认证和权限校验

(2):服务路由(具体的业务路由到具体的服务),负载均衡(多台服务的话,服务之间进行负载均衡)

(3):请求限流(不能超过服务承受的最大请求)

3、springcloud中网关实现的两种方式:

(1):zuul

(2):gateway

两个的优缺点:zuul是基于servlet实现的阻塞式编程,而gateway是基于spring5提供的webflux实现的响应式的编程。gateway的性能比较好,吞吐量比较好

二、

1、gateway的基本配置

2、路由断言工厂(Route Predicates Factory):

  • :我们配置文件中配置的路由字符串规则会被factory路由工厂读取,然后将这些字符串规则转为判断条件。当有请求进入,看这个请求是否符合这些条件。符合则向服务器转发, 不符合则返回404

三、路由过滤器(GatewayFilter)可以对进入网关的请求和微服务的响应做处理

1、局部路由过滤器:(在相应路由的微服务生效)

添加方式:

复制代码
    gateway:
      routes:
        - id: user-service  #路由id,唯一即可
          #uri: http://loaclhost:8080  目标地址也可以是这样,但常用的是下方的
          uri: lb://user-server  #路径的目标地址,lb负载均衡。user-service是具体的服务名称
          predicates:
            - Path=/user/**

        - id: order-service
          uri: lb://order-server
          predicates:
            - Path=/order/**
      default-filters:
        - AddRequestHeader=truth,cc is awesome #全局default
#          filters:
#            - AddRequestHeader=truth,cc is awesome  #局部

2、默认路由过滤器:default-filters(所有的微服务都可以生效)

3、全局过滤器(GlobalFilter):在已经有了一个default-filter全局的情况下为什么还需要这个全局的呢?因为全局过滤器可以更好地实现逻辑的处理。default-filter是配置的情况,复杂逻辑难以实现,所以产生了全局过滤器。

java 复制代码
package org.example.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
@Order(1)   //设置过滤器的等级,越小等级越高,负数也可以
public class AuthGlobalFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        ServerHttpRequest request = exchange.getRequest();  //请求request
        HttpHeaders headers = request.getHeaders();
        MultiValueMap<String, String> queryParams = request.getQueryParams(); //request中携带的参数
        String auth = queryParams.getFirst("auth"); //获取某一个参数
        if("admin".equals(auth))    //参数相等则继续到下一个过滤器
        {
            return chain.filter(exchange);  //放行
        }

        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //设置响应code

        return exchange.getResponse().setComplete();    //拦截返回
    }
}

4、过滤器的执行顺序,局部和默认过滤器的order值为1,如果下面有多个则依次增大。

如果全局和局部和默认过滤器的order值相等的话,则依次按照默认->局部->全局的执行顺序

五、Gateway的cors的跨域问题:

跨域:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

跨域出现的情况:

  1. 不同协议 :比如从 http://example.com 请求 https://example.com

  2. 不同域名 :从 http://example.com 请求 http://another-domain.com

  3. 不同端口 :从 http://example.com:80 请求 http://example.com:8080

解决方案:CORS

java 复制代码
spring:
  cloud:
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':  #拦截所有请求,所有请求都必须经过跨域
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:8090"
              - "http://www.leyou.com"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期
相关推荐
大灰狼来喽1 天前
OpenClaw 多平台接入全指南:Telegram + Discord + 飞书 + WhatsApp,一个 Gateway 管所有
gateway·飞书
没有bug.的程序员2 天前
S 级 SaaS 平台的物理雪崩:Spring Cloud Gateway 多租户动态路由与 UserID 极限分片
java·gateway·springboot·saas·springcloud·多租户、·userid
code_pgf2 天前
Jetson Orin NX 16G设备上配置AI服务自动启动的方案,包括Ollama、llama-server和OpenClaw Gateway三个组件
数据库·人工智能·安全·gateway·边缘计算·llama
tumeng07112 天前
当遇到 502 错误(Bad Gateway)怎么办
gateway
团子和二花3 天前
openclaw平替之nanobot源码解析(八):Gateway进阶——定时任务与心跳机制
人工智能·gateway
团子和二花3 天前
openclaw平替之nanobot源码解析(七):Gateway与多渠道集成
python·gateway·agent·智能体·openclaw·nanobot
Xpower 174 天前
OpenClaw实战:从零开发电商小程序(2)
人工智能·语言模型·小程序·gateway
脱脱克克5 天前
云端 OpenClaw 远程执行本地进程原理机制详解:Gateway、approvals 与 system.run 到底谁在判定、谁在执行?
linux·gateway·openclaw
七夜zippoe6 天前
OpenClaw Gateway 服务:启动、停止、监控
微服务·架构·gateway·监控·openclaw
arvin_xiaoting6 天前
OpenClaw学习总结_I_核心架构系列_Gateway架构详解
学习·架构·llm·gateway·ai-agent·飞书机器人·openclaw