SpringCloudGateway的基础使用
一、gateway和zuul的区别
(1)Zuul1.x和Zuul2.x是netflix的项目。Zuul1.x是基于Servlet2.5的阻塞I/O设计的。
(2)Zuul2.x虽然理念很先进,想基于netty实现长连接和非堵塞,但目前springcloud并没有集成。
(3)Gateway是基于Spring Framework5、Project Reactor和Spring Boot2的非阻塞API。每秒请求数是Zuul的1.6倍。
二、gateway的引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
由于对版本进行的统一管理,需要的版本信息,请参考HystrixBoard那一节
注意:引入该依赖的项目,一定不能引入spring-boot-starter-web,否则日志中会出现如下情况:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fcYSkU25-1646100649655)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220228182027418.png)]
三、gateway的三大组件
(1)Routes路由
路由可以通过二种方式进行配置,更常用的是第一种
a.第一种:配置文件的方式
spring:
cloud:
gateway:
routes:
- id: payment_routh1
uri: lb://cloud-payment //使用lb搭配服务名进行访问
predicates:
- Path=/payment/lb/**
discovery:
locator:
enabled: true //开启负载均衡的功能
在配置中一定要注意数组的yaml格式,如果Path和前面的中划线-之间忘记预留空格,会出现如下的错误:
Unable to find RoutePredicateFactory with name -Path
b. 第二种:配置类的方式
@Configuration
public class GatewayConfiguration {
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder){
RouteLocatorBuilder.Builder routes = builder.routes();
routes.route("baidu-test",r->r.path("/test").uri("https://www.baidu.com")).build();
return routes.build();
}
}
(2)Predicate 断言
通过Spring官网可以看到断言总共有12种,每一种的含义在这里不过多解释。下面我们随便挑一两种进行演示。
a.After
获取以上After的时间方式如下:
当前时间如果在After之前,可以正常访问,如果在After之后,就会导致访问出现以下错误:
b. Between和Cookie
使用curl的方式进行访问
**如果提示curl非内部命令,需要对curl进行安装,并在Path环境变量中进行配置。**本步骤自行操作。
(3)Filters 过滤器
过滤器分为:GatewayFilter和Golbal Filters
a.GatewayFilter网关过滤器
举例如下:
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: lb://cloud-payment
predicates:
- Path=/cad-plot/payment/lb/**
- Cookie=username,yyzz
filters:
- AddRequestHeader=X-Request-red, blue
可以使用curl进行访问
b.Golbal Filters全局过滤器
举例如下:
package com.telit.forest.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class GatewayGolbalFilter implements GlobalFilter, Ordered {
@Override
public int getOrder() {
return 0;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("GatewayGolbalFilter come in.......");
String username = exchange.getRequest().getQueryParams().getFirst("username");
if(StringUtils.isEmpty(username)){
exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
}
访问url:
http://localhost:9527/cad-plot/payment/lb?username=abc
可以获取到正确的数据。