在正式学习网关之前需要弄清楚几个问题
- 一、什么是服务网关
- 二、为什么需要服务网关
- 三、SpringCloud Gateway
什么是网关?
API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。
为什么需要服务网关?
服务网关有以下功能:
- 性能:API高可用,负载均衡,容错机制。
- 安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
- 日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
- 缓存:数据缓存。
- 监控:记录请求响应数据,api耗时分析,性能监控。
- 限流:流量控制,错峰流控,可以定义多种限流规则。
- 灰度:线上灰度部署,可以减小风险。
- 路由:动态路由规则。
一个简单的微服务架构大致如下图:
总体流程
- 客户端发送请求
- nginx负载均衡到api网关
- springcloud gateway负载均衡到服务,服务做处理
SpringCloud Gateway
怎样快速了解一个新的知识呢?当然是去官网啦!!官网链接spring-cloud-gateway
路由-Route
一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。
配置文件方式配置
server:
port: 8080
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: service1 ## id
uri: lb://service1 ## 目标服务地址 lb:表示负载均衡
predicates:
-Path=/service1/api ## 使用GatewayPredicate的实现类PathPredicate
filter:
-StripPerfix=1 ## 使用GatewayFilter的实现类StripPerfixGatewayFilterFactory
代码注入
@Bean
public RouteLocator service1Locator(RouteLocatorBuilder builder) {
return builder.routes()
.route("service1", r -> r.path("/service1/api")
.filters(f->f.stripPrefix(1))
.uri("lb://service1"))
.build();
}
至于其他的断言或者过滤器这里就不在多写了,可以参考大佬的这篇史上最全springcloud gateway