统一网关--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 # 这次跨域检测的有效期
相关推荐
珍珠是蚌的眼泪44 分钟前
微服务_入门2
网关·微服务·gateway·远程调用·feign
bug菌¹2 小时前
滚雪球学SpringCloud[4.2讲]: Zuul:Netflix API Gateway详解
spring·spring cloud·gateway
炸裂狸花猫1 天前
Kubernetes从零到精通(12-Ingress、Gateway API)
容器·kubernetes·gateway
云来喜3 天前
关于Spring Cloud Gateway中 Filters的理解
java·spring boot·gateway
小小小小关同学3 天前
【Gateway】网关服务快速上手
java·开发语言·gateway
小小小小关同学3 天前
【Gateway】Gateway Filter Factories
网络·gateway
两仪式quq3 天前
服务网关Gateway快速入门
服务器·网络·gateway
szc17675 天前
Gateway学习笔记
笔记·学习·gateway
huaqianzkh8 天前
什么是API网关(API Gateway)?
架构·gateway