Resilience4j:Java容错库的全面介绍与核心概念解析

Resilience4j:Java容错库的全面介绍与核心概念解析

【免费下载链接】resilience4j Resilience4j is a fault tolerance library designed for Java8 and functional programming 【免费下载链接】resilience4j 项目地址: https://gitcode.com/gh_mirrors/re/resilience4j

Resilience4j是一个专为Java 8及函数式编程设计的现代化轻量级容错库,诞生于微服务架构快速发展的时代背景下。本文全面介绍了Resilience4j的项目背景、设计理念、核心容错模式、函数式编程应用以及模块化架构设计。文章深入解析了断路器、重试、限流和隔离四大核心模式的工作原理和配置方式,探讨了装饰器模式与函数式编程的完美结合,并详细阐述了项目的模块化架构设计思想。通过本文,读者将全面了解Resilience4j如何为分布式系统提供强大的容错能力和稳定性保障。

Resilience4j项目背景与设计理念

Resilience4j诞生于微服务架构蓬勃发展的时代背景下,随着分布式系统复杂性的不断增加,系统容错能力成为了保障服务可靠性的关键因素。在Netflix Hystrix宣布进入维护模式后,Java生态系统中亟需一个现代化、轻量级且功能强大的容错库来填补这一空白。

项目起源与时代背景

Resilience4j由Robert Winkler和Bohdan Storozhuk等开发者创建,旨在为Java 8及函数式编程范式提供一个专门设计的容错解决方案。该项目诞生于2017年,正值微服务架构和云原生应用快速普及的时期。传统的单体应用正在被拆分为多个独立的服务,这种架构转变带来了新的挑战:

  • 服务间依赖复杂性增加:微服务之间的调用链变得更加复杂
  • 故障传播风险加剧:单个服务的故障可能引发级联失败
  • 网络不可靠性:分布式环境中的网络延迟和故障成为常态

核心设计理念

Resilience4j的设计遵循了几个关键原则,这些原则使其在众多容错解决方案中脱颖而出:

1. 轻量级架构设计

Resilience4j采用了极简主义的设计哲学,整个库没有任何外部依赖(除了SLF4J),这使得它非常轻量:

// 核心模块依赖极简
dependencies {
    implementation 'io.github.resilience4j:resilience4j-circuitbreaker:2.0.2'
    // 无需复杂的依赖链
}

与Hystrix等重量级解决方案相比,Resilience4j的包大小减少了70%以上,启动时间显著缩短。

2. 函数式编程优先

Resilience4j专门为Java 8的函数式特性设计,充分利用了lambda表达式、方法引用和高阶函数:

// 使用函数式装饰器模式
CircuitBreaker circuitBreaker = CircuitBreaker.ofDefaults("backendService");
Supplier<String> decoratedSupplier = CircuitBreaker
    .decorateSupplier(circuitBreaker, backendService::doSomething);

这种设计使得代码更加简洁、表达力更强,并且易于组合不同的容错模式。

3. 模块化架构

Resilience4j采用高度模块化的设计,开发者可以根据需要选择特定的模块,避免引入不必要的功能:

mermaid

4. 无侵入式设计

Resilience4j通过装饰器模式实现无侵入式的集成,不需要修改现有的业务逻辑代码:

// 原始业务代码
String result = backendService.doSomething(param1, param2);

// 添加容错能力后的代码
String result = circuitBreaker.executeSupplier(
    () -> backendService.doSomething(param1, param2)
);

技术选型对比

为了理解Resilience4j的设计选择,让我们对比一下它与传统解决方案的主要差异:

特性Resilience4jHystrix传统方案
依赖重量轻量级(无外部依赖)重量级(依赖Netflix组件)中等
编程范式函数式优先命令式为主面向对象
模块化高度模块化相对集中集中式
性能开销中等
学习曲线平缓陡峭中等

设计哲学的核心要素

Resilience4j的设计哲学建立在几个核心要素之上:

可组合性(Composability)

不同的容错模式可以灵活组合,形成强大的保护层:

Supplier<String> decoratedSupplier = Decorators.ofSupplier(supplier)
    .withCircuitBreaker(circuitBreaker)
    .withBulkhead(bulkhead)
    .withRetry(retry)
    .decorate();
