zoukankan      html  css  js  c++  java
  • spring cloud gateway

    spring cloud gateway

    一、核心概念

    Spring Cloud Gateway是在Spring生态系统上构建的API网关服务,基于Spring5,Spring Boot2 和Project Reactor等技术,旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤功能,例如:熔断、限流、重试等。
    Spring Cloud Gateway是基于WebFlux实现的,而web Flux框架底层则使用了高性能的Reactor模式通信框架Netty,是基于异步非阻塞模型上开发的,在高并发和非阻塞式通信下是十分有优势的,所以在性能方面基本不需要担心。

    spring cloud gateway引入的jar包:


    引入的WebFlux和Web存在冲突,所以不要两个包一起引入。

    spring cloud gateway 在架构中所处的位置:


    三个核心概念

    • 路由

      Route,构建网关的基本模块,由id、目标URI,一些列断言和过滤器组成,如果断言为true则匹配该路由。
    • 断言

      predicate,参考的是java.util.function.Predicate

      开发人员可以匹配HTTP请求中的所有内容(例如请求头、请求参数),如果请求与断言相匹配则进行路由
    • 过滤

      Filter,指的是Spring框架中GatewayFilter的实例,可以在请求被路由前或者后对请求进行修改。

    二、工作流程

    • 客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler。
    • Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
    • 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前("pre")或之后("post")执行业务逻辑。
    • Filter在"pre"类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等。
      在post类型的过滤器中可以做相应内容、响应头的修改,日志的输出,流量监控等。

    三、配置

    新建config-server项目模块作为配置中心。

    3.1、导入依赖

    <!--gateway-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <!--eureka-client-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    

    3.2、启动类

    启动类加注解:@EnableEurekaClient

    @EnableEurekaClient
    @SpringBootApplication
    public class GatewayApplication {
        public static void main(String[] args) {
            SpringApplication.run(GatewayApplication.class, args);
        }
    }
    

    3.3、配置文件

    server:
      port: 9527
    
    spring:
      application:
        name: cloud-gateway
      cloud:
        gateway:
          routes:
            - id: payment_routh              #路由id
              uri: http://localhost:8762     #提供服务的路由地址
              predicates:
                - Path=/**    #断言,路径相匹配的进行断言
    #注册进eureka,默认true
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/
      instance:
        hostname: cloud-gateway-service
    

    四、测试

    4.1、启动

    启动eureka-server、启动eureka-client:8001、启动config-server网关。

    eureka-client controller层写一个可以调用的方法,用于测试网关是否起作用。

    @ResponseBody
        @RequestMapping("/testGateway")
        public String testGateway(){
            return "testGateway";
        }
    

    4.2、访问eureka-client

    访问localhost:8762/testGateway测试eureka-server能否正常访问。

    eureka-client正常运行。

    4.3、通过网关访问eureka-client

    访问localhost:9527/testGateway测试

    通过gateway网关成功访问eureka-server

    五、动态路由

    当一个服务有多个微服务组成时,可以使用动态路由,并进行负载均衡。

    5.1、修改配置

    spring:
      application:
        name: cloud-gateway
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true #开启从注册中心动态创建路由的功能,利用微服务进行路由
          routes:
            - id: client-test
    #          uri: http://localhost:8762
              uri: lb://eureka-client    #匹配提供服务的路由地址
              predicates:
                - Path=/user/**
            - id: client_routh2
    #          uri: http://localhost:8763
              uri: lb://eureka-client
              predicates:
                - Path=/dictionary/lb/**
    

    访问localhost:9527/testGateway即可

    六、Filter

    自定义过滤器 GlobalFilter
    要实现两个接口:implements GlobalFilter, Ordered

    @Component
    public class GatewayFilter implements GlobalFilter, Ordered {
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            //获取请求路径
            String url = exchange.getRequest().getURI().getPath();
            //获取请求参数中的username
            String username = exchange.getRequest().getQueryParams().getFirst("username");
            if(username == null){
                //不放行
                exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
                return exchange.getResponse().setComplete();
            }
            return chain.filter(exchange);
        }
        
        //加载过滤器的顺序,一般数字越小优先级越高。
        @Override
        public int getOrder() {
            return 0;
        }
    }
    

    七、CORS配置

    当需要进行跨越配置时

    官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RELEASE/multi/multi__cors_configuration.html

    7.1、配置文件方式

    spring:
      cloud:
        gateway:
          globalcors:
            corsConfigurations:
              '[/**]':
                allowedOrigins: "http://docs.spring.io"
                allowedMethods:
                - GET
    

    7.2、配置类方式

    @Configuration
    public class CorsConfig {
        @Bean
        public CorsWebFilter corsFilter() {
            CorsConfiguration config = new CorsConfiguration();
            config.addAllowedMethod("*");
            config.addAllowedOrigin("*");
            config.addAllowedHeader("*");
            config.setAllowCredentials(true);
    
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
            source.registerCorsConfiguration("/**", config);
    
            return new CorsWebFilter(source);
        }
    }
    
  • 相关阅读:
    个人便签
    秒杀系统架构分析与实战
    NPOI大数据分批写入同个Excel
    js获取鼠标坐标位置兼容多个浏览器
    月薪3万的程序员都避开了哪些坑
    怎样理解阻塞非阻塞与同步异步的区别?
    JS中的prototype
    互联网——降级论
    fedora自带OpenJDK,所以如果安装官方的JDK的话要先删除OpenJDK
    cygwin 安装完后不能进入think问题,网上99%都是错误的
  • 原文地址:https://www.cnblogs.com/Zzwena/p/12547325.html
Copyright © 2011-2022 走看看