网关在微服务中的位置
文章图片
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的服务发现功能
- 请求限流功能
- 支持路径重写
文章图片
三大核心概念 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路由配置 引入依赖:
org.springframework.cloud
spring-cloud-starter-gateway
文章图片
配置路由转发之后
访问http://localhost:9527/payment/get/35会通过路由转发到http://localhost:8001/payment/get/35
动态路由 【微服务学习|SpringCloud学习(六)—— 网关GateWay】
文章图片
在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 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;
// 值越小 优先级越高
}
}
推荐阅读
- spring|SpringCloud——Gateway(服务网关的学习和使用)
- springCloud|SpringCloud——GateWay网关(详解+案例)
- SpringCloud|SpringCloud——Http客户端Feign
- SpringCloud|SpringCloud——负载均衡Ribbon
- SpringCloud|SpringCloud——注册中心nacos
- Java|基于SpringCloud Alibaba的微服务项目基础骨架
- 后端面试必备|微服务实战系列之SpringCloud Alibaba学习(一)
- SpringCloud|SpringCloud (三) ——Nacos注册中心
- spring|Spring Cloud Alibaba之Nacos-服务消费者(Feign)