不可变性(Immutability)

所有配置对象都是不可变的,这保证了线程安全和配置的一致性:

CircuitBreakerConfig config = CircuitBreakerConfig.custom()
    .failureRateThreshold(50)
    .waitDurationInOpenState(Duration.ofMillis(1000))
    .slidingWindowSize(10)
    .build(); // 返回不可变配置
显式性(Explicitness)

容错行为完全由开发者控制,没有隐藏的魔法:

// 显式地获取执行权限
if (circuitBreaker.tryAcquirePermission()) {
    // 执行受保护的调用
    String result = backendService.call();
    circuitBreaker.onSuccess(duration, TimeUnit.MILLISECONDS);
} else {
    // 处理被拒绝的调用
    throw new CallNotPermittedException();
}

面向未来的设计

Resilience4j的设计考虑了现代应用的发展趋势:

  • 响应式编程支持:提供了对Reactor、RxJava等响应式框架的原生支持
  • 云原生友好:与Spring Boot、Micronaut等现代框架深度集成
  • 可观测性:内置Metrics和Tracing支持,便于监控和调试
  • Java版本演进:从Java 8开始支持,并随着Java版本的更新而演进

Resilience4j的设计理念体现了现代软件工程的核心理念:简单性、模块化、可组合性和显式性。这些设计选择使得它不仅在技术上先进,而且在实践中易于使用和维护,为Java开发者提供了一个强大而优雅的容错解决方案。

核心容错模式:断路器、重试、限流、隔离

Resilience4j作为Java生态中领先的容错库,提供了四大核心容错模式:断路器(Circuit Breaker)、重试(Retry)、限流(Rate Limiter)和隔离(Bulkhead)。这些模式共同构成了现代分布式系统稳定性的基石,能够有效应对网络延迟、服务不可用、资源竞争等各种故障场景。

断路器模式:智能故障检测与熔断

断路器模式是Resilience4j中最核心的容错机制,它通过状态机模型来监控服务调用成功率,在检测到故障时自动熔断,避免级联故障。

断路器状态机

Resilience4j的断路器实现了完整的状态机,包含以下状态:

mermaid

配置参数详解

断路器配置提供了丰富的参数来控制其行为:

参数默认值描述
failureRateThreshold50%失败率阈值,超过此值触发熔断
slowCallRateThreshold100%慢调用率阈值
slowCallDurationThreshold60秒慢调用时间阈值
permittedNumberOfCallsInHalfOpenState10半开状态允许的调用次数
maxWaitDurationInHalfOpenState0半开状态最大等待时间
slidingWindowTypeCOUNT_BASED滑动窗口类型(COUNT_BASED/TIME_BASED)
slidingWindowSize100滑动窗口大小
minimumNumberOfCalls100最小调用次数
代码示例
// 创建自定义配置的断路器
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
    .failureRateThreshold(50)
    .slowCallRateThreshold(100)
    .slowCallDurationThreshold(Duration.ofSeconds(2))
    .permittedNumberOfCallsInHalfOpenState(5)
    .maxWaitDurationInHalfOpenState(Duration.ofSeconds(10))
    .slidingWindowType(SlidingWindowType.TIME_BASED)
    .slidingWindowSize(10)
    .minimumNumberOfCalls(5)
    .waitDurationInOpenState(Duration.ofSeconds(30))
    .recordExceptions(IOException.class, TimeoutException.class)
    .ignoreExceptions(BusinessException.class)
    .build();

CircuitBreaker circuitBreaker = CircuitBreaker.of("backendService", config);

// 使用断路器保护服务调用
String result = circuitBreaker.executeSupplier(() -> {
    return externalService.call();
});

// 或者使用装饰器模式
Supplier<String> decoratedSupplier = CircuitBreaker
    .decorateSupplier(circuitBreaker, externalService::call);

重试模式:智能重试机制

重试模式通过自动重试失败的调用来提高系统可靠性,支持多种重试策略和退避算法。

重试策略配置

Resilience4j的重试机制提供了灵活的策略配置:

参数默认值描述
maxAttempts3最大重试次数
waitDuration500ms重试间隔时间
intervalFunction固定间隔间隔时间函数
retryExceptions所有异常需要重试的异常类型
ignoreExceptions忽略的异常类型
退避算法支持

