当前位置: 首页 > news >正文

【Spring Cloud】微服务

1.Spring Cloud概述

1.1.集群和分布式

集群: 将⼀个系统完整的部署到多个服务器上, 每个服务器都能提供系统的所有服务, 多个服务器通过负载均衡调度完成任务., 每个服务器称为集群的节点
分布式: 将⼀个系统拆分为多个子系统,多个子系统部署在多个服务器上,多个服务器上的子系统协同合作完成⼀个特定任务.

1.2.微服务简介

微服务, 就是一种经过良好架构设计的分布式架构方案, 其将系统拆分为更细粒度的服务,每个服务只负责一个单一功能,服务独立部署和运行,并通过轻量级协议(如REST或RPC)进行通信

1.3.Spring Cloud简介

Spring Cloud 是分布式微服务架构的一站式解决方案, 是微服务架构落地的多种技术的集

合, 通过整合多种开源技术,提供了一套工具集来简化微服务开发中的常见问题处理

如:

  • 分布式版本配置:管理不同环境下的配置
  • 服务注册和发现:自动注册和发现服务实例
  • 路由:智能路由请求到目标服务
  • 服务调用:简化服务间的通信
  • 负载均衡:分配请求负载,提高系统稳定性
  • 断路器:防止故障扩散,提升系统韧性
  • 分布式消息:处理异步消息传递

2.拆分原则

2.1.单⼀职责

⼀个微服务应该只负责⼀个功能或业务领域, 每个服务应该有清晰的定义和边界, 只

关注自己的特定业务领域.

2.2.服务自治

每个微服务都应该具备⾼度自治的能力, 每个服务要能做到独立开发, 独立测试, 独立构

建, 独立部署, 独立运行

2.3.单向依赖

微服务之间需要做到单向依赖, 严禁循环依赖, 双向依赖

循环依赖: A -> B -> C ->A

双向依赖: A -> B, B -> A

3.服务注册与服务发现

3.1.注册中心

注册中心可以维护⼀个服务列表, 哪个机器上线了, 哪个机器宕机了, 这些信息都会自动更新到服务列表上, 客户端拿到这个列表时可以直接进行服务调用

注册中主要有三种角色:

服务提供者:⼀次业务中, 被其它微服务调的服务. 也就是提供接给其它微服务.

服务消费者:⼀次业务中, 调用其它微服务的服务. 也就是调其它微服务提供的接.

服务注册中心: 用于保存Server 的注册信息, 当Server 节点发生变更时, Registry 会同步变更. 服务与注册中心使用⼀定机制通信, 如果注册中心与某服务长时间法通信, 就会注销该实例

他们之间的关系以及作内容, 可以通过两个概念来描述:

服务注册:服务提供者在启动时, 向 Registry 注册自身服务, 并向 Registry 定期发送心跳汇报存活状态.

服务发现:服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口, 从而提供给服务消费者⼀个可的服务列表

服务启动/变更时, 向注册中心报道. 注册中心记录应用和IP的关系.

调用方调用时, 先去注册中心获取服务方的IP, 再去服务方进行调用

3.2.CAP

CAP 理论是分布式系统设计中最基础, 也是最为关键的理论

⼀致性:CAP理论中的⼀致性, 指的是强⼀致性. 所有节点在同⼀时间具有相同的数据

可用性:保证每个请求都有响应(响应结果可能不对)

分区容错性:当出现网络分区后,系统仍然能够对外提供服务

CAP 理论指出:分布式系统中最多同时满足两个特性,由于网络分区不可避免,所以注册中心只有CA、CP两种架构:

CP架构:优先保证数据一致性(C),但可能牺牲可用性(A)。例如,在网络异常时,拒绝请求以维护数据一致
AP架构:优先保证可用性(A),但可能返回不一致的数据。例如,在网络异常时,返回缓存数据(即使旧版本也一样),确保服务不中断

4.负载均衡

负载均衡(Load Balance,简称 LB) , 是高并发, 高可用系统必不可少的关键组件

当服务流量增大时, 将请求流量合理分配到多个资源(如服务器实例)

⽐较有名的服务端负载均衡器是Nginx. 请求先到达Nginx负载均衡器, 然后通过负载均衡算法, 在多个服务器之间选择⼀个进行访问

4.1.Spring Cloud LoadBalancer

