3.9 Spring Cloud Gateway 微服务新网关实战| 学习笔记

简介: 快速学习 3.9 Spring Cloud Gateway 微服务新网关实战。

开发者学堂课程【Spring Cloud 微服务架构设计与开发实战 :3.9 Spring Cloud Gateway 微服务新网关实战】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/60/detail/1102


3.9 Spring Cloud Gateway 微服务新网关实战


内容介绍

一、前言

二、Spring Cloud Gateway 网关

三、实战 Spring Cloud Gateway

四、总结

 

一、前言

在之前的课程中讲解了 Spring Cloud 微服务架构开发实战 zuul 网关,本节课程讲解 Spring Cloud 另外一个比较重要的网关技术组件 Gateway,以及讲解 zuul 与 Gateway 的不同,如何使用 Gateway 实战,集成项目。

 

二、Spring Cloud Gateway 网关

Spring Cloud Gateway 与 Netflix zuul 命名方式不同。Spring Cloud 的框架不断进行迭代更新,除了官方贡献,社区也贡献了很多技术组件。Spring Cloud Gateway 是官方出的。之前讲解的很多技术组件都是 Netflix 公司所出的。Netflix 公司贡献了 Spring Cloud 早期微服务的许多核心组件,对于整个 Java 的微服务发展做出了巨大的贡献。但是 Spring Cloud 官方公司希望进行云原生企业化,包括走收费的路线。项目大部分是靠业余时间进行维护开发,官方公司自己开发了网关。该网关设计是全新的,底层也不是基于1.0的 Spring 模式,它运用的是 Reactive 响应式编程模式,在吞吐量上做了一些提升,这是它很大的优势。Java 支持优秀的编程模型,比如异步式,响应式这种编程模式,底层是 web-flash 和 NetApp 也都有使用。

1、Spring Cloud Gateway 新特性

(1)、基于 Spring 5,Project Reactor 和 Spring Boot 2.0 构建。

(2)、能够匹配任何请求路由。

(3)、特定路由专用 Predicate 谓词和过滤器 Filter 特。

(4)、集成 Hystrix 断路器。

(5)、集成 Spring Cloud DiscoveryClient

(6)、易于编写谓词和过滤器

(7)、请求速率限制

(8)、路径重写

(9)、非阻塞 API,响应式 API,高并发。

使用 Spring Cloud Gateway 必须是 Spring Framework 在5.0版本以上,Spring Boot 是2.0及2.0以上的版本。其中包含了一些编程语法,which 主要做自定义代码的扩展,比如过滤器,或者路由。

Gateway 能够集成 Hystrix 断路器组件,也有 DiscoveryClient 贡献的服务发现的客户端等。很多技术组件都存在,只不过官方在后续更新中不再默认集成。Zuul 中已经集成 Hystrix 断路器,包括服务发现,重要的不同就是响应式变成异步,以及加上非阻塞 API,对后期高并发吞吐量有一个改善,但也不是绝对的,需要做测试才能体现技术的差异。

2、Spring Cloud Gateway 网关架构

image.png

观察结构有很多相似点,Gateway 有请求处理,之前的是 Sprite。Gateway 也有 Filter 概念,过滤。它本身是网关服务器接入请求后,做请求的路由和转发。

对于优秀的开发师不仅能够开发优化,还要会底层的关键的架构设计扩展。

3、Gateway 核心组件

核心和之前是一样的,包含有 which 扩展,过滤器等。Which 可以做定制代码的开发攻入。next中也有路由组件,允许扩展。扩展功能可以在配置文件中扩展,也可以通过代码方。代码方可以借助 java的 Which 语法对接函数式编程这样的风格进行代码扩展。

(1)、Route 是网关的基础元素,由 ID、目标 URI 断言、过滤器组成。当请求到达网关时,由 Gateway Handler Mapping 通过断言进行路由匹配(Mapping) ,当断言为真时,匹配到路由。

(2)、Predicate 是 Java 8 Function Predicate。输入类型是 Spring Framework ServerWebExchange。匹配 HTTP 请求,例如请求头或者请求参数。简单来说它是匹配条件做路由。

(3)、Filter 是 Gateway 中的过滤器,在请求发出前后进行处理。

4、Route Predicate Factories 模式

After Route Predicate Factory

Before Route Predicate Factory

Between Route Predicate

FactoryCookie Route PredicateFactory

Header Route Predicate Factory

Host Route Predicate Factory

Method Route Predicate Factory

Path Route Predicate Factory

Query Route Predicate Factory

RemoteAddr Route Predicate Factory

路由扩展 which 接口很多,前后环绕模式都可以。有基于 COOKIE 的模式,基于 HEADER 的模式,基于 HOST 的模式,基于方法的模式,基于 PATH 的模式,基于 Query 参数的模式,基于远程地址的模式都可以进行拦截扩展。

 

三、实战 Spring Cloud Gateway

1、Spring Cloud Gateway 具体操作

做一个 Spring Cloud Gateway 项目需要加入必要的依赖,已经具备了必要的包,加入 Gateway 需要的技术组件,修改配置。和 zuul的开发过程不一样,有部分参数方式不一样。

基于 Spring Cloud Gateway2 的版本需要启用路由才可以,而zuul 是修改完配置后直接添加注解启动就可以了。如果不修改配置,请求就无法进行转发。

