当前位置:   article > 正文

Spring cloud gateway 详解_spring cloud gateway网关的作用

spring cloud gateway网关的作用

一、gateway网关的作用

1.身份认证,权限校验

2.路由转发,负载均衡

3.对用户请求做限流

二、创建gateway项目并且实现网关路由转发功能

1.新建model

2.引入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-gateway</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.alibaba.cloud</groupId>
  7. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  8. </dependency>

3.编写yml配置文件

端口、注册naocs、gateway配置

  1. server:
  2. port: 10010
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: localhost:8845
  10. gateway:
  11. routes:
  12. - id: user-service
  13. uri: lb://userservice
  14. predicates:
  15. - Path=/user/**

 4.图解

三、路由断言工厂(PredicateFactory)

1.路由断言工厂的作用

解析yml中写的Predicate字符串,转化为判断条件

2.11种路由断言工厂

a.11种断言的使用方法:

请转到这里查看=======>11种路由断言工厂-CSDN博客

3.思考题

 四、路由的过滤器配置

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。

 1.过滤器种类

官方提供了三十多种过滤器,我们可以在需要时查看,部分过滤器如下:

2.流量染色

通过过滤器可以实现多种功能,例如流量染色,判断请求是否来源于gateway,如果不是gateway转发,将抛出异常。

实现:

application.yml:

  1. server:
  2. port: 10010
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: localhost:8845
  10. gateway:
  11. routes:
  12. - id: user-service
  13. uri: lb://userservice
  14. predicates:
  15. - Path=/user/**
  16. filters:
  17. - AddRequestHeader=passGateway, true

UserController.java

  1. @GetMapping("/{id}")
  2. public User queryById(@PathVariable("id") Long id,
  3. @RequestHeader(value = "PassGateway", required = false) boolean passGateway) {
  4. if (!passGateway) {
  5. throw new RuntimeException("passGateway is false");
  6. }
  7. System.out.println(passGateway);
  8. return userService.queryById(id);
  9. }
  10. }

如果不经过gateway则抛出异常:

  1. java.lang.RuntimeException: passGateway is false
  2. at cn.itcast.user.web.UserController.queryById(UserController.java:45) ~[classes/:na]
  3. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
  4. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~

3.default-filters

给所有的路由请求请求加上过滤器:

  1. server:
  2. port: 10010
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: localhost:8845
  10. gateway:
  11. routes:
  12. - id: user-service
  13. uri: lb://userservice
  14. predicates:
  15. - Path=/user/**
  16. # filters:
  17. # - AddRequestHeader=passGateway, true
  18. default-filters:
  19. - AddRequestHeader=passGateway, true

五、全局过滤器(GlobalFilter)

1.实现全局过滤器

通过实现GlobalFilter接口,并且实现其中的filter方法即可定义全局过滤器

filter方法参数讲解:

  1. @Override
  2. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  3. return null;
  4. }

2.ServerWebExchange

接口包含以下重要方法:

  1. getRequest():获取当前的HTTP请求对象。
  2. getResponse():获取当前的HTTP响应对象。
  3. getAttributes():获取与当前请求关联的属性map,可以用于在请求处理过程中共享数据。
  4. getFormData():获取表单数据,返回一个Mono<MultiValueMap<String, String>>对象,可以使用flatMap操作符来处理表单数据。
  5. mutate():创建一个新的ServerWebExchange实例,可以对请求和响应进行修改。
  6. getSession():获取当前的会话对象,返回一个Mono<WebSession>对象,可以用于管理用户会话状态。

3.GatewayFilterChain

GatewayFilterChain是 Spring Cloud Gateway 中的一个接口,用于定义一系列的过滤器链。在请求进入网关后,会经过一系列的过滤器对请求进行处理和转换,然后再转发到后端服务。

GatewayFilterChain接口定义了一个 filter方法,调用该filter方法表示放行。

chain.filter(exchange);

 六、过滤器链执行顺序

1.三种过滤器的处理

gateway中有三种过滤器:Default过滤器、路由过滤器、全局过滤器

Default过滤器和路由过滤器回通过AddRequestHeaderGatrewayFilterFactory这个工厂类转化为GatewayFilter类型的拦截器

【注】AddRequestHeaderGatrewayFilterFactory不是所有的Default过滤器和路由过滤器都是这个工厂类处理,而是对应filter配置文件中写的过滤器对应的工厂类。

全局过滤器会通过GatewayFilterAdapter类转换成GatewayFilter类型的类

2.执行顺序

七、网关的cors跨域配置

跨域问题:浏览器禁止请求的发起者与服务端发生跨域的Ajax请求

解决方案:

  1. globalcors:
  2. add-to-simple-url-handler-mapping: true
  3. corsConfigurations:
  4. '[/**]':
  5. allowedOrigins: # 允许跨域访问的地址
  6. - "http://localhost:8080"
  7. - "www.baidu.com"
  8. allowedMethods: # 允许跨域访问的请求方式
  9. - "GET"
  10. - "POST"
  11. - "PUT"
  12. - "DELETE"
  13. allowedHeaders: # 允许请求头中携带的字段
  14. - "*"
  15. allowCredentials: true #是否允许携带cookies
  16. exposedHeaders: # 允许跨域访问的响应头
  17. - "*"
  18. maxAge: 3600

踩坑日志:网关配置跨域之后,如果每个服务重新配置跨域,例如使用@CrossOrign注解,会导致出错

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/830875
推荐阅读
相关标签
  

闽ICP备14008679号