SpringCloud 使用Spring Cloud LoadBalancer 组件来实现客户端负载均衡
给 RestTemplate 这个Bean添加 @LoadBalanced 注解

@Configuration
public class BeanConfig {@LoadBalanced@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
修改IP端口号为服务名称
    public OrderInfo selectOrderById(Integer id) {OrderInfo orderInfo = orderMapper.selectOrderById(id);String url = "http://product-service/product/" + orderInfo.getProductId();  ProductInfo product = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(product);return orderInfo;}
启动多个product-service实例连续多次发起请求, 观察product-service的日志, 会发现请求被分配到这3个实例上了

4.1.2.负载均衡策略

负载均衡策略是⼀种思想, 无论是哪种负载均衡器, 它们的负载均衡策略都是相似的. Spring Cloud
LoadBalancer 仅支持两种负载均衡策略: 轮询策略随机策略
1. 轮询: 服务器轮流处理用户的请求. 这是⼀种实现最简单, 也最常用的策略.
2. 随机选择: 随机选择⼀个后端服务器来处理新的请求

4.1.3.自定义负载均衡策略

Spring Cloud LoadBalancer 默认负载均衡策略是 轮询策略, 实现是 RoundRobinLoadBalancer, 如果服务的消费者想采用随机的负载均衡策略, 也可以
1. 定义随机算法对象, 通过 @Bean 将其加载到 Spring 容器中
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;public class LoadBalancerConfig {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);System.out.println("==============" + name);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}
2. 使用 @LoadBalancerClient 或者 @LoadBalancerClients 注解
在 RestTemplate 配置类上方, 使用 @LoadBalancerClient 或 @LoadBalancerClients 注解, 可以对不 同的服务提供方配置不同的客户端负载均衡算法策略
@LoadBalancerClient 注解说明
1. name: 该负载均衡策略对哪个服务生效(服务提供方)
2. configuration : 该负载均衡策略 ⽤哪个负载均衡策略实现.
@LoadBalancerClient(name = "product-service", configuration = LoadBalancerConfig.class)
@Configuration
public class BeanConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

5.Nacos

Nacos是Spring Cloud Alibaba的组件, Spring Cloud Alibaba遵循Spring Cloud中定义的服务注册, 服务发现规范

5.1 引入依赖

在父工程的pom文件中的 <dependencyManagement> 中引入Spring Cloud Alibaba的依赖

<properties><spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope>
</dependency>

在子工程中引入 Nacos 和 Load Balance 依赖

// alibaba 依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
// Load Balance 依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

Nacos的对应服务中配置子工程 yml

spring:application:name: order-servicecloud:nacos:discovery:server-addr: 127.0.0.1:8848

配置服务器代码

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public OrderInfo selectOrderById(Integer id) {OrderInfo orderInfo = orderMapper.selectOrderById(id);System.out.println(orderInfo.getProductId());String url = "http://product-service/product/" + orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}

为restTemplate添加负载均衡注解 @LoadBalanced
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class BeanConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

启动两个服务, 观察Nacos的管理界面 发现两个服务都注册在Nacos上了

5.2.权重配置

操作步骤: 找到对应节点 ->编辑 -> 在弹出的窗⼝修改权重值

5.3 开启Nacos负载均衡策略

由于Spring Cloud LoadBalance组件自身有负载均衡配置⽅式, 所以不支持Nacos的权重属性配置.
我们需要开启Nacos的负载均衡策略, 让权重配置生效
# 开启Nacos的负载均衡策略
spring:cloud:loadbalancer:nacos:enabled: true

5.4.Nacos 健康检查

5.4.1.两种健康检查机制

Nacos作为注册中⼼, 需要感知服务的健康状态, 才能为服务调⽤⽅提供良好的服务.
Nacos 中提供了两种健康检查机制:
客户端主动上报机制:
客户端通过心跳上报方式告知服务端(nacos注册中心)健康状态, 默认心跳间隔5秒
nacos会在超过15秒未收到心跳后将实例设置为不健康状态, 超过30秒将实例删除
服务器端反向探测机制:
nacos主动探知客户端健康状态, 默认间隔为20秒.
健康检查失败后实例会被标记为不健康, 不会被立即删除.

5.4.2.Nacos服务实例类型