Resilience4j支持多种退避算法:

// 固定间隔重试
RetryConfig fixedConfig = RetryConfig.custom()
    .maxAttempts(3)
    .waitDuration(Duration.ofMillis(500))
    .build();

// 指数退避
RetryConfig exponentialConfig = RetryConfig.custom()
    .maxAttempts(5)
    .intervalFunction(IntervalFunction.ofExponentialBackoff(
        Duration.ofMillis(100), 2.0, Duration.ofSeconds(30)))
    .build();

// 随机退避
RetryConfig randomConfig = RetryConfig.custom()
    .maxAttempts(4)
    .intervalFunction(IntervalFunction.ofRandomized(
        Duration.ofMillis(200), 0.5))
    .build();
代码示例
// 创建重试实例
RetryConfig retryConfig = RetryConfig.custom()
    .maxAttempts(3)
    .waitDuration(Duration.ofMillis(500))
    .retryExceptions(IOException.class, TimeoutException.class)
    .ignoreExceptions(BusinessException.class)
    .build();

Retry retry = Retry.of("backendService", retryConfig);

// 使用重试保护服务调用
String result = retry.executeSupplier(() -> {
    return externalService.call();
});

// 组合使用断路器和重试
Supplier<String> decoratedSupplier = Decorators.ofSupplier(externalService::call)
    .withCircuitBreaker(circuitBreaker)
    .withRetry(retry)
    .decorate();

限流模式:流量控制与保护

限流模式通过控制请求速率来保护系统免受过载影响,支持基于令牌桶和漏桶算法的实现。

限流算法比较

Resilience4j提供了两种限流器实现:

算法类型实现类特点适用场景
原子限流器AtomicRateLimiter基于Atomic操作,高性能高并发场景
信号量限流器SemaphoreBasedRateLimiter基于Semaphore,更精确精确控制场景
配置参数
参数默认值描述
limitForPeriod50每个周期允许的请求数
limitRefreshPeriod500ms限制刷新周期
timeoutDuration5s获取许可的超时时间
代码示例
// 创建限流器配置
RateLimiterConfig config = RateLimiterConfig.custom()
    .limitForPeriod(10)
    .limitRefreshPeriod(Duration.ofSeconds(1))
    .timeoutDuration(Duration.ofMillis(100))
    .build();

RateLimiter rateLimiter = RateLimiter.of("apiService", config);

// 使用限流器
Try<String> result = Try.ofSupplier(
    RateLimiter.decorateSupplier(rateLimiter, apiService::call)
);

// 异步限流
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> 
    rateLimiter.executeSupplier(apiService::call)
);

隔离模式:资源隔离与故障隔离

隔离模式通过限制并发访问数量来保护系统资源,防止单个服务的故障影响整个系统。

隔离类型

Resilience4j提供两种隔离实现:

mermaid

配置参数对比
参数信号量隔离线程池隔离
最大并发数maxConcurrentCallsmaxThreadPoolSize
等待时间maxWaitDurationN/A
队列大小N/AqueueCapacity
核心线程数N/AcoreThreadPoolSize
代码示例
// 信号量隔离配置
BulkheadConfig semaphoreConfig = BulkheadConfig.custom()
    .maxConcurrentCalls(20)
    .maxWaitDuration(Duration.ofMillis(100))
    .build();

Bulkhead semaphoreBulkhead = Bulkhead.of("serviceA", semaphoreConfig);

// 线程池隔离配置
ThreadPoolBulkheadConfig threadPoolConfig = ThreadPoolBulkheadConfig.custom()
    .maxThreadPoolSize(10)
    .coreThreadPoolSize(5)
    .queueCapacity(100)
    .keepAliveDuration(Duration.ofSeconds(30))
    .build();

ThreadPoolBulkhead threadPoolBulkhead = ThreadPoolBulkhead.of("serviceB", threadPoolConfig);

// 使用隔离保护服务
Supplier<String> protectedSupplier = Bulkhead
    .decorateSupplier(semaphoreBulkhead, serviceA::call);