直接创建项目,选择 Spring Boot Dev Tools和Eureka Discovery clie。搜索 Gateway 就可以生成项目。核心是要修改配置。

//依赖包

<dependency>

<groupld>org.springframework.cloud</groupld>

<artifactld>spring-cloud-starter-

gateway</artifactld>

</dependency>

//配置文件,可以启用 gateway 也可以关闭。这里等于 false 是关闭 gateway。

spring.cloud.gateway.enabled=false

//配置路由,加入自己的基于配置文件私有的转发策略,私有的路由策略。这里 Gateway 和 zuul 的配置文件相像,Gateway 有自己的名字,和注册中心进行挂接。这里的注册中心是 eureka。

spring.application. name=Gateway

//服务器端口

eureka.instance.hostname=localhost

server.port=10000

eureka.client.serviceUrl.defaultZone=http://localhost:8761/ eureka/

//打开查询

eureka.client.fetch-registry=true

eureka.client.register-with-eureka=true

//gateway 必须显式启用,否则请求转发不过来。

spring.cloud.gateway.enabled=true

spring.cloud.gateway.discovery.locator.enabled=true

spring.cloud.gateway.discovery.locator.lower-case-service-id=true

这里注册中心和 Gateway 已经上线了。

挂接微服务和客户端,在 gateway 中调用 localhost:10000/order-microservice/hello,可以启动。

再上线一个微服务,检查这个微服务调用是否有路由的功能,测试一号服务器和二号服务器。两台微服务全部上线后,直接基于8001调用,结果是没有进行转发的。再调用 8002,显示可以调用出来。

Spring Cloud Gateway 本身已经获取了最新的服务列表,注册中心拉到了可用的两台服务实例,且默认支持轮询。这是最基本的对接,对接要注意依赖包和配置,配置必须启用,同时要注意版本差的问题。最核心的是依赖包,Gateway 的项目中必须有 Gateway 的依赖。Zuul是Netflix开发的,Spring Cloud 是官方开发的。Zuul1.0基于传统的阻塞式 API, Gateway 是基于响应式 API。理论上,Gateway 的吞吐量更高一点,但并不是绝对的,低并发情况下,Gateway 和 Zuul 的快慢不确定。

2、自定义路由

默认规则路由已经可以满足需求,如果需要特殊的路由规则,可以自定义路由。举例如下:

//请求地址中包含163,将它实际转发给 http://www.163.com 

return builder.routes()

.route(r -> r.path("/163/**" ).uri("http: / / www.163.com""))

.build();

这就是简单的自定义路由的规则,使用的语法是 lambda 语法,也可以是 which 语法。自定义扩展基本上都采用这种模式。也有其它的方法,比如基于字符串模式匹配规则都可以使用。这里是举的例子,在实际开发中可以根据项目需要自定义。

//配置文件定义,路径改为 path=/hi/**,就可以转发到实际后端的服务上。

spring.cloud.gatewayroutes[0].id= helloMicroservice

spring.cloud.gatewayroutes[0].uri=lb://helloMicroservice

spring.cloud.gatewayroutes[0].predicates[0]=path=/hi/**

zuul 也可以进行定制,但是默认设置就已经可以满足绝大多数项目的需求了。

 

四、总结

以上即是 Spring Cloud Gateway 网关的实践过程,要求把之前所做的项目和 Spring Cloud Gateway 集成起来,了解 Gateway 和 zuul 的区别,多掌握几种成熟的工具,在设计架构落地时有更多的方案,不会局限于一种,理解官方会推出 gateway 的原因。

下节课讲解面试题以及 Spring Cloud 和 Netflix 集成的知识点作为高级扩展知识。

相关文章
|
算法 Java 微服务
【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
微服务架构是What?? 微服务架构是一种架构模式,它提出将单一应用程序划分为一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。 每个服务允许在其独立的进程中,服务于服务间采用轻量级的通信机制互相协作(通常是Http协议的RESTful API或RPC协议)。 每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据上下文,选择合适的语言、工具对其进行构建
892 126
|
负载均衡 算法 Java
【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心
1. 什么是服务治理? SpringCloud封装了Netfix开发的Eureka模块来实现服务治理 在传统pc的远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册
639 0
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
缓存 JSON NoSQL
别再手写过滤器!SpringCloud Gateway 内置30 个,少写 80% 重复代码
小富分享Spring Cloud Gateway内置30+过滤器,涵盖请求、响应、路径、安全等场景,无需重复造轮子。通过配置实现Header处理、限流、重试、熔断等功能,提升网关开发效率,避免代码冗余。
903 1
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
768 1
|
jenkins Java 持续交付
使用 Jenkins 和 Spring Cloud 自动化微服务部署
随着单体应用逐渐被微服务架构取代,企业对快速发布、可扩展性和高可用性的需求日益增长。Jenkins 作为领先的持续集成与部署工具,结合 Spring Cloud 提供的云原生解决方案,能够有效简化微服务的开发、测试与部署流程。本文介绍了如何通过 Jenkins 实现微服务的自动化构建与部署,并结合 Spring Cloud 的配置管理、服务发现等功能,打造高效、稳定的微服务交付流程。
1365 0
使用 Jenkins 和 Spring Cloud 自动化微服务部署
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
1069 0
|
存储 XML 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南(一)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南
1476 0
|
监控 Java 应用服务中间件
Spring Cloud & Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(一))(JMeter模拟测试)
Spring Cloud & Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)(一)