微服务学习|SpringCloud学习(六)—— 网关GateWay

网关在微服务中的位置 微服务学习|SpringCloud学习(六)—— 网关GateWay
文章图片

Zuul1.x模型 Spring Cloud所集成的zuul版本,采用的是Tomcat容器,使用的是传统的Servlet IO处理模型
微服务学习|SpringCloud学习(六)—— 网关GateWay
文章图片

微服务学习|SpringCloud学习(六)—— 网关GateWay
文章图片

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 是基于异步非阻塞模型,性能方面表现较好。

  1. 动态路由:能够匹配任何请求的属性
  2. 可以对路由指定断言(predicate)和过滤器(Filter)
  3. 继承Hystrix的断路器功能
  4. 继承SpringCloud的服务发现功能
  5. 请求限流功能
  6. 支持路径重写
Spring Cloud Gateway和Zuul的区别 微服务学习|SpringCloud学习(六)—— 网关GateWay
文章图片

三大核心概念 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

微服务学习|SpringCloud学习(六)—— 网关GateWay
文章图片

配置路由转发之后
访问http://localhost:9527/payment/get/35会通过路由转发到http://localhost:8001/payment/get/35
动态路由 【微服务学习|SpringCloud学习(六)—— 网关GateWay】微服务学习|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

微服务学习|SpringCloud学习(六)—— 网关GateWay
文章图片

微服务学习|SpringCloud学习(六)—— 网关GateWay
文章图片

自定义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; // 值越小 优先级越高 } }

    推荐阅读