开发者学堂课程【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 网关架构
观察结构有很多相似点,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 集成的知识点作为高级扩展知识。