• 12.Gateway新一代网关


    1.概述简介

    1.1 是什么?

    在这里插入图片描述在这里插入图片描述在这里插入图片描述Spring Cloud Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架

    在这里插入图片描述gateway官网:
    https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
    zuul github:
    https://github.com/Netflix/zuul/wiki

    1.2 能干嘛?

    反向代理
    鉴权
    流量控制
    熔断
    日志监控

    微服务架构中网关在哪里?
    在这里插入图片描述

    1.3 有了Zuul了怎么又出来了gateway

    1.3.1.neflix不太靠谱,zuul2.0一直跳票,迟迟不发布

    在这里插入图片描述

    1.3.2.SpringCloud Gateway具有如下特性

    在这里插入图片描述

    1.3.3 SpringCloud Gateway与Zuul的区别

    在这里插入图片描述Zuul1.x模型

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    1.3.4 三大核心概念

    在这里插入图片描述在这里插入图片描述

    1.3.5Gateway工作流程

    核心逻辑:路由转发+执行过滤器链

    在这里插入图片描述在这里插入图片描述

    2.新建Module cloud-gateway-gateway9527

    2.1改pom

     <dependencies>
            <!--新增gateway-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
            <dependency>
                <groupId>com.atguigu.springcloud</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
            
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    2.2改yml

    server:
      port: 9527
    spring:
      application:
        name: cloud-gateway
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true  #开启从注册中心动态创建路由的功能,利用微服务名进行路由
          routes:
            - id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
              #uri: http://localhost:8001   #匹配后提供服务的路由地址
              uri: lb://cloud-payment-service
              predicates:
                - Path=/payment/get/**   #断言,路径相匹配的进行路由
    
            - id: payment_routh2
              #uri: http://localhost:8001   #匹配后提供服务的路由地址
              uri: lb://cloud-payment-service
              predicates:
                - Path=/payment/lb/**   #断言,路径相匹配的进行路由
    
    eureka:
      instance:
        hostname: cloud-gateway-service
      client:
        service-url:
          register-with-eureka: true
          fetch-registry: true
          defaultZone: http://eureka7001.com:7001/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    Gateway网关路由有两种配置方式:
    a:在配置文件yml中配置
    b:代码中注入RouteLocator的Bean (不推荐)

    2.3主启动类

    @SpringBootApplication
    @EnableEurekaClient
    public class GateWayMain9527 {
        public static void main(String[] args) {
                SpringApplication.run( GateWayMain9527.class,args);
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.4测试

    我们目前不想暴露8001端口,希望在8001外面套一层9527

    启动7001,启动8001,启动9527网关

    添加网关前:http://localhost:8001/payment/get/31
    添加网关后:http://localhost:9527/payment/get/31

    2.5 通过微服务名实现动态路由

    默认情况下Gateway会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能。不需要将ip地址写在配置中,只需写服务名即可。

    需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。

    lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri

    一个eureka7001+两个服务提供者8001/8002,http://localhost:9527/payment/lb 8001/8002两个端口切换

    在这里插入图片描述

    3.Predicate的使用

    3.1是什么?

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    3.2 Predicate的使用

    在这里插入图片描述1-3中表达式的获取方法:

    public class TimeUtil {
        public static void main(String[] args) {
            ZonedDateTime zonedDateTime = ZonedDateTime.now();
            System.out.println(zonedDateTime);
        }
    }
    
    2022-06-30T23:06:41.697+08:00[Asia/Shanghai]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • Path:匹配请求路径的最为常用,其他很少用

    总结:Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。如果匹配不上,就不能访问。

    4.Filter的使用

    在这里插入图片描述在这里插入图片描述自带的过滤器一般不咋用,都是自定义全局GlobalFilter

    实现这两个接口:GlobalFilter ,Ordered

    spring的order中。越小的值,优先级越高,越大的值优先级越低,优先级高的先执行。

    @Component
    @Slf4j
    public class MyLogGateWayFilter implements GlobalFilter,Ordered {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
            log.info("*********come in MyLogGateWayFilter: "+new Date());
            String uname = exchange.getRequest().getQueryParams().getFirst("username");
            if(StringUtils.isEmpty(uname )){
                log.info("*****用户名为Null 非法用户,(┬_┬)");
                exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);//给人家一个回应
                return exchange.getResponse().setComplete();
            }
            return chain.filter(exchange);
        }
    
        @Override
        public int getOrder() {
            return 0;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    http://localhost:9527/payment/lb?username=z3 正常访问。只有带上username才能正常访问。

  • 相关阅读:
    关于java8新特性 Stream流的常规用法总结
    C++ Primer第五版_第十九章习题答案(1~10)
    计算机网络知多少面试---第2篇
    Stream流最佳实战
    APK安装过程解析
    力扣 -- 227. 基本计算器 II
    《JAVA设计模式系列》解释器模式
    Spring.事务实现方式和源码分析
    规划类3d全景线上云展馆帮助企业轻松拓展海外市场
    从数据库中读取文件导出为Excel
  • 原文地址:https://blog.csdn.net/qq_44300280/article/details/125549545