作者:smdkfdBoCloud|前言作为NetflixZuul的替代者,SpringCloudGateway是一款非常实用的微服务网关,在SpringCloud微服
作者: smdkfdBoCloud|
前言作为Netflix Zuul的替代,Spring Cloud网关是一个非常实用的微服务网关,在Spring Cloud微服务体系结构中起着非常大的作用。 本文组织了spring云网关的常见使用场景,以帮助微服务开发人员。
微服务网关SpringCloudGateway
1 .概述spring云网关是spring基于Spring 5.0、Spring Boot2.0、项目reactor等技术正式开发的网关,spring云网关是微服务作为Spring Cloud生态系统中的网关,Spring Cloud网关不仅提供统一的路由选择,而且还提供了安全性、监控/嵌入点和流
2 .核心概念网关提供API的完全管理服务,提供丰富的API管理功能,帮助企业管理大型API,降低管理成本和安全风险,实现协议匹配、协议传输、安全策略、防刷、防草网关暴露到外部的URL或接口信息通常统称为路由信息。 任何开发过网关中间件或使用过Zuul的人都知道网关的中心是过滤器和过滤器通道(过滤器责任链)。 sprig云网关也有路由和过滤器概念。 以下是spring云网关的一些重要概念。
路由。 路由是网关的最基本部分,路由信息包括ID、目标URL、断言组和过滤器组。 如果断言根为true,则表示请求的URL与配置匹配
断言。 Java8断言函数。 Spring Cloud Gateway断言函数的输入类型是Spring5.0框架的ServerWebExchange。 Spring Cloud Gateway断言函数允许开发人员定义匹配来自http请求的任何信息,包括请求标头和参数。
过滤器。 是标准的spring web过滤器。 spring cloud网关过滤器有两种类型的过滤器:网关过滤器和全局过滤器。 过滤器过滤器过滤器修改处理请求和响应
来自spring cloud网关的请求。 然后,在网关处理程序映射中找到与请求匹配的路由,并将其发送到网关网络处理程序。 Handler通过指定的过滤器链将请求发送回实际的服务执行业务逻辑。
快速启动以开发Spring Boot框架为例,启动以Consul为注册中心的网关服务模块和后端服务模块。 客户端请求通过网关服务将请求路由到后端服务。
先决条件:
控制:1.5.0版。 spring bot:2.1.5版。 spring cloud:Greenwich.sr1版本。 redis:5.0.5版。 1 .微服务开发
下面是一个使用Spring Boot框架开发微服务的示例。 启动服务并注册Consul。
部署依赖关系:
org.spring framework.cloud spring-cloud-starter-Consul-discovery在consul中注册服务,配置文件如下:
spring : application : name : service-consumer cloud : consul : host :127.0.0.1 port 3:8500 discovery 3360
@ rest controller @ request mapping (/user ) ) publicclassusercontroller ) @ resourceprivateuserserviceuserservice; @getmapping(value='/info ' ) public User info ) { return userService.info; }
注:这是服务器端设置,通过网关将请求路由转发到服务器。
2 .网关配置
创建引入以下依赖关系的网关服务:
org.spring帧. cloud spring-cloud-starter-gateway org.spring帧. cloud spring-cloud-starter-consul
@ springbootapplication @ enablediscoveryclientpublicclassgatewayapplication { publicstaticvoidmain { string [ ] args } { spririprid }
run(GatewayApplication.class, args);}
}
Spring Cloud Gateway对client端请求起到路由功能,主要配置如下:
server:port: 8098spring:application:name: service-gatewaycloud:gateway: discovery: locator: enabled: true lower-case-service-id: true consul: host: 127.0.0.1 #注册gateway网关到consul port: 8500 discovery: service-name: service-gateway
此时使用http://localhost:8089/service-consumer/user/info访问服务,网关即可对服务进行路由转发,把请求转发到具体后端服务上。此时,url中使用的url前缀service-consumer,是后端服务在Consul注册的服务名称转为小写字母以后的字符串。
最佳实践
01 Gateway网关配置
本文第二部分开发规范中定义了网关进行路由转发的配置,除了上述配置方式还可以使用下面的方式进行配置:
gateway: discovery: locator: enabled: true lower-case-service-id: true routes: - id: service_consumer uri: lb://service-consumer predicates: - Path= /consumer/** filters: - StripPrefix=1
在上面的配置中,配置了一个Path的predicat,将以/consumer/**开头的请求都会转发到uri为lb://service-consumer的地址上,lb://service-consumer(注册中心中服务的名称)即service-consumer服务的负载均衡地址,并用StripPrefix的filter 在转发之前将/consumer去掉。同时将spring.cloud.gateway.discovery.locator.enabled改为false,如果不改的话,之前的http://localhost:8081/service-consumer/user/info这样的请求地址也能正常访问,因为这时为每个服务创建了2个router。
本文第二部分和本节一共讲述了两种配置方式,两种配置都可以实现请求路由转发的功能。参数spring.cloud.gateway.discovery.locator.enabled为true,表明Gateway开启服务注册和发现的功能,并且Spring Cloud Gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务。spring.cloud.gateway.discovery.locator.lowerCaseServiceId是将请求路径上的服务名配置为小写(因为服务注册的时候,向注册中心注册时将服务名转成大写的了)。
gateway: discovery: locator: enabled: true lower-case-service-id: true
02 Gateway跨域访问
Spring Cloud Gateway还针对跨域访问做了设计,可以使用以下配置解决跨域访问问题:
spring:cloud:gateway: globalcors: corsConfigurations: '[/**]': allowedOrigins: "https://docs.spring.io" allowedMethods: - GET allowHeaders: - Content-Type
在上面的示例中,允许来自https://docs.spring.io的get请求进行访问,并且表明服务器允许请求头中携带字段Content-Type。
03 Gateway 过滤器
Spring Cloud Gateway的filter生命周期不像Zuul那么丰富,它只有两个:“pre”和“post”:
pre:这种过滤器在请求被路由之前调用。可以利用这个过滤器实现身份验证、在集群中选择请求的微服务、记录调试的信息。
post:这种过滤器在路由到服务器之后执行。这种过滤器可用来为响应添加HTTP Header、统计信息和指标、响应从微服务发送给客户端等。
Spring Cloud gateway的filter分为两种:GatewayFilter和Globalfilter。GlobalFilter会应用到所有的路由上,而Gatewayfilter将应用到单个路由或者一个分组的路由上。
利用Gatewayfilter可以修改请求的http的请求或者是响应,或者根据请求或者响应做一些特殊的限制。更多时候可以利用Gatewayfilter做一些具体的路由配置。
下面的配置是AddRequestParameter Gatewayfilter的相关配置。
spring:application:name: service-gatewaycloud:gateway: discovery: locator: enabled: true routes: - id: parameter_route uri: http://localhost:8504/user/info filters: - AddRequestParameter=foo, bar predicates: - Method=GET
上述配置中指定了转发的地址,设置所有的GET方法都会自动添加foo=bar,当请求符合上述路由条件时,即可在后端服务上接收到Gateway网关添加的参数。
另外再介绍一种比较常用的filter,即StripPrefix gateway filter。
配置如下:
spring:cloud:gateway: routes: - id: stripprefixfilter uri: lb://service-consumer predicates: - Path=/consumer/** filters: - StripPrefix=1
当client端使用http://localhost:8098/consumer/user/info路径进行请求时,如果根据上述进行配置Gateway会将请求转换为http://localhost:8098/service-consumer/user/info。以此作为前端请求的最终目的地。
04 Gateway请求匹配
Gateway网关可以根据不同的方式进行匹配进而把请求分发到不同的后端服务上。
通过header进行匹配,把请求分发到不同的服务上,配置如下:
spring:cloud:gateway: routes: - id: header_route uri: http://baidu.com predicates: - Header=X-Request-Id, d+
通过curl测试:curl http://localhost:8080 -H "X-Request-Id:666666