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


    目录

    服务网关-Gateway

    环境搭建

    负载均衡

    Gateway Predicates

    Path

    After

    Before

    Cookie

    Header

    Weight

    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、导入依赖

    1. <!--gateway中国自带一个web组件过来-->
    2. <dependency>
    3. <groupId>org.springframework.cloud</groupId>
    4. <artifactId>spring-cloud-starter-gateway</artifactId>
    5. </dependency>
    6. <dependency>
    7. <groupId>com.alibaba.cloud</groupId>
    8. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    9. </dependency>

    2、yml 配置

    1. server:
    2. port: 88
    3. spring:
    4. application:
    5. name: cloud-gateway
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: 192.168.147.288:8848
    10. gateway: # 服务网关的配警都在这里
    11. routes:
    12. - id: provider # 路由规则的唯一标识
    13. uri: lb://@1-provider # 路由的服务名称,1b指的负家均衡
    14. predicates: # 设背断言
    15. Path=/provider/** # 映射的路径,把请求发送给网关后,如果请求和该Path匹配就把这个请求路由到01-provider服务中
    16. filters:
    17. - stripPrefix=1 # 截取第一个前激,就是prowider
    18. -id: consumer # 路由规则的唯一标识
    19. uri: lb://@2-consumer # 路由的服务名称,1b指的负家均衡
    20. predicates: # 设警断言
    21. Path=/consumer/** # 映射的路径,把请求发送给网关后,如果请求和该ath匹配就把这个请求路由到,01-provider服务中
    22. filters:
    23. - stripPrefix=1

    3、访问

    http://localhost:88/provider/hello

    负载均衡

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. -id: user
    6. uri: lb://01-user-v2 #lb :可以实现服务的负载均衡
    7. predicates:
    8. - Path=/user/**
    9. -id: feign-consumer
    10. uri: lb://consumer-feign
    11. predicates:
    12. - Path=/feign/**

    修改默认的负载均衡策略

    1. @Bean
    2. public IRule rule(){
    3. return new RandomRule();
    4. }

    Gateway Predicates

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

    Path

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

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. -id: feign-consumer
    6. uri: lb://consumer-feign
    7. predicates:
    8. - Path=/feign/**

    After

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

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. -id: feign-consumer
    6. uri: lb://consumer-feign
    7. predicates:
    8. - Path=/feign/**
    9. - After=2021-08-08T17:36:20.014+08:00[Asia/shanghai]

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

    Before

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

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. -id: feign-consumer
    6. uri: lb://consumer-feign
    7. predicates:
    8. - Path=/feign/**
    9. - Before=2021-08-08T17:36:20.014+08:00[Asia/shanghai]

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

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. -id: feign-consumer
    6. uri: lb://consumer-feign
    7. predicates:
    8. - Path=/feign/**
    9. # -Cookie=username,tostring #username 是key,tostring 是value
    10. - Cookie=username,[A-Za-z0-9]+ #value 是正则,只要写到username的Cookie断言就为真

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

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. -id: feign-consumer
    6. uri: lb://consumer-feign
    7. predicates:
    8. - Path=/feign/**
    9. - Header=token,123 #这里也支持正则

    Weight

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

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. -id: user1
    6. uri: http://localhost:8002/
    7. predicates:
    8. - Path=/user/**
    9. - Weight=user-group,8
    10. -id: user2
    11. uri: http://localhost:8003/
    12. predicates:
    13. - Path=/user/**
    14. - Weight=user-group,2

    GatewayFilter  Factories

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

    StripPrefix

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. -id: nameRoot
    6. uri: http://nameservice
    7. predicates:
    8. - Path=/name/**
    9. filters:
    10. - stripprefix=2

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

    AddResponseHeader

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

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. -id: feign-consumer
    6. uri: lb://consumer-feign
    7. predicates:
    8. - Path=/feign/**
    9. filters:
    10. - AddResponseHeader=token,456

    自定义全局Filter

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

  • 相关阅读:
    【Vue】避免Vue组件中常见的props默认值陷阱
    Win11 22H2如何创建开始菜单文件夹?
    Java学习笔记——接口
    【项目_02】隐藏tabbar、对城市数据进行获取、处理、渲染到页面上、城市回显 | 基于Vue3全家桶
    【电子器件笔记4】电感参数和选型
    Python模块 adorner 的使用示例
    Springboot考勤管理系统30gu6计算机毕业设计-课程设计-期末作业-毕设程序代做
    网工内推 | 售后工程师,IP认证优先,最高15薪,年底有分红
    redux最佳实战(一)
    python--numpy常用属性及方法
  • 原文地址:https://blog.csdn.net/qq_22903531/article/details/136291791