SpringCloudAliBaba篇之gateway:手把手教你搭建服务网关(上)

简介: SpringCloudAliBaba篇之gateway:手把手教你搭建服务网关

1、什么是Spring Cloud Gateway

  • 网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等
  • Spring Cloud Gateway是Spring Cloud 官方提出的第二代网关框架,定位于取代Netflix Zuul1.0,相比Zuul来说,Spring Cloud Gateway提供更优秀的性能,更强大的功能。
  • Spring Cloud Gateway 是由WebFlux + Netty + Reactor 实现的响应式的API网关,它不能在传统的servlet容器中工作,也不能构建war包
  • Spring Cloud Gateway 旨在为微服务架构提供一种简单且有效的API路由的管理方式,并基于Filter的方式提供网关的基本功能,例如说安全认证、监控、限流等等。

1.2、Spring Cloud Gateway功能特征

  • 基于Spring Framework 5,Project Reactor和Spring Boot 2.0进行构建;
  • 动态路由: 能够匹配任何请求属性;
  • 支持路径重写
  • 集成Spring Cloud服务发现功能(Nacos,Eruka)
  • 可集成流控降级功能(Sentinel、Hystrix);
  • 可以对路由指定易于编写的Predicate(断言)和Filter(过滤器)

1.3、核心概念

  • 路由(route)

路由是网关中最基础的部分,路由信息包括一个ID,一个目的URL、一组断言工厂、一组Filter组成,如果断言为真,则说明请求的URL和配置的路由匹配

  • 断言(predicates)

Java8中的断言函数,SpringCloud Gateway中的断言函数类型就是Spring5 框架中的ServerWebExchange.断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等,

  • 过滤器(Filter)

SpringCloud Gateway中的filter分为Gateway Filter和Global Filter,Filter可以对请求和响应进行处理。

2、Gateway初体验

2.1、Gateway快速开始

1、引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2、application.yml

