赞
踩
Gateway官网 :https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
Neflix 不太靠谱,zuul2.0 一直延期,迟迟不发布。
Springcloud 中所集成的 Zuul 版本,采用的是 Tomcat 容器,使用的是传统的 Servlet lO 处理模型。
Servlet的生命周期
路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
参考的是java8的java.util.function.Predicate开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
Web 请求,通过一些匹配条件,定位到真正的服务节点,并在这个转发过程的前后,进行一些精简细化控制。
Predicate 就是匹配条件,Filter 可以理解为一个无所不能的拦截器,再加上 URI,就可以实现一个具体的路由了。
核心逻辑 :路由转发+执行过滤器链
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>xu-parent</artifactId> <groupId>com.xu</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-gateway-9527</artifactId> <dependencies> <!--新增gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>com.xu</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build> </project>
server: port: 9527 spring: application: name: @artifactId@ cloud: gateway: # 开启从注册中心动态创建路由的功能,利用微服务名进行路由 discovery: locator: enabled: true routes: # 路由 1 - id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名 # uri: http://localhost:8001 #匹配后提供服务的路由地址 uri: lb://cloud-payment-service # 动态路由,修改为服务名称 predicates: - Path=/provider/getPaymentById/** #断言,路径相匹配的进行路由 - After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] - Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] - Between=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] , 2020-03-08T10:59:34.102+08:00[Asia/Shanghai] - Cookie=username,zzyy # 表示名为 username 的 Cookie 的值必须符合后面的规则才可以 - Header=X-Request-Id, \d+ #请求头中要有X-Request-Id属性并且值为整数的正则表达式 - Host=**.demo.com - Method=GET - Query=username, \d+ #要有参数名称并且是正整数才能路由 # 路由 2 - id: payment_routh2 # uri: http://localhost:8001 #匹配后提供服务的路由地址 uri: lb://cloud-payment-service predicates: - Path=/provider/payment/lb/** #断言,路径相匹配的进行路由 eureka: instance: hostname: cloud-gateway-service client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:7001/eureka
@SpringBootApplication
@EnableEurekaClient
public class GatewayMain9527 {
public static void main(String[] args) {
SpringApplication.run(GatewayMain9527.class, args);
}
}
官网的代码示例:
下面来自己实现,需求:通过 9527 网关,连接百度新闻网
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("path_rote", r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();
return routes.build();
}
}
启动 Gateway 模块后,控制台会有这样一段输出
Route Predicate Factories 是什么?
1.After
- After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
2.Before
- Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
3.Between
4.Cookie
- Cookie=username,zzyy # 表示名为 username 的 Cookie 的值必须符合后面的规则才可以
使用 CURL 进行测试
加入curl返回中文乱码解决 :https://blog.csdn.net/leedee/article/details/82685636
5.Header
- Header=X-Request-Id, \d+ #请求头中要有X-Request-Id属性并且值为整数的正则表达式
6.Host
- Host=**.demo.com
7.Method
- Method=GET
8.Path
9.Query
- Query=username, \d+ #要有参数名称并且是正整数才能路由
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。
Spring Cloud Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂 类来产生。
1.生命周期
pre —— 在业务逻辑之前
post —— 在业务逻辑之后
2.种类
1.新建一个 filter 包
2.新建一个类 :MyLogGateWayFilter
@Slf4j @Component public 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(StringUtils.isEmpty(uname)){ log.info("*****用户名为Null 非法用户,(┬_┬)"); exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);//给人家一个回应 return exchange.getResponse().setComplete(); } return chain.filter(exchange); } /** 加载过滤器顺序,返回值越小,优先级越高 */ @Override public int getOrder() { return 0; } }
3.测试
启动项目
访问 :http://localhost:9527/provider/payment/lb?uname=z3
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。