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,值需要匹配后面的正则

目录
相关文章
|
3月前
|
安全 5G 网络性能优化
|
23天前
|
NoSQL 前端开发 测试技术
👀探秘微服务:从零开启网关 SSO 服务搭建之旅
单点登录(Single Sign-On,简称SSO)是一种认证机制,它允许用户只需一次登录就可以访问多个应用程序或系统。本文结合网关和SaToken快速搭建可用的Session管理服务。
79 8
|
2月前
|
负载均衡 Java 应用服务中间件
Gateway服务网关
Gateway服务网关
69 1
Gateway服务网关
|
3月前
|
前端开发 Java API
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
本文是Vert.x学习系列的第五部分,讨论了回调函数的限制、Future和Promise在异步操作中的应用、响应式扩展以及Kotlin协程,并通过示例代码展示了如何在Vert.x中使用这些异步编程模式。
70 5
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
|
2月前
|
负载均衡 Java API
项目中用的网关Gateway及SpringCloud
Spring Cloud Gateway 是一个功能强大、灵活易用的API网关解决方案。通过配置路由、过滤器、熔断器和限流等功能,可以有效地管理和保护微服务。本文详细介绍了Spring Cloud Gateway的基本概念、配置方法和实际应用,希望能帮助开发者更好地理解和使用这一工具。通过合理使用Spring Cloud Gateway,可以显著提升微服务架构的健壮性和可维护性。
62 0
|
4月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
207 5
|
4月前
|
测试技术 微服务
微服务(八)-服务网关zuul(四)
微服务(八)-服务网关zuul(四)
|
6月前
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关
|
4月前
|
监控 负载均衡 安全
微服务(五)-服务网关zuul(一)
微服务(五)-服务网关zuul(一)
|
5月前
|
运维 Kubernetes 安全
利用服务网格实现全链路mTLS(一):在入口网关上提供mTLS服务
阿里云服务网格(Service Mesh,简称ASM)提供了一个全托管式的服务网格平台,兼容Istio开源服务网格,用于简化服务治理,包括流量管理和拆分、安全认证及网格可观测性,有效减轻开发运维负担。ASM支持通过mTLS提供服务,要求客户端提供证书以增强安全性。本文介绍如何在ASM入口网关上配置mTLS服务并通过授权策略实现特定用户的访问限制。首先需部署ASM实例和ACK集群,并开启sidecar自动注入。接着,在集群中部署入口网关和httpbin应用,并生成mTLS通信所需的根证书、服务器证书及客户端证书。最后,配置网关上的mTLS监听并设置授权策略,以限制特定客户端对特定路径的访问。
157 2