ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Gateway 网关

2022-07-20 22:33:01  阅读:208  来源: 互联网

标签:网关 请求 springframework gateway org import Gateway 路由


Gateway

gateway功能:

  1. 身份认证和权限校验

  2. 服务路由(访问哪一个服务),负载均衡(服务之间Ribbon)

  3. 对用户请求限流

gateway的技术实现:

  1. gateway

  2. zuul

*zuul是基于servlet的实现,属于阻塞式编程,

*SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能

网关搭建的步骤

  • 创建项目,引入nacos服务发现和gateway的依赖

     <!--gateway starter依赖-->
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-gateway</artifactId>
          </dependency>
    <!--Nacos的服务发现-->
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
          </dependency>

     

  • 配置application.yml,包括服务基本信息,nacos地址,路由

  • 路由:

    1. 路由id, 路由的唯一标识

    2. 路由目标uri: 路由的目标地址,http代表固定地址,lb代表根服务名据负载均衡

    3. 路由断言(predicates);判断路由的规则

    4. 路由过滤器(filters):对请求或者响应做处理。

server:
port: 10010 #服务端口
spring:
application:
  name: gateway #服务名称
cloud:
  nacos:
    server-addr: localhost:8848 #nacos 的地址
   #配置网关
  gateway:
    routes: #配置路由,可以配置多个
      - id: user-server  #gateway唯一标识(任意)
        uri: lb://userservice  #lb是loadBalanced的缩写(负载均衡),然后是服务名
        predicates: #断言 boolean表达式 判断请求是否否和路由规则
          - Path=/user/** #符合这个路径的放行
      - id: order-server
        uri: lb://orderserver
        predicates: #可以配置多个
          - Path=/order/**

路由断言工厂Route Predicate Factory

  • 作用:

    • 判断用户的断言规则,然后解析成对应的判断条件,用户请求过来做判断

  • 在我们的配置文件中写的断言只是字符串,这些字符串会被Predicate Factory 读取并解析,转变为判断路由的判断条件

  • 这样的断言工厂在SpringCloudGateway还有十几个

  • 屏幕截图 2022-07-12 215528

路由过滤器 GatewayFilter

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

  • 过滤器的作用是什么?

    • 对路由的请求或者响应做加工处理,比如添加请求头

    • 配置在路由下的过滤器只对当前路由的请求生效

  • defaultFilter的作用是什么?

    • 对所有路由都生效的过滤器

全局过滤器GlobalFilter

  • 全局过滤器的作用也是处理一切是进入网关的请求和微服务响应,与GatewayFilter的作用一样。

  • 区别在于GatewayFilter通过配置定义,处理逻辑是固定的,

  • GlobalFilter的逻辑需要自己写代码实现。

  • 定义方式是实GlobalFilter接口。

package cn.itcast.gateway;


import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
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;

import java.lang.annotation.Annotation;

//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter , Order {
   @Override
   public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
       //获取请求对象
       ServerHttpRequest request = exchange.getRequest();
       //获取请求参数
       MultiValueMap<String, String> queryParams = request.getQueryParams();
       //获取authorization
       String auth = queryParams.getFirst("authorization");
       //判断是否等于admin
       if ("admin".equals(auth)) {
           //等于放行
           return chain.filter(exchange);
      }
       //拦截
       //禁止访问
//       exchange.getResponse().getStatusCode(HttpStatus.FORBIDDEN);
       //结束处理
       return exchange.getResponse().setComplete();
  }

   @Override
   public int value() {
       return -1;
  }
   @Override
   public Class<? extends Annotation> annotationType() {
       return null;
  }
}

GatewayFilter 的过滤执行顺序

  • order值越小,优先级越高

  • 当order值一样时,顺序是defaultFilter最先,然后是局部的路由过滤器,最后是全局过滤器

网关的CORS跨域

  • 跨域:域名不一致,主要包括:

    1. 域名不同:

    2. 域名相同,端口不同:

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

    4. 解决方案:CORS

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 # 这次跨域检测的有效期
 

 

标签:网关,请求,springframework,gateway,org,import,Gateway,路由
来源: https://www.cnblogs.com/yzlworld/p/16500105.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有