GateWay

5 篇文章 0 订阅

为什么选gateway不用zuul
一方面因为zuul1.0已经进入维护阶段,而且gateway是springcloud团队研发的,值得信赖。而且很多功能zuul都没有用起来也非常简单便捷。
gateway是基于异步阻塞模型上进行开发的,性能方面不需要担心,虽然netflix早就发布了最新的zuul2.x但是springcloud貌似没有整合计划,而且netflix相关组件都宣布进入维护期;不止前景如何,多方面综合考虑gateway是很理想的网关选择
springcloud gateway 与zuul的区别
1、zuul1.x是一个基于I/O的APIGateWay
2、zuul1.x基于servlet2.5使用阻塞架构它不支持任何长连接(如WebSocket)zuul的设计模式和nginx较像,每次I/O操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成,但是差别是nginx用c++实现,zuul用java实现,儿JVM本身会有第一次加载较慢的情况,使得zuul的性能相对较差。
3、zuul2.x理念更先进,相机与netty非阻塞和支持长连接,但springclou d目前没有整合,zuul2.x的性能较zuul1.x有较大提升。在性能方面,根据官方提供的基准测试,springcloud gateway的rps(每秒请求数)是zuul的1.6倍。
4、springcloud gateway 建立在spring framework5、project reactor和springboot5之上,使用非阻塞api
5、springcloud gateway还支持websocket,并且与spring紧密集成拥有更好的开发体验
springcloud Gateway是springcloud的一个全新项目,基于spring5.0+springboot2.0和projectreactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的api路由管理方式。
springcloud gateway作为springcloud生态系统中的网关,目标是替代zuul,在springcloud2.0以上的版本中,没有对新版本的zuul2.0以上最新高性能版本进行集成,仍然还使用的zuul1.x非reactor模式的老版本,而为了提升网关的性能,springcloud gateway是基于webflux框架实现的,而webflux框架底层则使用了高性能的reactor模式通信框架netty。
springcloud gateway的目标是提供统一的路由方式且基于filter链的方式提供了网关基本的功能,例如安全、监控/指标,和限流。
gateway三大核心概念
route(路由) 路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
predicate(断言)开发人员可以匹配http请求中的所有内容(例如请求头或者请求参数),如果请求与断言相匹配则进行路由
filter(过滤)指的是spring框架中gatewayfilter的实例,使用过滤器,可以再请求被路由前或者之后对请求进行修改
gateWay工作流程:
路由转发+执行过滤器
客户端向springcloud gateway发出请求,然后再gateway handler mapping中找到与请求相匹配的路由,将其发送到gateway web handler。
handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,
在“post”类型的过滤器中可以相应内容、相应头的修改、日志的输出、流量的监控等有着非常重要的作用。
pom依赖

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</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>com.gwh</groupId>
            <artifactId>common-api-cloud</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

application.yml

server:
  port: 9527
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://server1:7001/eureka
  instance:
    hostname: cloud-gateway-server
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
    #增添路由可以多个id随意取值不可重复
      routes:
        - id: pay_1
          uri: http://localhost:80
          predicates:
          #路径相匹配的进行路由
            - Path=/consumer/payment/get/**
        - id: pay_2
            uri: http://localhost:80
            predicates:
              - Path=/consumer/payment/get2/**

主启动类

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

使用localhost:9527/consumer/payment/get/08
获取到的效果与localhost/consumer/payment/get/08结果一致可以有效地隐藏真实路径
gateway有两种路由配置:
第一种在配置文件yml中配置
application.yml

server:
  port: 9527
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://server1:7001/eureka
  instance:
    hostname: cloud-gateway-server
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
    #增添路由可以多个id随意取值不可重复
      routes:
        - id: pay_1
          uri: http://localhost:80
          predicates:
          #路径相匹配的进行路由
            - Path=/consumer/payment/get/**
        - id: pay_2
            uri: http://localhost:80
            predicates:
              - Path=/consumer/payment/get2/**

第二种在代码中注入RouteLocator的bean

@Configuration
public class RouteConfig {

    @Bean
    public RouteLocator customerRoute(RouteLocatorBuilder builder){
        return builder.routes().route("id001",r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();
    }
}

通过微服务名实现动态路由
application.yml这样修改设置

server:
  port: 9527
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://server1:7001/eureka
  instance:
    hostname: cloud-gateway-server
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
      	locator:
      	  enable: true#开启从注册中心动态创建路由的功能利用服务器进行路由
    #增添路由可以多个id随意取值不可重复
      routes:
        - id: pay_1
          #uri: http://localhost:80
          uri: lb://CLOUD-CLIENT#匹配后提供为夫的的路由地址(微服务名)
          predicates:
          #路径相匹配的进行路由
            - Path=/consumer/payment/get/**
       

predicate的使用(路由规则)
时间级别
After=时间
在这个时间之后才能访问这个路由不然会报错误404

server:
  port: 9527
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://server1:7001/eureka
  instance:
    hostname: cloud-gateway-server
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          #开启从注册中心动态创建路由的功能利用服务器进行路由
          enable: true
      routes:
        #增添路由可以多个id随意取值不可重复
        - id: pay_1
          #匹配后提供为夫的的路由地址(微服务名)
          uri: lb://CLOUD-CLIENT
          predicates:
            #路径相匹配的进行路由
            - Path=/consumer/payment/get/**
            #在这个时间之后路由才可访问
            - After=2021-05-19T14:38:59.485+08:00[Asia/shanghai]
Befor在时间之前
between在时间之间 时间之间使用逗号隔开		between=2021-05-19T14:38:59.485+08:00[Asia/shanghai],2021-05-20T14:38:59.485+08:00[Asia/shanghai]

cookie级别的
cookie Route Predicate需要两个参数,一个是cookie name,一个是正则表达式。
路由规则会通过获取对应的cookie name值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行
- Cookie=username,gwh
访问的cookie中需要键值对是username=gwh才能通过严重访问路由
header route 请求头
两个参数:一个属性名称和一个正则表达式,这个属性值和正则表达式匹配执行
请求头要有X-Request-id 属性并且值为整数
-Header=X-Request-id,\d+
method route
访问类型限制为get或者post等
-Mothod=GET
path route
路径限制
-Path=/pay/get/**
query route
请求参数的限制
要有参数名为username并且所带值只能为正数才能路由
-Query=username,\d+
filter的使用
路由过滤器可用于修改进入的HTTP请求和反悔费HTTP相应,路由过滤器只能指定路由进行使用。
springcloud gateway内置了很多种路由过滤器,他们都由GatewayFilter的工厂类来产生
自定义过滤器
实现接口GlobalFilter,Odered

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        if(username==null){
            System.out.println("username is null");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);//设置响应状态码
            return exchange.getResponse().setComplete();//返回错误提示
        }
        return chain.filter(exchange);//合法通过
    }

    @Override
    public int getOrder() {
        return 0;//优先级
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值