十分钟学会Gateway网关

Gateway网关

网关功能:

  • 身份认证和权限校验
  • 服务路由,负载均衡
  • 请求限流

在SpringCloud中网关的实现有两种:

  • gateway
  • zuul

Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。


搭建网关服务

  1. 引入依赖
<!--        注册中心依赖,网关也是一个服务,也要注册-->      
		<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
<!--        网关的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
  1. 配置
server:
  port: 10010 #网关端口
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos地址
    gateway:
      routes: # 网关路由配置
        - id: user-server #路由id,自定义,唯一就行
          # uri,可以写固定地址:http:127.0.0.1:8080
          uri: lb://userserver # 路由的目标地址,lb的意思是loadbandle负载均衡
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 按照路径匹配,只要以/user/开头的请求都符合要求
        - id: order-server
          uri: lb://orderserver
          predicates:
            - Path=/order/**

网关路由可以配置的内容包括:

  • 路由id:路由唯一标示
  • uri:路由目的地,支持lb和http两种
  • predicates: 路由断言,判断请求是否符合要求,符合则转发到路由目的地
  • filters:路由过滤器,处理请求或响应

在这里插入图片描述

请求先进入网关,由网关根据路由规则判断是否匹配,匹配到了根据服务名去注册中心拉取服务,经过负载均衡规则判断发送到哪个具体的实例上


路由断言工厂

路由断言工厂Route Predicate Factory

读取路由规则,然后解析成判断条件,对请求做出判断

在这里插入图片描述


路由过滤器

在这里插入图片描述

过滤器有三十多种,具体可以看路由过滤器


举个例子

针对某个服务的请求头,添加一个请求头信息:

gateway:
  routes: # 网关路由配置
    - id: user-server #路由id,自定义,唯一就行
      # uri,可以写固定地址:http:127.0.0.1:8080
      uri: lb://userserver # 路由的目标地址,lb的意思是loadbalancer负载均衡
      predicates: # 路由断言,判断请求是否符合规则
        - Path=/user/** # 按照路径匹配,只要以/user/开头的请求都符合要求
      filters:
        - AddRequestHeader=Hello,welcome to userserver!
    - id: order-server
      uri: lb://orderserver
      predicates:
        - Path=/order/**
        - Before=2031-01-20T17:42:47.789-07:00[America/Denver]

如果是要给所有的服务都添加一个请求头信息:针对所有请求都生效

gateway:
  routes: # 网关路由配置
    - id: user-server #路由id,自定义,唯一就行
      # uri,可以写固定地址:http:127.0.0.1:8080
      uri: lb://userserver # 路由的目标地址,lb的意思是loadbalancer负载均衡
      predicates: # 路由断言,判断请求是否符合规则
        - Path=/user/** # 按照路径匹配,只要以/user/开头的请求都符合要求
    - id: order-server
      uri: lb://orderserver
      predicates:
        - Path=/order/**
        - Before=2031-01-20T17:42:47.789-07:00[America/Denver]
  default-filters:
    - AddRequestHeader=Hello,welcome to userserver!

全局过滤器

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。

作用:

对所有路由都生效的过滤器,可以自定义处理逻辑

实现步骤:

  1. 实现GlobalFilter接口
  2. 添加@Order()注解或者实现Ordered接口
  3. 编写逻辑

举个例子

请求带authorization=admin才能正确访问

@Component
@Order(-1)
public class AuthorizeFilter implements GlobalFilter {
    /**
     * 全局过滤器,有处理逻辑的能力,路由过滤器没有处理逻辑的能力
     * @param exchange 过滤器上下文,可以获取request跟responed
     * @param chain 过滤器链
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//        1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
//        2.获取参数中的authorize
        String authorization = queryParams.getFirst("authorization");
//        3.判断参数值是否等于admin
        if ("admin".equals(authorization)) {
//        4.是,放行
            return chain.filter(exchange);
        }
//        5.不是,拦截
//        5.1设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//        5.2拦截返回
        return exchange.getResponse().setComplete();
    }
}

过滤器执行顺序

在这里插入图片描述

路由过滤器跟默认过滤器底层都是GatewayFilter,而全局过滤器底层是GlobalFilter,通过GatewayFilterAdater适配器最终将GlobalFilter转化成GatewayFilter

在这里插入图片描述


跨域问题

跨域问题:浏览器精致请求的发起者与服务端发送跨域ajax请求,请求被浏览器拦截的问题

解决方案:CORS

globalcors: # 全局的跨域处理
  add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
  corsConfigurations:
    '[/**]':
      allowedOrigins: # 允许哪些网站的跨域请求
        - "http://127.0.0.1:8845"
        - "http://127.0.0.1:8846"
        - "http://www.leyou.com"
      allowedMethods: # 允许的跨域ajax的请求方式
        - "GET"
        - "POST"
        - "DELETE"
        - "PUT"
        - "OPTIONS"
      allowedHeaders: "*" # 允许在请求中携带的头信息
      allowCredentials: true # 是否允许携带cookie
      maxAge: 360000 # 这次跨域检测的有效期

允许的跨域ajax的请求方式

    - "GET"
    - "POST"
    - "DELETE"
    - "PUT"
    - "OPTIONS"
  allowedHeaders: "*" # 允许在请求中携带的头信息
  allowCredentials: true # 是否允许携带cookie
  maxAge: 360000 # 这次跨域检测的有效期

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值