共同学习|Spring Cloud Alibaba一一服务网关Gateway

目录

服务网关-Gateway

环境搭建

负载均衡

[Gateway Predicates](#Gateway Predicates)

Path

After

Before

Cookie

Header

Weight

[GatewayFilter Factories](#GatewayFilter Factories)

StripPrefix

AddResponseHeader

自定义全局Filter


网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。在使用不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同时,网关也可以提供过滤和安全功能。大多数网关运行在OSI 7层协议的顶层--应用层。

服务网关-Gateway

spring-cloud-Gateway是spring-cloud的一个子项目。而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已。因为zuul2.0连续跳票和zuul的性能表现的不是很理想,所以催生了spring团队开发了Gateway项目。

Gateway核心组件

  • Router(路由):路由是网关的基本单元,由ID、URL、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。
  • Predicate(谓语、断言):路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等。
  • Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容。

实现方式:

通过实现GlobalFilter和Ordered这两个接口中的filter(进行全局过滤)和getOrder(指定过滤器的优先级)方法

其中,FilterChain维护了一个链表,链表中存放着配置对象的链条,每次用户调用 一次chain.doFilter(request, response),链表就去取下一个配置对象,再通过配置对象 得到下一个filter,然后调用该filter,接着在filter里写的逻辑就被执行了。

环境搭建

1、导入依赖

复制代码
<!--gateway中国自带一个web组件过来-->
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2、yml 配置

复制代码
server:
   port: 88
spring:
   application:
      name: cloud-gateway
   cloud:
      nacos:
        discovery:
           server-addr: 192.168.147.288:8848   
      gateway:      # 服务网关的配警都在这里
         routes:
           - id: provider   # 路由规则的唯一标识
             uri: lb://@1-provider   # 路由的服务名称,1b指的负家均衡
             predicates:                   # 设背断言
                Path=/provider/**       # 映射的路径,把请求发送给网关后,如果请求和该Path匹配就把这个请求路由到01-provider服务中
             filters:
               - stripPrefix=1 # 截取第一个前激,就是prowider
           -id: consumer # 路由规则的唯一标识
            uri: lb://@2-consumer # 路由的服务名称,1b指的负家均衡
            predicates: # 设警断言
                Path=/consumer/** #          映射的路径,把请求发送给网关后,如果请求和该ath匹配就把这个请求路由到,01-provider服务中
            filters:
              - stripPrefix=1

3、访问

复制代码
http://localhost:88/provider/hello

负载均衡

复制代码
spring:
  cloud:
     gateway:
         routes:
             -id: user
              uri: lb://01-user-v2  #lb :可以实现服务的负载均衡
              predicates:
                - Path=/user/** 
             -id: feign-consumer
              uri: lb://consumer-feign
              predicates:
                - Path=/feign/**

修改默认的负载均衡策略

复制代码
@Bean
public IRule rule(){
     return new RandomRule();
}

Gateway Predicates

每一个'Predicate'的使用,你可以理解为:'当满足这种条件后才会被转发',如果是多个,那就是都满足的条件下被转发。

Path

请求必须匹配断言才能为真

复制代码
spring:
  cloud:
    gateway:
       routes:
          -id: feign-consumer
           uri: lb://consumer-feign
           predicates:
              - Path=/feign/**

After

指定时间之后断言才能为真

复制代码
spring:
  cloud:
     gateway:
         routes:
            -id: feign-consumer
             uri: lb://consumer-feign
             predicates:
                - Path=/feign/**
                - After=2021-08-08T17:36:20.014+08:00[Asia/shanghai]

After 接收的是一个时区值,可以通过ZoneDateTime.now()获取当前时间的时区

Before

指定时间之前断言才能为真

复制代码
spring:
  cloud:
     gateway:
         routes:
            -id: feign-consumer
             uri: lb://consumer-feign
             predicates:
                - Path=/feign/**
                - Before=2021-08-08T17:36:20.014+08:00[Asia/shanghai]

请求必须要携带指定的Cookie断言才能为真

复制代码
spring:
  cloud:
     gateway:
         routes:
            -id: feign-consumer
             uri: lb://consumer-feign
             predicates:
                - Path=/feign/**
                # -Cookie=username,tostring  #username 是key,tostring 是value
                - Cookie=username,[A-Za-z0-9]+ #value 是正则,只要写到username的Cookie断言就为真

请求头中必须要携带指定的key/value断言才能为真

复制代码
spring:
  cloud:
     gateway:
         routes:
            -id: feign-consumer
             uri: lb://consumer-feign
             predicates:
                - Path=/feign/**
                - Header=token,123 #这里也支持正则

Weight

按照权重计算,80%的流量转到8002,20%的流量转到8003

复制代码
spring:
  cloud:
     gateway:
         routes:
            -id: user1
             uri: http://localhost:8002/
             predicates:
                - Path=/user/**
                - Weight=user-group,8
            -id: user2
             uri: http://localhost:8003/
             predicates:
                - Path=/user/**
                - Weight=user-group,2

GatewayFilter Factories

复制代码
路由器允许以某种方式修改传入到HTTP请求或传出到HTTP响应。路由过滤器的作用域是特定的路由。springcloud gateway包括许多内置的gatwwayFilter工厂。

StripPrefix

复制代码
spring:
  cloud:
     gateway:
         routes:
            -id: nameRoot
             uri: http://nameservice
             predicates:
                - Path=/name/**
                filters:
                - stripprefix=2

截取指定的请求,然后再路由。

AddResponseHeader

在网关中给所有响应头中添加token属性

复制代码
spring:
  cloud:
     gateway:
         routes:
            -id: feign-consumer
             uri: lb://consumer-feign
             predicates:
                - Path=/feign/**
                filters:
                - AddResponseHeader=token,456

自定义全局Filter

自定义全局Filter可以实现再路由之前的自定义的过滤,服务调用完成后的自定义响应处理,它是一个全局的作用,定义后对所有的服务都起作用。实际项目中一把把一些公共操作都统一的放在网关Filter实现。

相关推荐
摇滚侠20 小时前
Spring Boot 3零基础教程,properties文件中配置和类的属性绑定,笔记14
java·spring boot·笔记
星光一影21 小时前
HIS系统天花板,十大核心模块,门诊/住院/医保全流程打通,医院数字化转型首选
java·spring boot·后端·sql·elementui·html·scss
武文斌7721 小时前
项目学习总结:CAN总线、摄像头、STM32概述
linux·arm开发·stm32·单片机·嵌入式硬件·学习·c#
JAVA学习通21 小时前
零基础OSS组件(Java)
java·linux·leetcode
草莓熊Lotso21 小时前
《算法闯关指南:优选算法--二分查找》--19.x的平方根,20.搜索插入位置
java·开发语言·c++·算法
SPFFC1893803305321 小时前
AI玩具排线专业生产与全球营销策略
人工智能·学习·智能手机·显示器·智能手表·平板·游戏机
。TAT。21 小时前
C++ - vector
开发语言·c++·学习
YJlio21 小时前
Process Monitor 学习笔记(5.7):长时间运行追踪与日志文件体积的控制
java·笔记·学习
派森先生21 小时前
sk09.【scikit-learn基础】--『无监督学习』之K均值聚类
学习·均值算法·scikit-learn
失散1321 小时前
分布式专题——45 ElasticSearch基础数据管理详解
java·分布式·elasticsearch·架构