Nacos的服务实例(注册的节点)分为临时实例和非临时实例.
临时实例: 如果实例宕机超过⼀定时间, 会从服务列表剔除, 默认类型
临时实例: 如果实例宕机, 不会从服务列表剔除, 也可以叫永久实例
Nacos对临时实例,采取的是客户端主动上报机制, 对非临时实例, 采取的是服务器端反向探测机制.

5.5.Nacos环境隔离

企业开发中, ⼀个服务会分为开发环境, 测试环境和生产环境.
通常情况下, 这几个环境是不能互相通信的. Nacos提供了namespace(命名空间)来实现环境的隔离
不同的namaspace的服务不可见

切勿忘记, 也要在idea上修改此服务在nacos上的命名空间

spring:cloud:nacos:config:namespace: xxxxxx

5.6.Nacos配置中心

除了注册中心和负载均衡之外, Nacos还是⼀个配置中心, 具备配置管理的功能.
服务启动时, 从配置中心读取配置项的内容, 进行初始化.
配置项修改时, 通知微服务, 实现配置的更新加载

想要获取nacos上的配置, 就要引入Nacos Config依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency><!-- SpringCloud 2020.*之后版本需要引入bootstrap -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
微服务启动前, 需要先获取nacos中配置, 并与application.yml配置合并. 在微服务运行之前, Nacos
要求必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址, 或者使用bootstrap.yml

6.OpenFeign

OpenFeign 是⼀个声明式的 Web Service客户端. 它让微服务之间的调用变得更简单, 类似
controller 调用service, 只需要创建⼀个接口,然后添加注解即可使用OpenFeign.

6.1 Spring Cloud Feign

Spring Cloud Feign 是 Spring 对 Feign 的封装, 将 Feign 项⽬目集成到 Spring Cloud 生态系统中

引入依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
添加注解, 在服务的启动类添加注解 @EnableFeignClients , 开启OpenFeign的功能
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@EnableFeignClients
@SpringBootApplication
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}
编写OpenFeign的客户端 , 基于SpringMVC的注解来声明远程调用的信息
import com.bite.order.model.ProductInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@FeignClient(value = "product-service", path = "/product")
public interface ProductApi {@GetMapping("/{productId}")ProductInfo getProductById(@PathVariable("productId") Integer productId);
}
@FeignClient 注解作用在接口上, 参数说明:
name/value:
指定FeignClient的名称, 也就是微服务的名称, ⽤于服务发现, Feign底层会使用Spring Cloud LoadBalance进行负载均衡. 也可以使用 url 属性指定⼀个具体的url.
path:
定义当前FeignClient的统⼀前缀
远程调用
import org.springframework.beans.factory.annotation.Autowired;@Autowired
private ProductApi productApi;/*** Feign实现远程调用* @param orderId 订单ID* @return 包含商品信息的订单详情*/
public OrderInfo selectOrderById(Integer orderId) {OrderInfo orderInfo = orderMapper.selectOrderById(orderId);ProductInfo productInfo = productApi.getProductById(orderInfo.getProductId());orderInfo.setProductInfo(productInfo);return orderInfo;
}
使用Feign也可以实现远程调用.
Feign 简化了与HTTP服务交互的过程, 把REST客⼾端的定义转换为Java接口, 并通过注解式来声
明请求参数,请求方式等信息, 使远程调用更加方便和间接.

6.2.Feign 抽取

在企业开发中,将Feign接口抽取为一个独立模块是常见做法。这能提高代码重用性、解耦服务提

供方和消费者,并简化维护

编写API模块

通过打 Jar 包放在本地 Maven 仓库的方式来模拟服务器之间的调度

服务消费方使用 product-api 依赖,并且指定启动类扫描 ProducApi 接口

@EnableFeignClients(clients = {ProductApi.class})
@SpringBootApplication
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}
@RestController
@RequestMapping("/product")
public class ProductApiController {@Autowiredprivate ProductApi productApi;@RequestMapping("/{id}")ProductInfo getProductInfo(@RequestParam("id") Integer id) {return  productApi.gerProductById(id);}@RequestMapping("/o1")public String returnId (@RequestParam("id") Integer id){return productApi.returnId(id);}@RequestMapping("/o2")public String returnId2 (@RequestParam("name") String name,@RequestParam("id") Integer id){return productApi.getNameAndId(id,name);}@RequestMapping("/o3")public String returnId3 (ProductInfo productInfo){return productApi.returnInfo(productInfo);}@RequestMapping("/o4")public String returnId4 (@RequestBody ProductInfo productInfo){return productApi.returnInfoJson(productInfo);}}