server:
  port: 8889
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: order_route     #路由的唯一标识,路由到order
          uri: http://localhost:8004 # 需要转发的地址
          # 断言规则 用于路由规则的匹配
          predicates:
            - Path=/order-server/**
          # 转发之前去掉第一层路径
          filters:
            - StripPrefix=1

浏览器进行访问http://localhost:8889/order-server/order/orderList即可转发到你的http://localhost:8004/order/orderList

3、Gateway整合nacos

增加一个依赖

<!--nacos依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

修改yml文件

server:
  port: 8889
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: order_route    
          uri: lb://order-server #lb表示使用nacos本地的负载均衡策略
          predicates:
            - Path=/order-server/**
          filters:
            - StripPrefix=1
    #配置nacos        
    nacos:
      discovery:
        server-addr: 127.0.0.1:8847
        username: nacos
        password: nacos

技巧:断言和过滤路由简写方式

yml编写方式

server:
  port: 8889
spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 120.0.0.1:8847
        username: nacos
        password: nacos
    gateway:
      discovery:
        locator:
          enabled: true #自动识别nacos上的服务

运行即可,发现我们服务可以正常访问。

4、内置断言工厂

官网地址:

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-addrequestheader-gatewayfilter-factory

4.1、基于Datetime类型

此类型断言根据时间做判断,主要由三个:

AfterRoutePredicateFactory:接受一个日期参数,判断请求日期是否晚于指定日期

BeforeRoutePredicateFactory:接受一个日期参数,判断请求日期是否早于指定日期

BetweenRoutePredicateFactory:接受一个日期参数,判断请求日期是否在指定时间段内

案例一(晚于指定日期)

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

案例二(早于指定日期)

spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: https://example.org
        predicates:
        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

案例三(指定日期之间)

spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

4.2、基于远程地址

RemoteAddrRoutePredicateFactory: 接收一个ip地址段,判断请求主机是否在地址端中

- RemoteAddr=192.168.1.1/24

4.3、基于Cookie

CookieRoutePredicateFactory: 接收两个参数,cookie名字和一个正则表达式,判断请求cookie是否具有给定名称且与正则表达式匹配

- Cookie=chocolate, ch.p

4.4、基于Header

HeaderRoutePredicateFactory: 接收两个参数,标题名称和一个正则表达式,判断请求Header是否具有给定名称且与正则表达式匹配。

- Header=X-Request-Id, \d+

4.5、基于Host

HostRoutePredicateFactory: 接收一个参数,主机名模式。判断请求的Host是否匹配规则

- Host=**.somehost.org,**.anotherhost.org

4.6、基于Method请求方法

MethodRoutePredicateFactory: 接收一个参数,判断请求类型是否跟指定的类型匹配

- Method=GET,POST

4.7、基于Path匹配请求路径

{segment}:需要携带参数

- Path=/red/{segment},/blue/{segment}

例: /red/1 or /red/aaa or /blue/red

4.8、基于weight权重

spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2

4.9、基于请求参数

- Query=green

例入: ?green=121

- Query=red, gree.

例入:?red=gree,值需要匹配后面的正则

目录
相关文章
|
1月前
|
Java API 微服务
服务网关Gateway
该博客文章详细介绍了Spring Cloud Gateway的使用方法和概念。文章首先阐述了API网关在微服务架构中的重要性,解释了客户端直接与微服务通信可能带来的问题。接着,文章通过具体的示例代码,展示了如何在Spring Cloud Gateway中添加依赖、编写路由规则,并对路由规则中的基本概念如Route、Predicate和Filter进行了详细解释。最后,文章还提供了路由规则的测试方法。
服务网关Gateway
|
26天前
|
安全 API
【Azure API 管理】APIM Self-Host Gateway 自建本地环境中的网关数量超过10个且它们的出口IP为同一个时出现的429错误
【Azure API 管理】APIM Self-Host Gateway 自建本地环境中的网关数量超过10个且它们的出口IP为同一个时出现的429错误
|
26天前
|
存储 容器
【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
|
1月前
|
监控 供应链 安全
构建高效微服务架构:API网关与服务熔断策略
【7月更文挑战第38天】随着现代应用程序向微服务架构的转型,系统的稳定性和效率成为了开发团队关注的焦点。本文将探讨在微服务环境中实现系统可靠性的关键组件——API网关,以及如何在服务间通讯时采用熔断机制来防止故障蔓延。通过分析API网关的核心功能和设计原则,并结合熔断策略的最佳实践,我们旨在提供一套提高分布式系统弹性的策略。
|
1月前
|
负载均衡 Java 应用服务中间件
Gateway服务网关
本节针对微服务中另一重要组件:网关 进行了实战性演练,网关作为分布式架构中的重要中间件,不仅承担着路由分发(重点关注Path规则配置),同时可根据自身负载均衡策略,对多个注册服务实例进行均衡调用。本节我们借助GateWay实现的网关只是技术实现的方案之一,后续大家可能会接触像:Zuul、Kong等,其实现细节或有差异,但整体目标是一致的。
|
2月前
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关
|
4月前
|
运维 网络协议 安全
长连接网关技术专题(十):百度基于Go的千万级统一长连接服务架构实践
本文将介绍百度基于golang实现的统一长连接服务,从统一长连接功能实现和性能优化等角度,描述了其在设计、开发和维护过程中面临的问题和挑战,并重点介绍了解决相关问题和挑战的方案和实践经验。
217 1
|
4月前
|
缓存 安全 API
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现
公司对外开放的OpenAPI-Server服务,作为核心内部系统与外部系统之间的重要通讯枢纽,每天处理数百万次的API调用、亿级别的消息推送以及TB/PB级别的数据同步。经过多年流量的持续增长,该服务体系依然稳固可靠,展现出强大的负载能力。
151 9
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现
|
9月前
|
负载均衡 Cloud Native Java
【云原生】Spring Cloud Alibaba 之 Gateway 服务网关实战开发
【云原生】Spring Cloud Alibaba 之 Gateway 服务网关实战开发
1610 0
|
1月前
|
运维 Kubernetes 安全
利用服务网格实现全链路mTLS(一):在入口网关上提供mTLS服务
阿里云服务网格(Service Mesh,简称ASM)提供了一个全托管式的服务网格平台,兼容Istio开源服务网格,用于简化服务治理,包括流量管理和拆分、安全认证及网格可观测性,有效减轻开发运维负担。ASM支持通过mTLS提供服务,要求客户端提供证书以增强安全性。本文介绍如何在ASM入口网关上配置mTLS服务并通过授权策略实现特定用户的访问限制。首先需部署ASM实例和ACK集群,并开启sidecar自动注入。接着,在集群中部署入口网关和httpbin应用,并生成mTLS通信所需的根证书、服务器证书及客户端证书。最后,配置网关上的mTLS监听并设置授权策略,以限制特定客户端对特定路径的访问。
109 2