Spring Cloud Gateway夺命连环10问?

这篇文章介绍下微服务中的一个重要角色:网关,对于网关如何选择,由于阿里系暂时未出网关,当然是选择了Spring cloud Gateway,毕竟是亲儿子。

文章目录如下:

Spring Cloud Gateway夺命连环10问?

为什么需要网关?

传统的单体架构中只有一个服务开放给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,那么作为客户端如何去调用这些微服务呢?如果没有网关的存在,只能在本地记录每个微服务的调用地址。

Spring Cloud Gateway夺命连环10问?

无网关的微服务架构往往存在以下问题:

  • 客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性。
  • 认证复杂,每个服务都需要独立认证。
  • 存在跨域请求,在一定场景下处理相对复杂。

网关的基本功能?

网关是所有微服务的门户,路由转发仅仅是最基本的功能,除此之外还有其他的一些功能,比如:认证鉴权熔断限流日志监控等等.........

Spring Cloud Gateway夺命连环10问?

以上这些应用场景会在后续的文章详细介绍,不是今天的重点。

为什么选择Spring cloud Gateway?

在1.x版本中都是采用的Zuul网关;但在2.x版本中,zuul的升级一直跳票,Spring Cloud最后自己研发了一个网关替代Zuul,那就是Spring Cloud Gateway。

肯定选择亲儿子Spring Cloud Gateway,它的很多思想都是借鉴zuul,所谓青出于蓝而胜于蓝,功能和性能肯定是优于zuul,不然Spring Cloud 为嘛要发布它?

重要的一点原因:

Spring Cloud Gateway 基于Spring Boot 2.x、Spring WebFlux和[Project Reactor构建。

对于Spring Boot 的整合方便兼容性以及性能方面不必担心。

Spring Cloud Gateway几个必知的术语?

  1. 路由(route):gateway的基本构建模块。它由ID、目标URI、断言集合和过滤器集合组成。如果聚合断言结果为真,则匹配到该路由。
  2. 断言(Predicate ):参照Java8的新特性Predicate,允许开发人员匹配HTTP请求中的任何内容,比如头或参数。
  3. 过滤器(filter):可以在返回请求之前或之后修改请求和响应的内容。

网关如何搭建?

Spring Cloud Gateway夺命连环10问?

为什么要放这张图?

一定要按照上图中的版本进行适配,否则会出现意想不到的BUG,陈某遇到过,都是泪............

新建cloud-gateway9023,添加如下依赖:

<!--gateway-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

注意:一定要去掉spring-boot-starter-web依赖,否则启动报错

Spring Cloud Gateway夺命连环10问?

好了,项目搭建完成,其实就添加这么一个依赖,关于详细的配置下文介绍。

什么是Predict(断言)?

Predicate来自于java8的接口。Predicate接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)。

可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。

Spring Cloud Gateway内置了许多Predict,这些Predict的源码在
org.springframework.cloud.gateway.handler.predicate包中,有兴趣可以阅读一下。内置的一些断言如下图:

Spring Cloud Gateway夺命连环10问?

以上11种断言陈某这里就不再介绍如何配置了,官方文档写的很清楚。

官方文档:
https://docs.spring.io/spring-cloud-gateway/docs/2.2.9.RELEASE/reference/html/

下面就以最后一种权重断言为例介绍一下如何配置。配置如下:

spring:
  cloud:
    gateway:
      ## 路由
      routes:
        ## id只要唯一即可,名称任意
   
Spring Cloud Gateway中配置全局异常处理,你可以通过以下几个步骤: 1. **启用全局拦截器(Global Filter)**: 首先,你需要在`application.yml`或`application.properties`文件中添加`spring.cloud.gateway.filter-order`属性,将全局拦截器设置为一个较低的顺序,以便它在其他filter之前运行。例如: ``` spring: cloud: gateway: filter-orders: global-filters: -999 ``` 2. **创建全局拦截器**: 创建一个实现了`GlobalFilter`接口的自定义类。`GlobalFilter`允许你在每个HTTP请求处理之前或之后执行操作。例如: ```java @Component public class GlobalExceptionHandler implements GlobalFilter { // 实现onWrite(请求发出前)、onExchangeSend(请求发出后)、onError(请求处理过程中出错)等方法 @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { return chain.filter(exchange).doOnNext(response -> { if (response.getStatusCode().is5xxServerError()) { handleException(response); } }); } private void handleException(ResponseMono<?> response) { // 处理异常逻辑,比如记录日志、返回统一的错误页面等 } } ``` 3. **注册全局拦截器**: 最后,使用`@EnableGlobalMethodSecurity`注解开启全局方法安全,同时在`GlobalExceptionHandler`上加上`@Order(Ordered.HIGHEST_PRECEDENCE)`,确保它优先执行: ```java @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) public class GlobalSecurityConfig {} ``` 这样就配置了一个全局异常处理器,可以对所有经过Spring Cloud Gateway的HTTP请求进行统一的异常处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值