服务提供方:

@RestController
@RequestMapping("/product")
public class ProductController {@Autowiredpublic ProductService productService;@RequestMapping("/{productId}")public ProductInfo getProductById(@PathVariable("productId") Integer productId) {return productService.selectProductById(productId);}@RequestMapping("/p1")public String getProductByName1(Integer id,String name) {return "product-server 接收到参数 id = " + id + " name = " + name;}@RequestMapping("/p2")public String getProductByName(Integer id,String name) {return "product-server 接收到参数 id = " + id + " name = " + name;}@RequestMapping("/p3")public String getInfo (ProductInfo productInfo) {return productInfo.toString();}@RequestMapping("/p4")public String getInfoJson (@RequestBody ProductInfo productInfo) {return productInfo.toString();}
}

流程: 

a)服务消费方 Controller 调用公共 productApi 接口

 b)公共 productApi 接口处理请求, Feign 在运行时自动生成代理实现,将接口方法调用转换为 HTTP 请求。基于服务注册与发现 ,请求会被路由到服务器提供方的对应端点。

c)服务提供方的方法执行, Controller 接受 HTTP 请求并执行具体业务逻辑。地址的发现通过 HTTP 响应返回给服务消费方  Feign 客户端,然后再传到消费方 Controller 获取数据

URL 拼接过程:公共接口 @FeignClient.path + 公共接口方法的 URL = 要调用的 Controller 方法的 URL (服务提提供方的实际路径)

7.统⼀服务入口-Gateway

在微服务架构中,服务注册、发现、负载均衡和远程调用等问题已通过Nacos、Spring Cloud LoadBalance和OpenFeign得到解决。然而,这些微服务接口直接对外暴露,带来了安全隐患和重复开发负担
针对以上问题, ⼀个常用的解决方案是使用API网关
API网关(简称网关)也是⼀个服务, 通常是后端服务的唯⼀入口. 它的定义类似设计模式中的Facade模式
(门面,模式, 也称外观模式). 它就类似整个微服务架构的门面, 所有的外部客户端访问, 都需要经过它来进 行调度和过滤.
网关核心功能:
权限控制: 作为微服务的入口, 对用户进行权限校验, 如果校验失败则进行拦截
动态路由: ⼀切请求先经过网关, 但网关不处理业务, 而是根据某种规则, 把请求转发到某个微服务
负载均衡: 当路由的目标服务有多个时, 还需要做负载均衡
限流: 请求流量过高时, 按照网关中配置微服务能够接受的流量进行放行, 避免服务压力过大

7.1.Spring Cloud Gateway

Spring Cloud Gateway 是Spring Cloud的⼀个全新的API网关项目, 基于Spring + SpringBoot等技术开发,旨在为微服务架构提供⼀种简单而有效的途径来转发请求

7.1.1.快速上手

创建网关项目

引入网关依赖
        <!--⽹关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--基于nacos实现服务发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
编写启动类,并创建application.yml⽂件, 添加Gateway的路由配置
server:port: 10030 # 网关端口spring:application:name: gateway # 服务名称cloud:nacos:discovery:server-addr: xxxxx # Nacos服务发现地址gateway:routes: # 网关路由配置- id: product-service # 路由ID,自定义,唯一即可uri: lb://product-service # 目标服务地址,lb表示负载均衡predicates: # 路由条件- Path=/product/**- id: order-service # 订单服务路由uri: lb://order-servicepredicates:- Path=/order/**
配置字段说明:
id : 自定义路由ID, 保持唯⼀
uri: 目标服务地址, ⽀持普通URI 及 lb://应用注册服务名称 . lb表示负载均衡, 使用lb:// 方
式表示从注册中心获取服务地址.
predicates: 路由条件, 根据匹配结果决定是否执行该请求路由, 上述代码中, 我们把符合Path规则的⼀切请求, 都代理到uri参数指定的地址

7.2.Gateway Filter Factories(网关过滤器工厂)

