SpringCloud学习—— 网关GateWay
Posted Johnny*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud学习—— 网关GateWay相关的知识,希望对你有一定的参考价值。
网关在微服务中的位置
Zuul1.x模型
Spring Cloud所集成的zuul版本,采用的是Tomcat容器,使用的是传统的Servlet IO处理模型
SpringCloud Gateway
传统的Web框架,像struct2、springmv 等都是 基于Servlet API 和Servlet容器运行的。
但是在Servlet3.1之后增加了异步阻塞的支持。而WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty、Undertow及支持Servlet3.1的容器上。
SpringCloud GateWay是基于WebFlux框架实现的,而WebFlux框架底层则使用高性能的Reactor模式通信框架Netty。
Spring Cloud GateWay 的目标是提供统一的路由方式且基于Filter链的方式提供网关基本的功能,例如: 安全、监控/指标和 限流。
SpringCloud Gateway的特性
Gateway 是基于异步非阻塞模型,性能方面表现较好。
- 动态路由:能够匹配任何请求的属性
- 可以对路由指定断言(predicate)和过滤器(Filter)
- 继承Hystrix的断路器功能
- 继承SpringCloud的服务发现功能
- 请求限流功能
- 支持路径重写
Spring Cloud Gateway和Zuul的区别
三大核心概念
Route 路由
路由是构建网关的基本模块,由ID、目标URI、一系列的断言和过滤器组成,如果断言为true则匹配该 路由。
Predicate 断言
开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
Filter 过滤器
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由之前或之后进行修改
Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway at this time. Please remove spring-boot-starter-web dependency.
springcloud gateway的内部是通过netty+webflux实现的,webflux实现和springmvc配置依赖冲突。
Gateway路由配置
引入依赖:
<!--注意: 不需要spring web
否则webflux(gateway的技术支持)实现会和springmvc(spring web)配置依赖冲突。
-->
<!-- gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
配置路由转发之后
访问http://localhost:9527/payment/get/35会通过路由转发到http://localhost:8001/payment/get/35
动态路由
在application.yaml处,将uri: http://localhost:8001修改为uri: lb://cloud-payment-service。即lb://服务名
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #lb 表示负载均衡 匹配后提供服务的路由地址
predicates:
- Path=/provider/payment/get/** # 断言,路径相匹配的进行路由
- id: payment_routh2
uri: lb://cloud-payment-service
predicates:
- Path=/provider/payment/lb
自定义filter
定义filter类实现两个接口: Ordered和GlobalFilter
package com.johnny.springcloud.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Date;
/**
* @author Johnny Lin
* @date 2021/6/27 0:25
*/
@Component
@Slf4j
public class MyLogGatewayFilter implements Ordered, GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("************* com in MyLogGatewayFilter "+ new Date());
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if( uname == null){
log.info("*****用户名为null, 非法用户 o(╥﹏╥)o");
//设置响应状态码
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
//放行
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0; // 值越小 优先级越高
}
}
以上是关于SpringCloud学习—— 网关GateWay的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud——Gateway(服务网关的学习和使用)
SpringCloud——Gateway(服务网关的学习和使用)
SpringCloud——Gateway(服务网关的学习和使用)