一、微服务网关
1、什么是微服务网关
在传统的单体架构中,我们只需要开放一个服务给客户端调用即可。
但是微服务架构中是将一个系统拆分成多个微服务,不同的微服务一般会有不同的网络地址,客户端在访问这些微服务时必须记住几十甚至几百个地址,这对于客户端方来说太复杂也难以维护,而且一不小心就会出错,这在开发测试中深有体会。然而有了网关就不一样了:网关作为系统的唯一流量入口,所有请求都必须先经过网关,由网关将请求路由到合适的微服务。网关有以下几点好处:
- 交互更简单:减少了客户端与各个微服务之间的交互次数
- 授权认证:在网关上进行认证,再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
- 安全 :只有网关系统对外进行暴露,微服务可以隐藏在内网,通过防火墙保护。
2、服务网关的基本功能
3、微服务架构中网关的位置
二、gateway概述
1、官网:spring-cloud-gateway
2、gateway是什么?(稍作了解)
SpringCloud Gateway 是 Spring Cloud 的一个全新项目,基于 Spring 5.0+Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在提供统一的路由方式且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,限流。
SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
3、gateway能干什么?
反向代理、鉴权、流量控制、熔断、日志监控......
4、为什么选择gateway作为网关?
从商业方面来说,一方面因为Zuul1.0已经进入了维护阶段,而且Gateway是SpringCloud团队研发的,是亲儿子产品,值得信赖。另一方面虽然Netflix早就发布了最新的 Zuul 2.x,但 Spring Cloud 貌似没有整合计划。而且Netflix相关组件都宣布进入维护期,不知前景如何?
从技术层面来说,Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心。而且很多功能Zuul都没有用起来,而gateway用起来非常的简单便捷。
多方面综合考虑Gateway是很理想的网关选择。
三、Spring Cloud Gateway网关路由环境搭建
1、引入依赖
<properties>
<spring-boot.version>2.3.2.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
</properties>
<!-- 添加依赖 -->
<dependencyManagement>
<dependencies>
<!-- 声明springBoot版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 声明springCloud版本 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 声明 springCloud Alibaba 版本 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 引入gateway网关,这里一定要排除spring-boot-starter-web依赖,否则启动会报错 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
2、配置yml文件
server:
port: 8090
spring:
application:
name: cloud-gateway
到这里环境也就搭建完成了,其实就是在创建一个boot项目,然后在其中引入了一个gateway网关的依赖,注意在pom文件中需要排除spring-boot-starter-web依赖,否则启动会报错。
接下来我们一起来看一下yml中如何具体进行gateway网关的配置:
四、gateway三大配置项
1、Route(路由)
路由是构建网关的基本模块,它由ID,目标URI,断言集合和过滤器集合组成,如果断言为true,则转发到该路由。
- id:路由标识,要求唯一,名称任意(建议配合服务名)
- uri:请求最终被转发到的目标地址
- order: 路由优先级,数字越小,优先级越高
- predicates:断言数组(判断条件),路径相匹配的进行路由
- filters:过滤器数组,可以在返回请求之前或之后时修改请求和响应的内容。
2、Predicate(断言)
断言(Predicate)是基于Spring WebFlux的HandlerMapping实现的。Gateway包含了很多路由断言工厂(spring-cloud-gateway内置的断言),并且这些工厂对应着HTTP请求的很多属性进行了处理,当客户端发送HTTP请求时,HandlerMapping会获取请求参数,并与Gateway中配置的Predicates进行比对,若满足规则就按规则约定进行路由放行,否则拒绝访问或报404错误。
上述断言的种类有十一中,这里以其中几种为例介绍一下如何配置使用:
spring:
cloud:
gateway:
routes: # 路由数组,当请求满足什么样的断言时,转发到哪个微服务上
- id: payment_route1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后被转发的路由地址
# 设置断言
predicates:
# Path Route Predicate Factory 断言,满足/payment/get/** 路径的请求都会被路由到 http://localhost:8001 这个uri中
- Path=/payment/get/**
- id: payment_route2 #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后被转发的路由地址
# 设置断言
predicates:
- Path=/payment/lb/** # 断言,路径相匹配的进行路由
- After=2023-01-08T15:10:03.685+08:00[Asia/Shanghai] # 断言,路径相匹配的进行路由
3、Filter(过滤)
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。