【SpringCloud】【Hoxton】Gateway全面解析

Oriole ·
更新时间:2024-11-14
· 565 次阅读

01 基础环境准备
02 一文读懂Eureka
03 Zookeeper注册中心
04 Consule注册中心
05 Ribbon
06 OpenFegin
07 Hystrix全面解析
08 Gateway全面解析
09 Config配置中心
10 Bus消息总线

1 GateWay简介

Spring Cloud Gateway是 Spring Cloud的个全新项目,基于 Spring5.0+ Spring Boot2.0和 Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。
Spring Cloud Gateway作为 Spring Cloud生态系统中的网关,目标是替代Zuul,在 Spring Cloud2.0以上版本中,没有对新版本的Zuul2.0以上最新高性能版本进行集成,仍然还是使用的Zu1x非 Reactor模式的老版本。而为了提升网关的性能, Spring Cloud Gateway是基于 Webfluxi框架实现的,而 Nebflux框架底层则使用了高性能的 Reactor模式通信框架Netty。Spring Cloud Gatewayf的目标提供统一的路由方式目基于 Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

2 三大核心概念

路由:路由是网关最基础的部分,路由信息有一个ID、一个目的URL、一组断言和一组Filter组成。如果断言路由为真,则说明请求的URL和配置匹配。
断言:Java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于http request中的任何信息,比如请求头和参数等。
过滤器:一个标准的Spring webFilter。Spring cloud gateway中的filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。
在这里插入图片描述

3 新建工程

在这里插入图片描述
(1) pom

org.springframework.cloud spring-cloud-starter-gateway org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.projectlombok lombok org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok junit junit org.apache.commons commons-lang3 org.springframework.boot spring-boot-starter-test com.zrs.springcloud commons 1.0-SNAPSHOT

(2) application.yml

server: port: 9002 spring: application: name: gateway-cloud cloud: gateway: routes: #id:实例唯一ID;uri:真实服务地址;predicates:断言匹配; - id: provider-route uri: http://localhost:9000 predicates: - Path=/ribbon/** eureka: instance: #服务名称 hostname: gateway-cloud client: serviceUrl: #eureka注册中心地址 defaultZone: http://localhost:7000/eureka/ #配置URL #是否将自己注册到EurekaServer register-with-eureka: true #是否从EurekaServer获取已有的注册服务 fetch-registry: true

(3) 启动类

@SpringBootApplication @EnableEurekaClient public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class); } }

(4) 启动 Eureka、payment、paymentSlave、gateway
在这里插入图片描述

在这里插入图片描述
(5) 测试
在这里插入图片描述

4 路由编码实现

创建GatewayConfig配置文件,实现访问跳转腾讯Nba

@Configuration public class GatewayConfig { @Bean public RouteLocator customerRouteLocator(RouteLocatorBuilder builder){ RouteLocatorBuilder.Builder routes = builder.routes(); routes.route("nba",r->r.path("/nba").uri("https://sports.qq.com/nba/")).build(); return routes.build(); } }

在这里插入图片描述
在这里插入图片描述

5 动态路由 5.1 修改网关的application.yml server: port: 9002 spring: application: name: gateway-cloud cloud: #从注册中心动态创建路由 gateway: discovery: locator: enabled: true routes: #id:实例唯一ID;uri:真实服务地址;predicates:断言匹配; - id: provider-route uri: lb://PROVIDER-PAYMENT-SERVICE predicates: - Path=/ribbon/** eureka: instance: #服务名称 hostname: gateway-cloud client: serviceUrl: #eureka注册中心地址 defaultZone: http://localhost:7000/eureka/ #配置URL #是否将自己注册到EurekaServer register-with-eureka: true #是否从EurekaServer获取已有的注册服务 fetch-registry: true 5.2 启动provider-slave、gateway服务

在这里插入图片描述
在这里插入图片描述

5.3 测试

在这里插入图片描述

在这里插入图片描述

6 predicates配置 6.1 时间

(1) 配置解析

-After : 之后访问 例:- After=2017-01-20T17:42:47.789-07:00[America/Denver] -Before: 之前访问 例:- Before=2017-01-20T17:42:47.789-07:00[America/Denver] -Between: 之间访问 例:- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

(2) 编写中文获取时间测试类

public class TimeTest { public static void main(String[] args) { ZonedDateTime now = ZonedDateTime.now(); System.out.println(now); } }

在这里插入图片描述
(3) 测试Before
修改application.yml配置文件

predicates: - Path=/ribbon/** - Before=2020-03-15T14:06:31.701+08:00[Asia/Shanghai] 6.2 Cookie

(1) 配置,此规则会根据Cookie name的值和正则表达式去匹配,匹配上执行路由,匹配不上不执行。
在这里插入图片描述
(2) 修改application.yml

predicates: - Path=/ribbon/** - Cookie=username,zrs

(3) 测试

curl http://localhost:9002/ribbon/server --cookie "username=zrs" curl http://localhost:9002/ribbon/server

在这里插入图片描述

6.3 Header

(1) 如果请求有一个名为X-request-Id的头,并且该头的值与\d+正则表达式匹配
在这里插入图片描述
(2) 修改application.yml

predicates: - Path=/ribbon/** - Header=X-Request-Id, \d+

(3) 测试

curl http://localhost:9002/ribbon/server -H "X-Request-Id:1234" curl http://localhost:9002/ribbon/server

在这里插入图片描述

7 过滤器

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滅器只能指定路由进行使用。Spring Cloud Gateway内置了多种路由过滤器,他们都由 Gateway Filterf的工厂类来产生。

7.1 创建配置文件 @Component public class GatewayFilterConfig implements GlobalFilter, Ordered { @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { String username = exchange.getRequest().getQueryParams().getFirst("username"); if (StringUtils.isBlank(username)){ exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } @Override public int getOrder() { return 0; } } 7.2 重启测试

在这里插入图片描述
在这里插入图片描述

GITHUB #分支Gateway-enviroment-release-v1.0 https://github.com/zhurongsheng666/spring-cloud-hoxton
作者:篮战丶



gateway

需要 登录 后方可回复, 如果你还没有账号请 注册新账号