# 什么是微服务网关?
微服务网关是微服务架构系统的唯一入口,能把系统的能力统一经过它对客户端进行开放,类似于面向对象的封装,提供统一的入口,具体里面的业务方法是怎样实现并不公开,只不过网关封装了系统内部架构,为每个客户端提供一个定制的 API。
基于他是所有 API 的入口这个特性, 所以它可以方便的全局实现如身份验证 (黑白名单)、监控、负载均衡、缓存、协议转换、限流熔断、灰度发布等功能。
微服务网关作为连接服务的消费方和服务提供方的中间件系统,将各自的业务系统的演进和发展做了天然的隔离,使业务系统更加专注于业务服务本身,同时微服务网关还可以为服务提供和沉淀更多附加功能
它的主要作用:
请求接入
管理所有接入请求,作为所有 API 请求的入口
业务聚合
所有微服务后端可以注册在 API 网关,通过 API 网关统一暴露服务
拦截策略
可以提供统一增加安全、路由、流控、负载均衡等公共服务组件
统一管理
提供统一监控管理工具,配置管理工具,Swagger 工具等设施
# 1. 过滤器与网关的区别
- 过滤器只适合当个服务的过滤请求
- 网关能拦截整个微服务,实现过滤请求,能够解决整个微服务中的冗余代码
- 过滤器是局部拦截,网关是全局拦截
# 2. Zuul 与 Gateway 有哪些区别
项目 | Zuul | GateWay |
---|---|---|
基本说明 | Zuul 是属于 netflix 公司的开源产品属于第一代网关 | Gateway 属于 SpringCloud 自研发的网关框架,属于第二代微服务网关 |
底层实现 | Zuul 网关底层基于 Servlet 实现的,处理 http 请求,阻塞式的 Api | 基于 netty 环境依赖 SpringBoot-WebFux,非阻塞式 API |
长连接支持 | 不支持 | 支持 |
负载均衡支持 | 如果需要负载均衡,需要额外集成其他负载均衡框架,可以扩展至其他微服务框架中 | 提供了抽象负载均衡,提供了抽象流控,并默认实现了 RedisRateLimiter,仅适合于 Spring Cloud 套件 |
总体来说,由于 Spring gateway 使用了支持 NIO 处理的 Netty 容器,能够非阻塞的处理客户端请求,消耗硬件资源会比 Zuul 更少,效率相对较高,同时本身支持对请求的负载均衡和限流,所以他是在 Spring Cloud 项目中的不二选择
# 如何使用 Spring Gateway
# 1. 添加依赖
<parent> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-parent</artifactId> | |
<version>2.0.0.RELEASE</version> | |
</parent> | |
<dependencies> | |
<dependency> | |
<groupId>org.springframework.cloud</groupId> | |
<artifactId>spring-cloud-starter-gateway</artifactId> | |
<version>2.0.0.RELEASE</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-web</artifactId> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework.cloud</groupId> | |
<artifactId>spring-cloud-starter-loadbalancer</artifactId> | |
</dependency> | |
</dependencies> |
# 2. 添加配置文件 application.yml
server: | |
port: 6001 | |
spring: | |
application: | |
name: bo-spring-gateway | |
cloud: | |
config: | |
override-system-properties: false | |
override-none: true | |
gateway: | |
discovery: | |
locator: | |
enabled: true | |
routes: | |
- id: api-web-management | |
uri: lb://api-web-management | |
predicates: | |
- Path=/api-web-management/** | |
- id: center-integrated-auth | |
uri: lb://center-integrated-auth | |
predicates: | |
- Path=/center-integrated-auth/** | |
- id: center-system-base | |
uri: lb://center-system-base | |
predicates: | |
- Path=/center-system-base/** |
# 3. 编写启动类
@SpringBootApplication | |
public class SpringGatewayApplication { | |
public static void main(String[] args) { | |
SpringApplication.run(SpringGatewayApplication.class,args); | |
} | |
} |
由于gateway不依赖于serverlet,注意项目启动之前检查是否去除对serverlet的依赖
# 4. 常用的断言和过滤器
# 断言 Predicates
规则 | 实例 | 说明 |
---|---|---|
Path | - Path=/gate/,/rule/ | ## 当请求的路径为 gate、rule 开头的时,转发到 http://localhost:9023 服务器上 |
Before | - Before=2017-01-20T17:42:47.789-07:00[America/Denver] | 在某个时间之前的请求才会被转发到 http://localhost:9023 服务器上 |
After | - After=2017-01-20T17:42:47.789-07:00[America/Denver] | 在某个时间之后的请求才会被转发 |
Between | - Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver] | 在某个时间段之间的才会被转发 |
Cookie | - Cookie=chocolate, ch.p | 名为 chocolate 的表单或者满足正则 ch.p 的表单才会被匹配到进行请求转发 |
Header | - Header=X-Request-Id, \d+ | 携带参数 X-Request-Id 或者满足 \d + 的请求头才会匹配 |
Host | - Host=www.hd123.com | 当主机名为 www.hd123.com 的时候直接转发到 http://localhost:9023 服务器上 |
Method | - Method=GET | 只有 GET 方法才会匹配转发请求,还可以限定 POST、PUT 等请求方式 |
使用示例
server: | |
port: 8080 | |
spring: | |
cloud: | |
gateway: | |
routes: | |
- id: query_route | |
uri: https://example.org | |
predicates: | |
- Method=GET |
# 过滤器 Filter
过滤规则 | 实例 | 说明 |
---|---|---|
PrefixPath | - PrefixPath=/app | 在请求路径前加上 app |
RewritePath | - RewritePath=/test, /app/test | 访问 localhost:9022/test, 请求会转发到 localhost:8001/app/test |
SetPath | SetPath=/app/ | 通过模板设置路径,转发的规则时会在路径前增加 app,{path} 表示原请求路径 |
RedirectTo | 重定向 | |
RemoveRequestHeader | 去掉某个请求头信息 |
过滤器常用的是请求地址的重写
spring: | |
cloud: | |
gateway: | |
routes: | |
- id: rewrite_filter | |
uri: http://localhost:8081 | |
predicates: | |
- Path=/test/** | |
filters: | |
- RewritePath=/where(?<segment>/?.*), /test(?<segment>/?.*) |