// 异步线程池隔离
CompletionStage<String> result = threadPoolBulkhead.executeSupplier(serviceB::call);

模式组合与最佳实践

在实际应用中,通常需要组合使用多种容错模式来构建健壮的系统:

// 组合使用所有容错模式
Supplier<String> resilientSupplier = Decorators.ofSupplier(backendService::call)
    .withCircuitBreaker(circuitBreaker)   // 断路器保护
    .withRetry(retry)                     // 自动重试
    .withRateLimiter(rateLimiter)         // 流量控制
    .withBulkhead(bulkhead)               // 资源隔离
    .withFallback(Arrays.asList(
        TimeoutException.class, 
        CallNotPermittedException.class
    ), throwable -> "Fallback response")  // 降级策略
    .decorate();

// 执行受保护的调用
String result = Try.ofSupplier(resilientSupplier)
    .recover(throwable -> "Recovery response")
    .get();
配置管理最佳实践
  1. 环境差异化配置:为不同环境(开发、测试、生产)设置不同的容错参数
  2. 服务级别配置:根据服务的重要性和敏感性设置不同的容错策略
  3. 动态配置:利用配置中心实现运行时动态调整容错参数
  4. 监控与告警:集成监控系统,实时跟踪容错组件的状态和性能指标

通过合理配置和组合这些核心容错模式,Resilience4j能够为分布式系统提供全面的故障防护,确保系统在面对各种异常情况时仍能保持稳定运行。

函数式编程与装饰器模式的应用

Resilience4j作为专为函数式编程设计的容错库,其核心设计理念充分体现了现代Java函数式编程的最佳实践。通过高阶函数和装饰器模式的巧妙结合,Resilience4j为开发者提供了一种声明式、组合式的容错机制实现方式。

函数式编程基础与高阶函数

Resilience4j建立在Java 8的函数式接口基础之上,充分利用了SupplierFunctionConsumerRunnable等核心函数式接口。这些接口为容错装饰器的应用提供了统一的抽象层。

// 基础函数式接口示例
Supplier<String> supplier = () -> backendService.doSomething();
Function<String, Integer> function = input -> Integer.parseInt(input);
Consumer<String> consumer = message -> System.out.println(message);
Runnable runnable = () -> System.out.println("Task executed");

Resilience4j的高阶函数特性体现在它能够接受函数作为参数并返回新的函数。这种设计使得容错逻辑可以与业务逻辑完全解耦。

装饰器模式的核心实现

装饰器模式是Resilience4j架构的核心,通过层层包装的方式为原始函数添加容错能力。每个装饰器都是一个独立的组件,可以按需组合使用。

mermaid

Decorators构建器的强大功能

Resilience4j提供了Decorators构建器类,通过流畅的API接口实现装饰器的链式组合。这种设计使得代码既简洁又具有很好的可读性。

// 使用Decorators构建器创建复杂的容错组合
Supplier<String> decoratedSupplier = Decorators.ofSupplier(() -> backendService.doSomething())
    .withCircuitBreaker(circuitBreaker)
    .withRetry(retry)
    .withBulkhead(bulkhead)
    .withFallback(throwable -> "Fallback response")
    .decorate();

装饰器执行顺序与组合策略

装饰器的应用顺序至关重要,Resilience4j按照构建器链的顺序依次应用装饰器,形成从内到外的保护层。

mermaid

这种执行顺序确保了最内层的保护最先触发,最外层的保护最后处理异常,形成了完整的容错链条。

多种函数类型的装饰支持

Resilience4j支持多种函数类型的装饰,提供了统一的API接口:

函数类型装饰方法适用场景
Supplier ofSupplier()无参数有返回值的操作
Function<T,R>ofFunction()有参数有返回值的转换操作
RunnableofRunnable()无参数无返回值的执行操作
Consumer ofConsumer()有参数无返回值的消费操作
Callable ofCallable()可抛出异常的有返回值操作

装饰器组合的灵活性与可扩展性

Resilience4j的装饰器设计具有极高的灵活性,开发者可以根据具体需求选择需要的装饰器组合:

// 最小化组合 - 仅使用断路器
Supplier<String> minimal = Decorators.ofSupplier(supplier)
    .withCircuitBreaker(circuitBreaker)
    .decorate();

