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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 快速学习 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.0Spring 模式,它运用的是 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 有请求处理,之前的是 SpriteGateway 也有 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 集成的知识点作为高级扩展知识。

相关文章
|
17天前
|
自然语言处理 Java API
Spring Boot 接入大模型实战:通义千问赋能智能应用快速构建
【10月更文挑战第23天】在人工智能(AI)技术飞速发展的今天,大模型如通义千问(阿里云推出的生成式对话引擎)等已成为推动智能应用创新的重要力量。然而,对于许多开发者而言,如何高效、便捷地接入这些大模型并构建出功能丰富的智能应用仍是一个挑战。
74 6
|
21天前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
53 2
|
1月前
|
Java 数据库连接 Spring
【2021Spring编程实战笔记】Spring开发分享~(下)
【2021Spring编程实战笔记】Spring开发分享~(下)
25 1
|
23天前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
59 0
|
1月前
|
XML Java 数据库连接
【2020Spring编程实战笔记】Spring开发分享~(上)
【2020Spring编程实战笔记】Spring开发分享~
48 0
|
2月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
2月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
3月前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。
|
3月前
|
负载均衡 应用服务中间件 持续交付
微服务架构下的Web服务器部署
【8月更文第28天】随着互联网应用的不断发展,传统的单体应用架构逐渐显露出其局限性,特别是在可扩展性和维护性方面。为了解决这些问题,微服务架构应运而生。微服务架构通过将应用程序分解成一系列小型、独立的服务来提高系统的灵活性和可维护性。本文将探讨如何在微服务架构中有效部署和管理Web服务器实例,并提供一些实际的代码示例。
108 0
|
1天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
20 6
下一篇
无影云桌面