网关gateway
1.什么是网关
API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API
2.网关在架构中的地位
现在前后端分离的系统一般都是如下设计:
nginx做静态资源服务器,前端页面调用后台接口时先请求到nginx,nginx负载均衡路由到后端网关(gateway),然后网关做请求身份验证,服务路由,日志记录等等操作,再转发业务处理接口,处理完返回数据
3.网关和nginx的区别
网关应当具备以下功能:
- 性能:API高可用,负载均衡,容错机制。
- 安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
- 日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
- 缓存:数据缓存。
- 监控:记录请求响应数据,api耗时分析,性能监控。
- 限流:流量控制,错峰流控,可以定义多种限流规则。
- 灰度:线上灰度部署,可以减小风险。
- 路由:动态路由规则
以上功能对系统的稳定性和健壮性至关重要。
nginx和Spring Cloud Gateway在功能上是有一些重叠的地方,都可以做服务转发。但是网关在大型微服务系统中是一个很重的角色,Spring Cloud Gateway是专为为网关的角色而设计的,功能强大,而且是官方出品,所以在大型系统开发中基本上都会选用此组件。
而nginx只能实现一些上面所说的一部分功能,一般都是选择nginx做静态资源缓存和前端调用接口的负载均衡。
在网络模型中,nginx是四层负载均衡,gateway是七层负载均衡。关于负载均衡的资料:https://lawrenceli.me/blog/load-balancing
4.网关的核心
-
路由(route): 网关最基础的部分,也是网关比较基础的工作单元。路由由一个ID、一个目标 URL(最终路由到的地址)、一系列的断言(匹配条件判断)和Filter过滤器(精细化控制)组 成。如果断言为true,则匹配该路由。
-
断言(predicates):参考了Java8中的断言java.util.function.Predicate,开发人员可以匹配Http 请求中的所有内容(包括请求头、请求参数等)(类似于nginx中的location匹配一样),如果断 言与请求相匹配则路由
-
过滤器(filter):一个标准的Spring webFilter,使用过滤器,可以在请求之前或者之后执行业务逻辑
断言是我们的匹配条件,结合目标的url,就可以确定一个具体的路由。
项目结构
父级目录的pom
<dependencyManagement>
<dependencies>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
</dependencies>
gateway模块的pom
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
gateway模块的配置文件
server.port=80
spring.application.name=cloud-gateway
#路由id
spring.cloud.gateway.routes[0].id=gateway-id
#路由url
spring.cloud.gateway.routes[0].uri=http://localhost:8001
#断言
spring.cloud.gateway.routes[0].predicates[0]=Path=/order/**
路由url是order模块的请求地址
by the way:虽然我喜欢用properties配置文件,但是用yml配置gateway更顺手
---------------------初步demo over----------------------------------------