// 完整组合 - 包含所有容错机制
Supplier<String> full = Decorators.ofSupplier(supplier)
    .withCircuitBreaker(circuitBreaker)
    .withRetry(retry) 
    .withBulkhead(bulkhead)
    .withRateLimiter(rateLimiter)
    .withFallback(throwable -> "Recovery")
    .decorate();

异步编程的装饰器支持

对于异步编程场景,Resilience4j提供了专门的装饰器支持:

// 异步操作的装饰器组合
CompletionStage<String> asyncResult = Decorators.ofCompletionStage(() -> 
        CompletableFuture.supplyAsync(() -> backendService.doSomething()))
    .withCircuitBreaker(circuitBreaker)
    .withTimeLimiter(timeLimiter, scheduler)
    .withThreadPoolBulkhead(threadPoolBulkhead)
    .get();

类型安全的装饰器构建

Resilience4j通过泛型确保了装饰器组合的类型安全,避免了运行时类型错误:

// 类型安全的装饰器链
Decorators.DecorateSupplier<String> builder = Decorators.ofSupplier(() -> "result");
builder = builder.withCircuitBreaker(circuitBreaker);
builder = builder.withRetry(retry);
String result = builder.get(); // 类型安全的结果

装饰器模式的性能考量

虽然装饰器模式会引入一定的性能开销,但Resilience4j通过以下方式进行了优化:

  1. 轻量级包装:每个装饰器都是轻量级的函数包装
  2. 延迟执行:只有在真正调用时才执行装饰逻辑
  3. 无状态设计:大多数装饰器是无状态的,可安全共享

实际应用案例

在实际项目中,装饰器模式的应用可以极大简化容错代码的编写:

// 业务服务类
public class OrderService {
    private final Supplier<Order> getOrderSupplier;
    
    public OrderService(CircuitBreaker circuitBreaker, Retry retry) {
        this.getOrderSupplier = Decorators.ofSupplier(() -> fetchOrderFromRemote())
            .withCircuitBreaker(circuitBreaker)
            .withRetry(retry)
            .withFallback(throwable -> createFallbackOrder())
            .decorate();
    }
    
    public Order getOrder(String orderId) {
        return getOrderSupplier.get();
    }
}

通过函数式编程和装饰器模式的结合,Resilience4j为Java开发者提供了一种优雅、灵活且强大的容错解决方案。这种设计不仅提高了代码的可读性和可维护性,还为复杂的容错场景提供了简单而有效的实现方式。

项目架构与模块化设计思想

Resilience4j采用高度模块化的架构设计,这种设计理念使得开发者能够根据实际需求选择性地引入所需的功能模块,避免了不必要的依赖负担。整个项目由30多个独立的模块组成,每个模块都专注于特定的容错模式或框架集成。

核心架构层次

Resilience4j的架构可以分为三个主要层次:

核心层(Core Layer)

  • resilience4j-core:提供基础工具类和抽象
  • resilience4j-annotations:注解支持
  • resilience4j-test:测试工具

容错模式层(Fault Tolerance Layer)

  • resilience4j-circuitbreaker:断路器模式
  • resilience4j-ratelimiter:限流器模式
  • resilience4j-bulkhead:舱壁隔离模式
  • resilience4j-retry:重试机制
  • resilience4j-timelimiter:超时控制
  • resilience4j-cache:结果缓存
  • resilience4j-hedge:对冲执行模式

框架集成层(Framework Integration Layer)

  • Spring系列:resilience4j-spring, resilience4j-spring-boot2, resilience4j-spring-boot3
  • 响应式编程:resilience4j-reactor, resilience4j-rxjava2, resilience4j-rxjava3
  • 微服务框架:resilience4j-feign, resilience4j-micronaut
  • 监控指标:resilience4j-metrics, resilience4j-micrometer

模块依赖关系

mermaid

设计原则与模式

1. 单一职责原则

每个模块都专注于一个特定的容错模式或集成场景。例如:

  • CircuitBreaker模块只负责断路器逻辑
  • RateLimiter模块专注于请求速率限制
  • 框架集成模块负责与特定技术的适配
2. 装饰器模式

Resilience4j大量使用装饰器模式来增强函数式接口:

