刷leetcode对网站开发有用吗,做网站后期为什么续费,智慧团建登录官网,网站建设与设计摘要文章目录 概述阻塞式处理模型和非阻塞处理模型概念阻塞式处理模型 三大核心概念 工作流程使用POMYML启动类配置路由通过编码进行配置动态路由常用的Route Predicate自定义全局过滤器自定义filter 官网 https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1… 文章目录 概述阻塞式处理模型和非阻塞处理模型概念阻塞式处理模型 三大核心概念 工作流程使用POMYML启动类配置路由通过编码进行配置动态路由常用的Route Predicate自定义全局过滤器自定义filter 官网 https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 概述
Gateway是在Spring生态系统之上构建的API网关服务基于Spring 5Spring Boot 2和 Project Reactor等技术。Gateway旨在提供一种简单而有效的方式来对API进行路由以及提供一些强大的过滤器功能 例如熔断、限流、重试等
阻塞式处理模型和非阻塞处理模型概念
阻塞式处理模型
缺点 servlet是一个简单的网络IO模型当请求进入servlet container时servlet container就会为其绑定一个线程在并发不高的场景下这种模型是适用的。但是一旦高并发(比如抽风用jemeter压)线程数量就会上涨而线程资源代价是昂贵的上线文切换内存消耗大严重影响请求的处理时间。在一些简单业务场景下不希望为每个request分配一个线程只需要1个或几个线程就能应对极大并发的请求这种业务场景下servlet模型没有优势 在Servlet3.1之后有了异步非阻塞的支持。而WebFlux是一个典型非阻塞异步的框架它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说它可以运行在诸如NettyUndertow及支持Servlet3.1的容器上。非阻塞式函数式编程Spring5必须让你使用java8 Spring WebFlux 是 Spring 5.0 引入的新的响应式框架区别于 Spring MVC它不需要依赖Servlet API它是完全异步非阻塞的并且基于 Reactor 来实现响应式流规范。 三大核心概念
Route(路由)Predicate(断言)Filter(过滤)
工作流程 核心路由转发执行过滤器链 客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由将其发送到 Gateway Web Handler。 Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前“pre”或之后“post”执行业务逻辑。 Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等在“post”类型的过滤器中可以做响应内容、响应头的修改日志的输出流量监控等有着非常重要的作用。
使用
POM
dependencies!--gateway--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependency!--eureka-client--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependency!-- 引入自己定义的api通用包可以使用Payment支付Entity --dependencygroupIdcom.atguigu.springcloud/groupIdartifactIdcloud-api-commons/artifactIdversion${project.version}/version/dependency!--一般基础配置类--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency
/dependencies!--不需要这两个--
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId
/dependencyYML
server:port: 9527spring:application:name: cloud-gatewayeureka:instance:hostname: cloud-gateway-serviceclient: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka启动类
SpringBootApplication
EnableEurekaClient配置路由
server:port: 9527spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true #开启从注册中心动态创建路由的功能利用微服务名进行路由routes:- id: payment_routh #payment_route #路由的ID没有固定规则但要求唯一建议配合服务名uri: http://localhost:8001 #匹配后提供服务的路由地址predicates:- Path/payment/get/** # 断言路径相匹配的进行路由- id: payment_routh2 #payment_route #路由的ID没有固定规则但要求唯一建议配合服务名uri: http://localhost:8001 #匹配后提供服务的路由地址predicates:- Path/payment/lb/** # 断言路径相匹配的进行路由#- After2020-02-21T15:51:37.48508:00[Asia/Shanghai]#- Cookieusername,zzyy#- HeaderX-Request-Id, \d # 请求头要有X-Request-Id属性并且值为整数的正则表达式eureka:instance:hostname: cloud-gateway-serviceclient: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka通过编码进行配置
Configuration
public class GateWayConfig
{Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){RouteLocatorBuilder.Builder routes routeLocatorBuilder.routes();routes.route(path_route_atguigu,r - r.path(/guonei).uri(http://news.baidu.com/guonei)).build();return routes.build();}
}动态路由
server:port: 9527spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true #开启从注册中心动态创建路由的功能利用微服务名进行路由routes:- id: payment_routh #payment_route #路由的ID没有固定规则但要求唯一建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path/payment/get/** # 断言路径相匹配的进行路由- id: payment_routh2 #payment_route #路由的ID没有固定规则但要求唯一建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path/payment/lb/** # 断言路径相匹配的进行路由#- After2020-02-21T15:51:37.48508:00[Asia/Shanghai]#- Cookieusername,zzyy#- HeaderX-Request-Id, \d # 请求头要有X-Request-Id属性并且值为整数的正则表达式eureka:instance:hostname: cloud-gateway-serviceclient: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka常用的Route Predicate
After Route Predicate
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class ZonedDateTimeDemo
{public static void main(String[] args){ZonedDateTime zbj ZonedDateTime.now(); // 默认时区System.out.println(zbj);
// ZonedDateTime zny ZonedDateTime.now(ZoneId.of(America/New_York)); // 用指定时区获取当前时间
// System.out.println(zny);}
}Before Route PredicateBetween Route PredicateCookie Route Predicate Cookie Route Predicate需要两个参数一个是 Cookie name ,一个是正则表达式。 路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配如果匹配上就会执行路由如果没有匹配上则不执行 测试
curl http://localhost:9527/payment/lb --cookie usernamexiaoliHeader Route Predicate 两个参数一个是属性名称和一个正则表达式这个属性值和正则表达式匹配则执行。Host Route Predicate Host Route Predicate 接收一组参数一组匹配的域名列表这个模板是一个 ant 分隔的模板用.号作为分隔符。 它通过参数中的主机地址作为匹配规则。Method Route Predicate Path Route Predicate Query Route Predicate 支持传入两个参数一个是属性名一个为属性值属性值可以是正则表达式。
自定义全局过滤器
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Configuration
public class GateWayConfig
{Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){RouteLocatorBuilder.Builder routes routeLocatorBuilder.routes();routes.route(path_route_atguigu,r - r.path(/guonei).uri(http://news.baidu.com/guonei)).build();return routes.build();}
}自定义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.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Date;
Component
Slf4j
public class MyLogGateWayFilter implements GlobalFilter,Ordered
{Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain){log.info(***********come 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);}Overridepublic int getOrder(){return 0;}
}