文章目录
1:Gateway简介
1:Api网关介绍
网关的角色是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。
API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制
和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。因此,隐藏在
API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。
在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管
理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进
行设计,这就要求必须使用一种语言和平 台无关的服务协议作为各个单元间的通讯方式。
2:Api网关作用
3:Api网关开源实现
用于实现API网关的技术有很多,大致分为这么几类:
通用反向代理:Nginx、Haproxy、……
网络编程框架:Netty、Servlet、……
API网关框架:Spring Cloud Gateway、Zuul、Zuul2、……
4:Gateway网关介绍
官网:https://spring.io/projects/spring-cloud-gateway
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的
网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。
Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由
方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
spring Cloud Gateway 可以看做是一个 Zuul 1.x 的升级版和代替品,比 Zuul 2 更早的使用 Netty 实现
异步 IO,从而实现了一个简单、比 Zuul 1.x 更高效的、与 Spring Cloud 紧密配合的 API 网关。
Spring Cloud Gateway 里明确的区分了 Router 和 Filter,并且一个很大的特点是内置了非常多的开箱
即用功能,并且都可以通过 SpringBoot 配置或者手工编码链式调用来使用。
比如内置了 10 种 Router,使得我们可以直接配置一下就可以随心所欲的根据 Header、或者 Path、或
者 Host、或者 Query 来做路由。
比如区分了一般的 Filter 和全局 Filter,内置了 20 种 Filter 和 9 种全局 Filter,也都可以直接用。当然
自定义 Filter 也非常方便。
gateway特点:
- 基于SpringFramework5,ProjectReactor和SpringBoot2.0进行构建
- 能够匹配任何任何请求属性
- 可以对路由指定Predicates和Filters
- 集成断路器
- 集成Spring Cloud服务发现
- 易于编写的Predicates和Filters
- 支持请求限流
- 支持路径重写
2:Gateway工作原理
工作原理图
客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到
网关Web处理程序。该处理程序通过特定于请求的过滤器链来运行请求。筛选器由虚线分隔的原因是,
筛选器可以在发送代理请求之前和之后都运行逻辑。所有“前置”过滤器逻辑均被执行。然后发出代理请
求。发出代理请求后,将运行“后”过滤器逻辑。
gateway三个概念:
- 路由:路由是构建网关的基本模块,它由ID,目标URI,一系列的断言Predicates和过滤器Filters组成,如果断言为true,则匹配该路由。
- 断言:参考Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容,例如请求头或请求参数,如果请求与断言相匹配则进行路由。
- 过滤:Spring框架中GatewayFilter的实例,使用过滤器,可以载请求被路由前或者后对请求进行修改。
3:gateway的Helloworld程序
1:设置order服务(普通服务)
application.yml
server:
port: 19092
spring:
application:
name: gateway-order
2:设置user服务(普通服务)
application.yml
server:
port: 19091
spring:
application:
name: gateway-user
3:设置gateway-server服务
1:导包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2:配置application.yml
server:
port: 19090
spring:
application:
name: gateway-server
cloud:
gateway:
routes: #路由规则定义
- id: gataway-user #路由ID,必须唯一
uri: http://localhost:19091/ #路由地址,后续也可更改成其他的类型,诸如指向微服务
predicates: # 断言规则,既满足此断言既按照此路由规则跳转
- Path=/user/** #请注意这个Path的P是大写的!
- id: gateway-order
uri: http://localhost:19092/
predicates:
- Path=/order/**
4:测试