zuul核心人员走了两个,zuul2的研发太久,spring公司等不及,本身研发的Gateway网关。html
Cloud全家桶有个狠重要的组件就是网关,在1.x版本中都是采用Zuul网关;可是在2.x版本中,zuul的升级一致跳票,SpringCloud最后本身研发了一个网关替代Zuul, 那就是SpringCloud Gatewayjava
sadareact
Gateway是在Spring生态之上构建的API网关服务,基于Spring 5,Spring Boot 2和Project Reactor 等技术。web
Gateway旨在提供一种简单而有效 等方式来对API 进行路由,以及提供一些强大对过滤器,例如:熔断、限流、重试等正则表达式
Gateway 做为SpringCloud 等目标提供统一等路由方式且基于Filter 链的方式提供了网关基本的功能,例如:安全,监控。限流spring
SpringCloud Gateway 使用的Webflux中的 reactor-netty 响应式的编程,底层使用了Netty通信框架编程

<dependencies> <!--gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!-- 引用本身定义的api通用包,可使用Payment支付Entity --> <dependency> <groupId>com.angenin.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <!--eureka client(经过微服务名实现动态路由)--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency></dependencies>
server: port: 9527
spring: application: name: cloud-gateway cloud: gateway: routes: - id: payment_route # 路由的id,没有规定规则但要求惟一,建议配合服务名 uri: http://localhost:8001 predicates: - Path=/payment/get/** # 断言,路径相匹配的进行路由 - id: payment_route2 uri: http://localhost:8001 predicates: Path=/payment/lb/** #断言,路径相匹配的进行路由
eureka: instance: hostname: cloud-gateway-service client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://eureka7001.com:7001/eureka/
@SpringBootApplication@EnableEurekaClientpublic class GatewayMain9527 { public static void main(String[] args) { SpringApplication.run(GatewayMain9527.class, args); }}
经过咱们 9527 网关访问 8001的接口
这里起到了做用
在配置文件中配置 在配置文件yml中配置
在配置类中配置 代码中注入RouteLocator的Bean
新建config.GatewayConfig
package com.yxl.cloud.config;
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;
@Configurationpublic class GatewayConfig {
@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){ RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("path_route_angenin", //id r -> r.path("/guonei") //访问 http://localhost:9527/guonei .uri("http://news.baidu.com/guonei")); //就会转发到 http://news.baidu.com/guonei routes.route("path_route_angenin2", //id r -> r.path("/guoji") //访问 http://localhost:9527/guoji .uri("http://news.baidu.com/guoji")); //就会转发到 http://news.baidu.com/guonji
return routes.build();
}}
访问:http://localhost:9527/guonei
server: port: 9527
spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true #开启从注册中心动态建立路由的功能,利用微服务名称进行路由(默认false) routes: - id: payment_route #路由的id,没有规定规则但要求惟一,建议配合服务名 # uri: http://localhost:8001 #匹配后提供服务的路由地址 uri: lb://cloud-provider-hystrix-payment predicates: - Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 # uri: http://localhost:8001 uri: lb://cloud-provider-hystrix-payment predicates: - Path=/payment/lb/** #断言,路径相匹配的进行路由
eureka: instance: hostname: cloud-gateway-service client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://eureka7001.com:7001/eureka/
官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-request-predicates-factories
SpringCloud Gateway 将路由匹配做为Spring WebFlux HandlerMapping 基础架构的一部分。
SpringCloud Gateway 包括许多内置的Route Predicate工厂。全部这些Predicate 都与HTTP请求的不一样属性匹配。多个Route Predicate工厂能够进行组合
SpringCloud Gateway 建立Route 对象时,使用RoutePredicateFactory 建立 Predicate,Predicate 对象能够赋值给Route。Springcloud Gateway 包含许多内置的 Route Predicate Factories.
全部这些动词 都匹配HTTP请求的不一样属性,多种谓词工厂能够组合,经过逻辑and
在这里插入图片描述
public class T2 {
public static void main(String[] args) { //获取当前时间串 ZonedDateTime now = ZonedDateTime.now(); System.out.println(now); //2020-06-17T11:53:40.325+08:00[Asia/Shanghai] }
}
#指定时间前才能访问(Before) - Before=2020-06-17T11:53:40.325+08:00[Asia/Shanghai] #指定时间内才能访问(Between) - Between=2020-06-17T11:53:40.325+08:00[Asia/Shanghai],2020-06-17T12:53:40.325+08:00[Asia/Shanghai]
在这里插入图片描述
yml 设置 cookie
- Cookie=username,angenin #带Cookie,而且username的值为angenin
不带cookie 直接访问失败
在这里插入图片描述
# - After=2020-06-17T12:53:40.325+08:00[Asia/Shanghai]# - Cookie=username,angenin #带Cookie,username的值为angenin - Header=X-Request-Id, \d+ #请求头要有 X-Request-Id属性而且值为整数的正则表达式
在这里插入图片描述
- Method=GET #只容许get请求访问
在这里插入图片描述
在这里插入图片描述
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。
SpringCloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生
GatewayFilter(31种) Global Filter(10种)
arameter为表明。
package com.yxl.cloud.config;
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@Slf4jpublic class MyLogGateWayFilter implements GlobalFilter, Ordered { @Override public Mono<Void> 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,非法用户!!"); //设置响应,不被接受 exchange.getResponse().setStatusCode(HttpStatus.NO_CONTENT); return exchange.getResponse().setComplete();
} //返回chain.filter(exchange),放行 return chain.filter(exchange); }
@Override public int getOrder() { return 0; }}
http://localhost:9527/payment/lb?xxx=111