1、SpringCloudGateWay是什么
该项目提供了一个在Spring生态系统之上构建的API网关,包括:Spring 5,Spring Boot 2和Project Reactor。 Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API,并为它们提供跨领域的关注点,例如:安全性,监视/指标和限流。
SpringCloudGataway是基于WebFlux框架实现的,而WebFlux框架底层采用了非阻塞响应式高性能的Reactor模式通信框架Netty。
1.1 特征
- 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.x
- 动态路由
- Predicates 和 Filters 作用于特定路由
- 集成 Hystrix 断路器
- 集成 Spring Cloud DiscoveryClient
- 易于编写的 Predicates 和 Filters
- 限流
- 路径重写
1.2 核心概念
- Route(路由): 网关的基本构建块。 它由ID,目标URI,一系列的断言和过滤器集合定义。 如果断言为true,则匹配路由。
-
Predicate(断言): 这一个 Java 8 Function Predicate。输入类型是Spring Framework
ServerWebExchange
。我们可以使用它来匹配HTTP的任何请求,包括headers或者parameters。 -
Filter(过滤): 这些是使用特定工厂构造的Spring Framework
GatewayFilter
实例。 在这里,可以在发送下游请求之前或之后修改请求和响应。
Web请求,就是通过一些匹配条件,定位到真正服务的节点。并在转发过程的前后,做一些精细化的控制。
Predicate就是匹配条件,而Filter可以理解为一些无所不能的拦截器,再加一个url,构成一个完整的路由。
2、微服务架构网关在哪里
-
工作流程
客户端向Spring Cloud Gateway发出请求。 如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。Handler再通过指定的过滤器来将请求发送到我们实际服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能再代理请求之前或之后执行业务逻辑。Filter在
pre
类型的过滤器可以做参数校验、权限校验、流量监控和日志输出等;在post
类型的过滤器可以做响应内容、响应头的修改等。
3、入门配置
网关路由有两种配置方式:
1)通过application.yml配置文件
server:
port: 9200
spring:
application:
name: Cloud-Gateway
cloud:
gateway:
routes:
-id: test_route #路由ID要求唯一
url: http://localhost:8080 #匹配后转发至提供服务的路由地址
predicates:
-Path:/user/get/** #断言,路径相匹配的进行路由
-id: test_route2
url: http://localhost:8080
predicates:
-Path:/order/get/**
eureka:
instance:
hostname: cloud-gateway-service
lease-expiration-duration-in-seconds: 30
lease-renewal-interval-in-seconds: 10
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
解释:客户端请求http://localhost:9200/user/get/**
,经网关微服务转发至http://localhost:8080/user/get/**
去处理
2)代码中注入@Bean自定义 RouteLocator,
配置该Bean有两种方式:1)在启动类中添加;2)自定义配置@Configuration
@Configuration
public class CloudGateWayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
RouteLocatorBuilder.builder routes = routeLocatorBuilder.routes();
routes.route("test_route", r -> r.path("/news").url("http://baidu.com/news")).builder();
return routes.build();
}
}
解释:客户端请求http://localhost:9200/news
,经网关微服务转发至http://baidu.com/news
去处理