// 使用装饰器模式组合多个容错机制
Supplier<String> decoratedSupplier = Decorators.ofSupplier(supplier)
    .withCircuitBreaker(circuitBreaker)
    .withBulkhead(bulkhead)
    .withRetry(retry)
    .decorate();
3. 工厂模式和建造者模式

每个核心模块都提供工厂方法和建造者来创建实例:

// 使用建造者模式配置断路器
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
    .failureRateThreshold(50)
    .waitDurationInOpenState(Duration.ofMillis(1000))
    .slidingWindowSize(2)
    .build();

CircuitBreaker circuitBreaker = CircuitBreaker.of("backendName", config);

模块间协作机制

注册表模式(Registry Pattern)

Resilience4j使用注册表来管理多个实例:

// 创建注册表
CircuitBreakerRegistry circuitBreakerRegistry = CircuitBreakerRegistry.ofDefaults();

// 从注册表获取或创建实例
CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker("backendService");
事件发布-订阅模式

模块间通过事件机制进行通信:

circuitBreaker.getEventPublisher()
    .onStateTransition(event -> 
        logger.info("CircuitBreaker {} state changed from {} to {}",
            event.getCircuitBreakerName(),
            event.getStateTransition().getFromState(),
            event.getStateTransition().getToState()));

配置管理架构

Resilience4j采用分层配置管理:

配置层级描述示例
默认配置全局默认值CircuitBreakerConfig.ofDefaults()
自定义配置程序化配置CircuitBreakerConfig.custom().build()
外部配置配置文件application.yml中的配置

扩展性设计

SPI扩展机制

Resilience4j通过SPI(Service Provider Interface)支持扩展:

// 自定义指标收集器
public class CustomMetricsPublisher implements MetricsPublisher<CircuitBreakerMetrics> {
    @Override
    public void publishMetrics(CircuitBreakerMetrics metrics) {
        // 自定义指标发布逻辑
    }
}
自定义装饰器

开发者可以创建自定义装饰器:

public class CustomDecorator {
    public static <T> Supplier<T> decorate(Supplier<T> supplier) {
        return () -> {
            // 自定义装饰逻辑
            return supplier.get();
        };
    }
}

性能优化设计

无锁数据结构

Resilience4j在关键路径上使用无锁算法:

// 使用原子操作实现线程安全的计数器
private final AtomicInteger concurrentCalls = new AtomicInteger(0);

public boolean tryAcquirePermission() {
    return concurrentCalls.incrementAndGet() <= maxConcurrentCalls;
}
对象池和缓存

通过对象池减少对象创建开销:

// 使用对象池管理资源
private final ObjectPool<Resource> resourcePool = new ObjectPool<>(Resource::new);

测试架构设计

Resilience4j具有完善的测试体系:

测试类型模块描述
单元测试各模块test目录验证单个组件功能
性能测试jmh目录微基准测试
并发测试jcstress目录并发安全性测试
集成测试框架集成模块框架集成验证

这种模块化架构设计使得Resilience4j既保持了各个组件的独立性,又能够灵活组合使用,为Java应用提供了强大而灵活的容错能力。开发者可以根据具体需求选择所需的模块,避免了不必要的依赖,同时保证了系统的可维护性和扩展性。

总结

Resilience4j作为Java生态中领先的容错解决方案,通过其轻量级架构、函数式编程优先的设计理念和高度模块化的架构,为现代分布式系统提供了全面而强大的容错能力。本文详细探讨了Resilience4j的核心容错模式,包括智能断路器、灵活重试机制、精确限流控制和资源隔离策略,并深入分析了装饰器模式与函数式编程的优雅结合。项目的模块化设计使得开发者能够按需选择功能组件,避免了不必要的依赖负担。Resilience4j不仅继承了传统容错方案的优点,更通过现代化设计理念和技术实现,为Java开发者提供了高效、灵活且易于维护的容错解决方案,是构建可靠分布式系统的不可或缺的工具。

【免费下载链接】resilience4j Resilience4j is a fault tolerance library designed for Java8 and functional programming 【免费下载链接】resilience4j 项目地址: https://gitcode.com/gh_mirrors/re/resilience4j

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值