Predicate决定了请求由哪⼀个路由处理, 如果在请求处理前后需要加⼀些逻辑, 这就是Filter(过滤器)的作用范围了.
Filter分为两种类型: Pre类型和Post类型.
Pre类型过滤器: 路由处理之前执行(请求转发到后端服务之前执行), 在Pre 类型过滤器中可以做鉴权, 限流等.
Post类型过滤器: 请求执行完成后, 将结果返回给客户端之前执行

Spring Cloud Gateway 中内置了很多Filter, 用于拦截和链式处理web请求. 比如权限校验, 访问超时等
设定.
Spring Cloud Gateway从作用范围上, 把Filter可分为GatewayFilter 和 GlobalFilter.
GatewayFilter: 应用到单个路由或者⼀个分组的路由上.
GlobalFilter: 应用到所有的路由上, 也就是对所有的请求生效.


7.3 .GlobalFilter

GlobalFilter是Spring Cloud Gateway提供的一个接口,它允许开发者在所有路由请求上应用自定义逻辑。无论路由配置如何,GlobalFilter都会在请求处理链中被执行。

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
spring:cloud:gateway:metrics:enabled: true  # 开启Gateway的指标收集功能(如请求计数、延迟等)
management:endpoints:web:exposure:include: "*"  # 暴露所有管理端点(健康检查/指标/shutdown等)endpoint:health:show-details: always  # 始终显示健康检查的详细信息(包括组件状态)shutdown:enabled: true  # 启用应用关闭端点(可通过HTTP请求优雅停止服务)

7.3.1.过滤器执行顺序

在Spring Cloud Gateway中,当请求路由后,网关会将项目中的所有过滤器(包括GatewayFilter和GlobalFilter)合并到一个统一的过滤器链中,并按照特定的顺序执行。

 过滤器链的合并与排序

网关在运行时,会将当前项目中的GatewayFilter和GlobalFilter合并到一个集合中。
这个集合会按照每个过滤器的 order 值进行排序。order 是一个 int 类型的属性,默认值为0。
排序规则是:order 值越小,优先级越高,执行顺序越靠前。

当order值相同时的执行优先级

如果多个过滤器的 order 值相等,网关会按照以下固定优先级顺序执行:
defaultFilter:网关的默认过滤器(优先级最高)。
GatewayFilter:用户定义的路由级过滤器。
GlobalFilter:全局过滤器(优先级最低)

7.4.自定义过滤器

Spring Cloud Gateway提供了过滤器的扩展功能, 开发者可以根据实际业务来⾃定义过滤器, 同样⾃定 义过滤器也⽀持GatewayFilter 和 GlobalFilter两种

7.4.1.自定义GatewayFilter

自定义GatewayFilter, 需要去实现对应的接口 GatewayFilterFactory , Spring Boot 默认帮我们
实现的抽象类是 AbstractGatewayFilterFactory , 我们可以直接使用.
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;@Slf4j
@Service
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomGatewayFilterFactory.CustomConfig> implements Ordered {public CustomGatewayFilterFactory() {super(CustomConfig.class);}@Overridepublic GatewayFilter apply(CustomConfig config) {/*** Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)* ServerWebExchange: HTTP请求-响应交互的契约, 提供对HTTP请求和响应的访问, *                   服务器端请求属性, 请求实例,响应实例等, 类似Context角色* GatewayFilterChain: 过滤器链* Mono: Reactor核心类, 数据流发布者, Mono最多只触发一个事件, *       所以可以把Mono用于在异步任务完成时发出通知.* Mono.fromRunnable: 创建一个包含Runnable元素的数据流*/return ((exchange, chain) -> {log.info("[Pre] Filter Request, name:" + config.getName());return chain.filter(exchange).then(Mono.fromRunnable(() -> {log.info("[Post] Response Filter");}));});}@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE; // 配置优先级, order越大, 优先级越低}@Datapublic static class CustomConfig {private String name;}
}
代码说明:
1. 类名统⼀以GatewayFilterFactory结尾, 因为默认情况下, 过滤器的name会采⽤该定义类的前缀. 这
⾥的name=Custom(yml配置中使⽤)
2. apply⽅法中, 同时包含Pre和Post过滤, then⽅法中是请求执⾏结束之后处理的
3. CustomConfig 是⼀个配置类, 该类只有⼀个属性name, 和yml的配置对应
4. 该类需要交给Spring管理, 所以需要加 @Service 注解
5. getOrder表⽰该过滤器的优先级, 值越⼤, 优先级越低.

