一、Gateway 网关简介
- spring cloud Gateway 是spring 基于spring 5.0 spring boot 2.0、Project Reactor等技术开发
- spring cloud Gateway 基于filter链提供网关基本功能:安全、监控/埋点、限流等
- spring cloud Gateway 为微服务架构提供简单、有效的统一api路由器管理方式。
- spring cloud GateWay 代替 Netflix Zuul 的解决方案。 Netflix Zuul 目前处于维护状态,无新功能的开发
核心:过滤和路由
Gateway组件核心是一系列的过滤器,通过这些过滤器将客户端的请求转发到对应的微服务中,是加在整个微服务最前沿的防火墙和代理器,隐藏微服务ip信息,从而加强安全保护。Gateway本身就是一个微服务,需要注册到Eureka中。
添加网关Gateway微服务架构图:
不管使来自客户端的请求,还是服务内部调用都可通过网关,然后在通过网关实现鉴权、动态路由等操作。网关就是统一入口。
核心概念:
- 路由(route) :路由信息组成。由一个Id、一个目的URL、一组断言工厂、一组filter组成。如果路由器断言为真。说明请求Url和配置路由匹配。
- 断言(predicate):Gateway中的断言函数输入类型是spring 5.0 框架中的 serverWebExchange。Gateway中的断言函数允许开发者自定义匹配来自 http request 中的任何信息。参数和请求头。
- 过滤器(filter): 一个标准的spring WebFilter.Gateway中的filter 分为2种类型。分别是 Gateway Filter 、Global Filter。过滤器会将请求和响应进行修改处理。
二、简单入门
1、所需依赖pom.xml 需要注册到eureke 注册中心所以添加Eureka client 依赖
1 <dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-starter-gateway</artifactId> 4 </dependency> 5 6 <dependency> 7 <groupId>org.springframework.cloud</groupId> 8 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 9 </dependency>
2、启动添加注解 @EnableDiscoveryClient
3、配置文件application.yml 添加路由配置 、将请求到网关服务地址中包含 /provider/ 的请求路由转发的 192.168.188.10:9091 服务上
1 spring: 2 cloud: 3 gateway: 4 routes: 5 # 路由Id 6 - id: springcloud-eureka-provider-routes 7 #代理服务器地址 8 uri: http://192.168.188.10:9091 9 #断言规则 10 predicates: 11 - Path=/provider/**
路由地址写死不合理,可spring cloud Gateway 中通过配置动态路由。详情见:面向服务路由
三、面向服务路由 将ip地址 使用lb://服务名代替 Gateway根据服务名通过ribbon算法获取服务地址 ,lb:后的服务名必须在Eureka中注册才能使用
1 spring: 2 cloud: 3 gateway: 4 routes: 5 # 路由Id 6 - id: springcloud-eureka-provider-routes 7 #代理服务器地址 8 uri: lb://springcloud-eureka-provider 9 #断言规则 10 predicates: 11 - Path=/provider/**
log 分析
四、 路由前缀处理
1、前缀的添加与去除
客户端请求地址与微服务请求地址不一致时,可通过配置路径过滤器实现路径前缀的添加个去除
添加前缀配置:关键字:PrefixPath
1 spring: 2 cloud: 3 gateway: 4 routes: 5 # 路由Id 6 - id: springcloud-eureka-provider-routes 7 #代理服务器地址 8 uri: lb://springcloud-eureka-provider 9 #断言规则 10 predicates: 11 - Path=/** 12 filters: 13 - PrefixPath=/provider
去除前缀配置: 关键:StripPrefix
spring:
cloud:
gateway:
routes:
# 路由Id
- id: springcloud-eureka-provider-routes
#代理服务器地址
uri: lb://springcloud-eureka-provider
#断言规则
predicates:
#- Path=/**
- Path=/api/provider/**
filters:
#配置去除前缀 1:标识1个路径 2:标识2个路径 以此类推
- StripPrefix=1