网关 Gateway
Gateway是什么?
Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等
Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty
1.Gateway能干嘛?
反向代理、鉴权、流量控制、熔断、日志监控。。。
网关是微服务的入口
SpringCloud Gateway具有如下特性:
1.动态路由:能够匹配任何请求属性
2.可以对路由指定 Predicate(断言) 和 Filter(过滤器)
3.集成Hystrix断路器
4.集成SpringCloud服务发现
5.易于编写的Predicate和Filter
6.请求限流
7.支持路径重写
2.Gateway三大核心概念
Route 是构建网关的基本模块,由ID,目标URL,一系列的断言和过滤器组成
Predicate 开发人员可以匹配请求中的内容(如请求头或者参数),如果请求与断言相匹配则进行路由
Filter 指的是SpringCloud Gateway中的GatewayFilter实例,使用过滤器可以在请求被路由前或者之后对请求进行修改
3.Gateway工作流程
客户端向Gateway发送请求,然后再Gateway Handler Mapping中找到与请求匹配的路由,将其发送到Cateway Web Handler
Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回
过滤器可能会在发送代理请求之前或之后执行业务逻辑
Gateway网关搭建
1.pom引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
2.修改yml配置文件
cloud: gateway: routes: - id: payment_routh #路由的Id,没有固定规则但是要求唯一,建议配合服务名 #uri: http://localhost:8001 #匹配提供服务的路由地址 uri: lb://cloud-payment-service #匹配提供服务的路由地址 predicates: - Path=/payment/getPayment/** #断言,路径相匹配的进行路由 - id: payment_routh2 #路由的Id,没有固定规则但是要求唯一,建议配合服务名 uri: http://localhost:8001 #匹配提供服务的路由地址 predicates: - Path=/payment/lb/** #断言,路径相匹配的进行路由 discovery: locator: enabled: true #开启从注册中心动态获取路由的功能
3.主启动类
@SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient public class GatewayMain9527 { public static void main(String[] args) { SpringApplication.run(GatewayMain9527.class, args); } }
4.在配置类中配置网关
@Configuration public class GatewayConfig { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){ RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes(); RouteLocator route = routes.route("path_route", r -> r.path("/payment/getPayment/10").uri("http://localhost:8002")) .route("path_route", r -> r.path("/payment/getPayment/13").uri("http://localhost:8002")) .build(); return route; } }
5.Gateway的过滤器Filter
@Component @Slf4j public class MyLogGatewayFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("********gatewayFilter******"+ LocalTime.now()); String username = exchange.getRequest().getQueryParams().getFirst("username"); if (username == null) { log.error("******非法用户******"); exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); return exchange.getResponse().setComplete(); // 未通过返回 } return chain.filter(exchange); // 通过放行 } @Override public int getOrder() { return 0; } }
作者:[一柒微笑]