7.4.2.⾃定义GlobalFilter

GlobalFilter的实现⽐较简单, 它不需要额外的配置, 只需要实现GlobalFilter接⼝, ⾃动会过滤所有的
Filter
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Slf4j
@Service
public class CustomGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("[Pre] CustomGlobalFilter enter...");return chain.filter(exchange).then(Mono.fromRunnable(() -> {log.info("[Post] CustomGlobalFilter return...");}));}@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE; // 配置优先级, order越大, 优先级越低}
}


文章转载自:

http://yehzT0dc.kzrbd.cn
http://FHG7cZMd.kzrbd.cn
http://y19oI7s4.kzrbd.cn
http://0jmCUziY.kzrbd.cn
http://wsahjCZI.kzrbd.cn
http://HBkd1IX8.kzrbd.cn
http://z3Vq4gIx.kzrbd.cn
http://9OAFb5En.kzrbd.cn
http://YeXpuYtk.kzrbd.cn
http://vJF1ksv4.kzrbd.cn
http://bztm8Jck.kzrbd.cn
http://kRNhPKNq.kzrbd.cn
http://qe5peO9l.kzrbd.cn
http://iO1B6jiQ.kzrbd.cn
http://Hb8HwdmV.kzrbd.cn
http://KsezZQxG.kzrbd.cn
http://6JEFILVF.kzrbd.cn
http://2RUk6sy0.kzrbd.cn
http://Tkyo7Fe9.kzrbd.cn
http://LcjDJrUO.kzrbd.cn
http://e5BI8ymx.kzrbd.cn
http://eC67k7ol.kzrbd.cn
http://tvYmbPJX.kzrbd.cn
http://5Qw7Qs0h.kzrbd.cn
http://VEyugqtO.kzrbd.cn
http://12xXcC2A.kzrbd.cn
http://lsdZ884P.kzrbd.cn
http://RYgmGwGS.kzrbd.cn
http://rKN8Xsf3.kzrbd.cn
http://96t8OP0z.kzrbd.cn
http://www.dtcms.com/a/386230.html

相关文章:

  • 设计模式(Java实现)----建造者模式
  • C++设计模式_创建型模式_建造者模式Builder
  • Dell PowerEdge R620 服务器内存和硬盘罢工了
  • 儿童无屏幕对讲机 Bunny 融资百万美元;腾讯会议推出 AI 托管:先行听会、代听多会、全程记录丨日报
  • linux系统命令学习
  • Java 大视界 -- 基于 Java 的大数据可视化在企业供应链风险管理与应急响应中的应用(412)
  • 【C++游记】Map与Set的封装
  • Infoseek舆情监测系统:AI驱动的一站式舆情管理解决方案
  • IDEA 连接MySQL数据库
  • Electron的IPC通讯 send/on 和 invoke/handle 的区别
  • 扩展开发:创建 Electron 插件
  • windows下ffmpeg的编译安装(支持硬件加速)--2025最新
  • JAVA后端面试笔记(二)
  • 每日前端宝藏库 | fullPage.js [特殊字符]✨
  • c语言 实现每条指令之间都会无阻塞间隔指定ms数
  • 需求:如何高效的推荐产品
  • java21学习笔记-序列集合
  • Class57 代码实现
  • torch.gather
  • 自学嵌入式第四十二天:单片机-定时器和UART串口
  • 大数据毕业设计选题推荐-基于大数据的旅游网站用户行为数据分析系统-Hadoop-Spark-数据可视化-BigData
  • 深入浅出数据结构:队列(Queue)—— 生活中的排队艺术
  • spring通过Spring Integration实现udp通信
  • Linux内存管理章节十八:内核开发者的武器库:内存分配API实战指南
  • CAD如何输出PDF多页文件
  • 我对 WPF 动摇时的选择:.NET Framework 4.6.2+WPF+Islands+UWP+CompostionApi
  • 1.整流-滤波电路的缺点和PFC的引入
  • QT 项目 线程信号切换 举例
  • 构网型5MW中压储能变流升压一体机技术方案
  • 【数据工程】8. SQL 入门教程