客户由发送请求由Nginx服务器已经将请求转发到一个服务器上,但是服务之前我们还需要一个网关将这些请求进一步加工处理到服务上,这一步就是GateWay.
GateWay
1.GateWay服务是不需要进入以下jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.GateWay是基于异步非阻塞模型上开发的;zuul1基于servlet2.5使用阻塞模型开发。
3.Spring Cloud Gateway具有如下特性::
①:动态路由:能够匹配任何请求属性;
②:可以对路由指定Predicate (断言)和Filter (过滤器);
③:集成Hystrix的断路器功能;
④:集成Spring Cloud服务发现功能;
⑤:易于编写的Predicate(断言)和Filter (过滤器);
⑥:请求限流功能;
⑦:支持路径重写。
3…GatWay的三大核心概念:
①:Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由
②:Predicate(断言):可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
③:Filter(过滤):可以在请求被路由前或者之后对请求进行修改.
4.GatWay工作流程:客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到GatewayWeb Handler;Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
5.predicate就是我们的匹配条件;而filter就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由。
6.GatwWay的两种配置方法
application.yml配置文件
server:
port: 9527
eureka:
instance:
hostname: cloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eureka7001.com:7001/eureka
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8081 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由
- id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8081 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
predicates:
- Path=/payment/lb/** # 断言,路径相匹配的进行路由
#- After=2020-12-11T22:01:00.869+08:00[GMT+08:00]
#- Cookie=username,charon
#- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式
#- Method=GET
#- Query=username, \d+ #要有参数名username,值必须为整数才能路由 (可以只写一个参数名不带值)
#filters:
#- AddRequestHeader=X-Request-Id, 1024 #过滤器工厂会在匹配的请求头上加一对请求,名称为X-Request-Id值为1024
JavaBean注入
@Configuration
public class GateWayConfig {
/**
* 配置一个id为path_route_charon路由规则,
* 当访问http://localhost:9527/guonei是自动跳转到http://news.baidu.com/guonei
* @param routeLocatorBuilder
* @return
*/
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("path_route_charon",r ->
r.path("/guonei").uri("http://news.baidu.com/guonei")
).build();
routes.route("path_route_charon2",r ->
r.path("/guoji").uri("http://news.baidu.com/guoji")
).build();
return routes.build();
}
}
7.默认情况下Gatway会根据注册中心注册的服务列表, 以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能
8.常用的Route Predicate:
一:After Route Predicate :
二:Before Route Predicate :
三:Between Route Predicate :
四:Cookie Route Predicate (带上cookie):
五:Header Route Predicate :
六:Host Route Predicate:
七:Method Route Predicate:
八:Path Route Predicate:
九:Query Route Predicate:
十:RemoteAddr Route Predicate:
十一:Weight Route Predicate:
补充:使用方式可以查看上面配置文件和下例图片:
9.Filter生命周期:pre和post;
过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等。在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。
10.种类:GateWayFilter和GlobalerFiter
GlobalerFiter是对于请求进行过滤筛选
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("***********come in MyLogGateWayFilter: "+new Date());
String username = exchange.getRequest().getQueryParams().getFirst("username");
if(StringUtils.isBlank(username)){
log.info("*******用户名为null,非法用户,禁止进入");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
/**
* 加载过滤器的顺序 一般数字越小优先级越高
* @return
*/
@Override
public int getOrder() {
return 0;
}
}