Spring Cloud Alibaba微服务治理实战:Nacos+Sentinel深度解析

news2025/4/16 2:58:20

一、引言

在微服务架构中,服务发现、配置管理、流量控制是保障系统稳定性的核心问题。Spring Cloud Netflix 生态曾主导微服务解决方案,但其部分组件(如 Eureka、Hystrix)已进入维护模式。

Spring Cloud Alibaba 凭借 高性能、轻量化、企业级特性,成为新一代微服务治理的事实标准。其核心组件 Nacos 和 Sentinel通过统一的 服务注册发现、动态配置管理、流量控制与熔断能力,显著简化了分布式系统的复杂度,为高可用架构提供了标准化支持。

版本说明:

+++版本兼容性说明+++  
- **Spring Cloud Alibaba 2022.0.0.0**  
  - 兼容JDK 11+(推荐JDK 17以获得最佳性能)  
  - 需显式启用bootstrap(添加依赖见下文)  
- **Nacos 2.2.3**  
  - 开发模式支持内嵌Derby数据库  
  - 生产环境强制要求MySQL 5.7+(集群模式)  
- **Sentinel 1.8.6**  
  - 最低支持JDK 1.8+  
  - 控制台推荐JDK 11+  
---

二、Spring Cloud Alibaba 生态组件

2.1 Nacos:服务注册与配置管理

1. 原理

Nacos 是一个动态服务发现、配置管理和服务元数据管理平台,支持 AP 或 CP 一致性模型(基于 Raft 协议)。

• 服务注册与发现:服务实例通过心跳机制向 Nacos Server 注册,客户端通过 DNS 或 HTTP API订阅服务列表。

• 配置管理:支持 配置版本管理、灰度发布、实时推送,基于 长轮询机制实现动态更新。

2. 示例

示例1:Nacos 服务注册与发现

配置 Nacos 地址

# bootstrap.yml
spring:
  application:
    name: order-service  # 服务名(必填)
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos server 地址
        namespace: dev  # 命名空间(隔离环境)
        group: PAYMENT_GROUP  # 逻辑分组
        cluster-name: HZ  # 机房标记(同集群优先调用)
        ephemeral: false  # 是否临时实例(K8S建议true)

关键点
• bootstrap.yml优先级高于application.yml,适合配置注册中心地址。

• server-addr格式为IP:Port,生产环境建议使用域名(如 nacos-cluster.prod.svc:8848)。

启用服务注册发现

@SpringBootApplication
@EnableDiscoveryClient  // 正确启用服务发现
public class OrderApplication { 
    public static void main(String[] args) { 
        SpringApplication.run(OrderApplication.class, args); 
    } 
}

解析:

• @EnableDiscoveryClient:激活服务注册/发现能力(兼容 Eureka、Consul 等)。

• Spring Cloud 2020+:无需显式添加该注解,但显式声明能提高可读性。

示例2:Nacos 配置中心

1. 配置中心基础使用

# bootstrap.yml (仅配置中心)
spring:
  application:
    name: order-service  # 应用名(用于关联配置Data ID)
  cloud:
    nacos:
      config:
        server-addr: ${NACOS_HOST:localhost}:8848  # 配置中心地址
        namespace: ${NACOS_NAMESPACE:dev}         # 命名空间(隔离环境)
        group: ${NACOS_GROUP:DEFAULT_GROUP}       # 配置分组
        file-extension: yaml                      # 配置格式
        username: ${NACOS_USER:admin}             # 安全认证
        password: ${NACOS_PWD:admin}
        # 共享配置(跨服务共用)
        shared-configs:
          - data-id: common-datasource.yaml
            group: SHARED_GROUP
            refresh: true
        # 环境专属配置
        extension-configs[0]:
          data-id: order-service-${spring.profiles.active}.yaml
          group: ENV_${spring.profiles.active}
          refresh: true

业务层 application 配置

# 业务配置(可被Nacos覆盖)
spring:
  profiles:
    active: dev  # 指定当前环境
  datasource:
    url: ${DB_URL:jdbc:mysql://localhost:3306/order}
    username: ${DB_USER:root}
    password: ${DB_PWD:123456}

# 动态配置项(从Nacos加载)
order:
  timeout: 3000  # 会被Nacos中的配置覆盖

2. 多环境配置管理

# Nacos 控制台创建配置
Data ID: order-service-{env}.yaml      # 如 order-service-prod.yaml
Group: ORDER_GROUP                     # 建议按业务功能分组

# 配置内容示例:
order:
  timeout: 3000
  whitelist: 192.168.1.100,10.0.0.1
  retry:
    max-attempts: 3
    backoff: 200ms

3. 动态刷新进阶用法

方式 1:@RefreshScope + @Value (适用于简单场景)

@RefreshScope
@Service
public class OrderService {
    @Value("${order.timeout:1000}")     // 支持默认值
    private int timeout;
}

方式 2:@ConfigurationProperties (推荐结构化配置)

/**
 * 订单服务配置类(动态刷新)
 * 从Nacos配置中心加载以'order'为前缀的配置项
 */
@Data 
@RefreshScope // 支持配置热更新
@ConfigurationProperties(prefix = "order") // 绑定配置前缀
public class OrderConfig {
    private int timeout;

    // IP白名单列表 
    private List<String> whitelist;

    // 重试策略配置
    private RetryConfig retry;

    /**
     * 重试策略嵌套配置类
     */
    @Data
    public static class RetryConfig {
        // 最大重试次数
        private int maxAttempts;

        // 重试间隔时间
        private Duration backoff;
    }
}

方式 3:监听配置变更事件

@Component
public class ConfigListener implements ApplicationListener<RefreshScopeRefreshedEvent> {
    @Override
    public void onApplicationEvent(RefreshScopeRefreshedEvent event) {
        System.out.println("配置已刷新,需重新初始化资源");
    }
}

4. 配置中心与服务发现的联动

# 服务元数据与配置联动
spring:
  cloud:
    nacos:
      discovery:
        metadata:
          config-version: v2.1  # 通过元数据标识配置版本
          feature-flags: A/B

3. 最佳实践建议

配置规范

• 生产环境配置 必须设置 group明确业务归属

• 敏感配置应使用 nacos-config-encryption-plugin插件加密

版本控制

# 通过 OpenAPI 管理配置历史
curl -X GET "http://localhost:8848/nacos/v1/cs/history?dataId=order-service.yaml&group=ORDER_GROUP"

灰度发布

// 配合 @Conditional 实现配置驱动的特性开关

@Bean
@ConditionalOnProperty(name = "features.new-payment", havingValue = "true")
public PaymentService newPaymentService() {
    return new NewPaymentImpl();
}

调试技巧

# 启动时增加参数检查配置加载
-Dspring.cloud.nacos.config.import-check.enabled=true

关键原理说明

• 长轮询机制:客户端默认 每 30 秒检查配置变更,服务端会 hold住请求,直到配置变更或超时 (30s)

• 本地缓存:配置会持久化到 ${user.home}/nacos/config/目录,保证断网时可用

• 一致性保障:CP 模式使用 Raft协议保证配置变更的强一致性

4. Nacos 与传统组件对比

与 Eureka 的对比

在这里插入图片描述

总结:
• Nacos相比 Eureka,具有更强的健康检查支持,且内置了配置管理功能,减少了外部依赖。

• Nacos的一致性保障和对 Kubernetes 的支持使其在现代云原生架构中更具优势,而 Eureka主要偏向于传统的微服务架构。

数据同步机制对比:
在这里插入图片描述

2.2 Sentinel:流量控制与熔断机制

1. 原理

Sentinel 以流量为切入点,通过规则定义(QPS、线程数、熔断降级)保障系统稳定性。

• 流量控制:基于滑动时间窗口统计,支持 直接拒绝、匀速排队等策略。

• 熔断降级:通过 异常比例、响应时间阈值触发熔断,自动恢复依赖调用。

Sentinel 核心算法

滑动时间窗口实现

滑动时间窗口是流量控制中的一个关键概念,通常用于计算指定时间窗口内的请求次数,以便实现限流控制。以下是滑动时间窗口的伪代码实现示例,采用秒级时间粒度:

# 伪代码展示统计逻辑
class TimeWindow:
    def __init__(self):
        # 存储时间窗口的请求计数
        self.windows = defaultdict(int)

    def add(self, timestamp):
        # 根据时间戳划分窗口,1秒为粒度
        slot = timestamp // 1000  # 将时间戳按秒划分
        self.windows[slot] += 1

    def sum(self, period):
        # 获取当前时间的秒级时间戳
        current = time.time() // 1000
        # 计算当前窗口内指定时间周期内的请求总数
        return sum(v for k, v in self.windows.items() 
                 if current - k < period)

说明:

• add 方法:将请求的时间戳按秒划分为时间窗口,并将该窗口的请求次数加一。

• sum 方法:计算当前时间窗口内,指定时间周期(period)内的请求总数,通常用于判断是否超过限流阈值。

2. 示例

定义 Sentinel 资源与流控规则

项目结构

my-sentinel-demo
│
├── src
│   └── main
│       └── java
│           └── com
│               └── example
│                   └── sentinel
│                       ├── Application.java          // Spring Boot 启动类
│                       ├── OrderService.java         // 业务逻辑类,包含限流与熔断处理
│                       ├── Order.java                // 订单类,用于存储订单信息
│                       └── FlowRuleConfig.java       // 流量控制规则配置类
│
└── pom.xml                                        // Maven 配置文件,包含所需的依赖

启动步骤

1.初始化项目:将上述 Java 文件和 pom.xml文件放入相应的目录。

2.配置依赖:确保 pom.xml中包含了 Sentinel 和 Spring Boot 的相关依赖。

3.启动应用:运行 Application.java,Spring Boot 会自动启动服务。

4.访问接口:访问 http://localhost:8080/order/{id},通过该接口查询订单。如果达到流量控制规则的阈值,则会触发限流处理,返回 服务限流。

代码示例

1.OrderService.java

包含业务逻辑和流量控制的配置。

//降级处理类
@Component  
public class OrderFallback {  
    public static String handleBlock(String orderId, BlockException ex) {  
        return "[降级处理] 系统繁忙,请稍后重试 (订单ID:" + orderId + ")";  
    }  
}  
//Service类
@Service  
public class OrderService {  
    @SentinelResource(  
        value = "queryOrder",  
        blockHandlerClass = OrderFallback.class,  
        blockHandler = "handleBlock",  
        // 新增热点参数规则  
        fallback = "queryOrderFallback"  
    )  
    public String queryOrder(@RequestParam String orderId) {  
        return "订单详情 - ID: " + orderId;  
    }  

    // 熔断降级方法  
    public String queryOrderFallback(String orderId, Throwable ex) {  
        return "[熔断保护] 服务暂时不可用";  
    }  
}  

2. Order.java

Order类用于表示订单对象。

public class Order {
    private String id;
    private String description;

    public Order(String id, String description) {
        this.id = id;
        this.description = description;
    }

    // Getter 和 Setter
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

3. FlowRuleConfig.java

配置 Sentinel 流量控制规则。

import com.alibaba.csp.sentinel.slots.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.flow.FlowRuleManager;
import com.alibaba.csp.sentinel.slots.flow.RuleConstant;
import org.springframework.stereotype.Component;

import java.util.Collections;

@Component
public class FlowRuleConfig {

    // 构造函数中配置流量控制规则
    public FlowRuleConfig() {
        // 创建流量控制规则,指定资源名称为 "queryOrder"
        FlowRule rule = new FlowRule("queryOrder")
            .setCount(100)  // 设置 QPS(每秒请求数)阈值为 100
            .setGrade(RuleConstant.FLOW_GRADE_QPS);  // 使用 QPS 限流策略

        // 将流量控制规则加载到 FlowRuleManager 中
        FlowRuleManager.loadRules(Collections.singletonList(rule));
    }
}

4. Application.java

Application类用于启动 Spring Boot 应用。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        // 启动 Spring Boot 应用
        SpringApplication.run(Application.class, args);
    }
}

说明

1.OrderService:包含了业务逻辑(查询订单)和限流处理(handleBlock)。

2.Order:一个简单的 POJO 类,表示订单对象。

3.FlowRuleConfig:配置流量控制规则的类,初始化时加载流量规则到 FlowRuleManager。

4.Application:Spring Boot 应用的启动类。

3. Sentinel 与传统组件对比
在这里插入图片描述

总结

• Sentinel提供了更全面的流量控制和熔断功能,尤其适合微服务架构,支持更细粒度的监控与治理。

• Hystrix已进入维护阶段,适合已有应用,但不再推荐新项目使用。

• Ribbon主要用于负载均衡,不具备流量控制或熔断能力。

如果需要灵活的流量控制与熔断机制,Sentinel是更好的选择。

2.3 分布式治理协同机制

graph LR
A[Nacos服务发现] --> B[实例上下线事件]
B --> C[Sentinel动态调整流量路由]
D[Nacos配置变更] --> E[Sentinel规则热更新]

Nacos 与 Sentinel 通过以下协同策略保障系统稳定性:

1.动态规则持久化:将 Sentinel 规则存储至 Nacos 配置中心,实现规则的多环境同步。

2.服务健康联动:Nacos 剔除异常实例后,Sentinel 自动调整流量路由策略,避免流量继续访问不可用实例。

三、Spring Cloud Alibaba 示例

3.1 场景描述

构建 订单服务(Order Service)与 库存服务(Stock Service),实现:

• 服务注册与发现(Nacos)

• 配置动态更新(Nacos 配置中心)

• 接口限流(Sentinel)

3.2 项目结构

spring-cloud-alibaba-sample/
│── order-service/          # 订单服务
│   ├── src/main/java/com/example/order/
│   │   ├── OrderApplication.java  # Spring Boot 启动类
│   │   ├── controller/OrderController.java  # 订单接口
│   │   ├── service/OrderService.java  # 订单业务
│   │   ├── config/NacosConfig.java  # 读取 Nacos 配置
│   │   ├── sentinel/OrderSentinelHandler.java  # Sentinel 限流
│   ├── src/main/resources/
│   │   ├── bootstrap.yml   # 连接 Nacos 配置
│   │   ├── application.yml # 业务相关配置
│   ├── pom.xml             # 依赖管理
│
│── nacos/                  # Nacos 配置文件
│   ├── order-service.yaml  # 订单服务的 Nacos 配置
│
│── sentinel-dashboard/      # Sentinel 控制台(可选)
│── docker-compose.yml       # 一键启动 Nacos 和 Sentinel(可选)
│── pom.xml                  # 父级依赖管理

3.3 代码实现示例

1. 添加 pom.xml

在 pom.xml中添加 Spring Boot、Spring Cloud Alibaba (Nacos & Sentinel)相关依赖:

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Nacos 服务注册与配置管理 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

    <!-- Sentinel 流量控制与熔断降级 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
</dependencies>

2. 配置 application.yml

在 src/main/resources/application.yml添加基础配置:

server:
  port: 8081  # 订单服务端口

spring:
  application:
    name: order-service  # 服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  # Nacos 地址
      config:
        server-addr: localhost:8848
        file-extension: yaml  # 以 YAML 格式存储配置
    sentinel:
      transport:
        dashboard: localhost:8858  # Sentinel 控制台地址

3. 业务代码

(1) 订单服务 OrderService

package com.example.order.service;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    /**
     * 查询订单接口,使用 Sentinel 进行限流保护
     */
    @SentinelResource(value = "queryOrder", blockHandler = "handleBlock")
    public String queryOrder(String orderId) {
        return "订单详情 - ID: " + orderId;
    }

    /**
     * 限流后的降级处理逻辑
     */
    public String handleBlock(String orderId, Throwable ex) {
        return "系统繁忙,请稍后再试!(订单ID:" + orderId + ")";
    }
}

(2) 订单控制器 OrderController

package com.example.order.controller;

import com.example.order.service.OrderService;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/order")
public class OrderController {

    private final OrderService orderService;

    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    /**
     * 订单查询接口
     */
    @GetMapping("/{id}")
    public String getOrder(@PathVariable String id) {
        return orderService.queryOrder(id);
    }
}

(3) 启动类 OrderApplication

package com.example.order;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient // 启用 Nacos 服务注册
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

4. 启动 Nacos & 订单服务

(1) 启动 Nacos

sh startup.sh -m standalone  # 启动 Nacos(独立模式)

(2) 启动订单服务

mvn spring-boot:run

5. 测试验证

(1) 确保服务注册到 Nacos

在浏览器访问 Nacos 控制台(默认 http://localhost:8848/nacos),查看 order-service 是否成功注册。

(2) 访问订单接口

在浏览器或 Postman请求:

curl http://localhost:8081/order/123

预期输出

“订单详情 - ID: 123”
(3) 配置 Sentinel 规则

访问 Sentinel 控制台http://localhost:8858,添加流量控制规则:

• 资源名称:queryOrder

• 限流类型:QPS

• 阈值:1

然后短时间内快速请求:

curl http://localhost:8081/order/123

超过限流阈值后,预期输出

"系统繁忙,请稍后再试!(订单ID:123)"

总结

1.POM 依赖:Spring Boot + Nacos + Sentinel 必要依赖

2.配置文件:Nacos 注册、配置管理 & Sentinel 监控

3.业务代码:

• OrderService:提供订单查询,添加 Sentinel 保护

• OrderController:提供 REST 接口

• OrderApplication:主应用入口

4.启动服务:运行 Nacos & 订单服务

5.测试验证:查看 Nacos 注册、调用接口、验证 Sentinel 限流

3.4 与K8S集成关键步骤

服务注册适配

# deployment.yaml 关键配置
env:
  - name: SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR
    value: "${NACOS_SERVICE_NAME:nacos}-cluster.${POD_NAMESPACE:default}.svc.cluster.local:8848"
  - name: SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE
    valueFrom:
      fieldRef:
        fieldPath: metadata.namespace
  - name: NACOS_NAMESPACE  # 新增统一环境变量
    valueFrom:
      fieldRef:
        fieldPath: metadata.namespace
  - name: NACOS_GROUP      # 新增分组配置
    value: "${APP_GROUP:PROD_GROUP}"

配置管理方案

# 通过InitContainer同步配置
initContainers:
- name: nacos-config-loader
  image: alpine/curl
  command: ['sh', '-c', 
    'curl -X POST nacos:8848/nacos/v1/cs/configs?dataId=order-service.yaml&group=DEFAULT_GROUP&content=$(cat /config/application.yaml)']
Sentinel 自适应扩缩

// HPA指标适配器示例
type SentinelMetricsAdapter struct {
    rejectedRequests float64
}

func (a *SentinelMetricsAdapter) GetMetrics() (float64, error) {
    return a.rejectedRequests, nil
}

3.5 典型问题排查

服务注册异常场景:

• 网络策略未开放 8848 端口

• Pod 与 Nacos 的 namespace 不匹配

• 心跳间隔配置不当(建议值:5-15s)

四、Spring Cloud Alibaba 生态最佳实践

1. 服务注册与发现的优化

• 生产环境建议 Nacos 采用集群化部署,提高可靠性和性能。

2. 配置管理的版本控制

• 在 Nacos 配置中心,建议为每个微服务的配置 添加版本控制,确保在更新时能够快速回滚。

3. 流量控制的精细化

• 根据业务场景 针对不同接口设置不同的限流策略,避免一刀切:

• 核心业务接口:适当提高限流阈值,保障稳定性。

• 非核心接口:限制更严格的流量控制,减少资源占用。

4. 监控与告警

• 结合 Prometheus + Grafana,实时监控微服务运行状态。

• 配置告警机制,及时发现并处理异常。

5. 多环境配置策略

# bootstrap.properties
spring.profiles.active=@profile@
spring.cloud.nacos.config.ext-config[0].data-id=order-service-${profile}.yaml
spring.cloud.nacos.config.ext-config[0].group=ENV_${profile}
spring.cloud.nacos.config.ext-config[0].refresh=true

6. 熔断策略优化矩阵
在这里插入图片描述
快速恢复、指数退避重试、熔断后降级缓存

五、总结

5.1 核心重点

Spring Cloud Alibaba 生态为微服务架构提供了 三大核心能力:

1. 服务治理体系

• Nacos的 多集群隔离和 元数据管理,支持跨机房流量调度

• 服务健康检查的三级熔断机制(实例级 > 服务级 > 集群级)

2. 配置管理维度

• 配置的版本追溯和 一键回滚(基于 Nacos 的配置历史版本)

• 安全审计:支持 RAM 权限模型和 配置变更记录

3. 流量治理闭环

• Sentinel的 多维熔断策略(慢调用比例 / 异常比例 / 异常数)

• 与 Nacos 联动的 动态规则推送(秒级生效)

5.2 生产环境关键指标
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红宝书第三十六讲:持续集成(CI)配置入门指南

红宝书第三十六讲&#xff1a;持续集成&#xff08;CI&#xff09;配置入门指南 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、什么是持续集成&#xff1f; 持续集成&#xff08;CI&#xff09;就像咖啡厅的…

Java—HTML:3D形变

今天我要介绍的是在Java HTML中CSS的相关知识点内容之一&#xff1a;3D形变&#xff08;3D变换&#xff09;。该内容包含透视&#xff08;属性&#xff1a;perspective&#xff09;&#xff0c;3D变换&#xff0c;3D变换函数以及案例演示&#xff0c; 接下来我将逐一介绍&…

什么是音频预加重与去加重,预加重与去加重的原理是什么,在什么条件下会使用预加重与去加重?

音频预加重与去加重是音频处理中的两个重要概念&#xff0c;以下是对其原理及应用条件的详细介绍&#xff1a; 1、音频预加重与去加重的定义 预加重&#xff1a;在音频信号的发送端&#xff0c;对音频信号的高频部分进行提升&#xff0c;增加高频信号的幅度&#xff0c;使其在…

免费下载 | 2025清华五道口:“十五五”金融规划研究白皮书

《2025清华五道口&#xff1a;“十五五”金融规划研究白皮书》的核心内容主要包括以下几个方面&#xff1a; 一、五年金融规划的重要功能与作用 凝聚共识&#xff1a;五年金融规划是国家金融发展的前瞻性谋划和战略性安排&#xff0c;通过广泛听取社会各界意见&#xff0c;凝…

微信小程序实战案例 - 餐馆点餐系统 阶段 4 - 订单列表 状态

✅ 阶段 4 – 订单列表 & 状态 目标 展示用户「我的订单」列表支持状态筛选&#xff08;全部 / 待处理 / 已完成&#xff09;支持分页加载和实时刷新使用原生组件编写 ✅ 1. 页面结构&#xff1a;文件结构 pages/orders/├─ index.json├─ index.wxml├─ index.js└─…

如何为C++实习做准备?

博主介绍&#xff1a;程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x1…

Cesium.js(6):Cesium相机系统

Camera表示观察场景的视角。通过操作摄像机&#xff0c;可以控制视图的位置、方向和角度。 帮助文档&#xff1a;Camera - Cesium Documentation 1 setView setView 方法允许你指定相机的目标位置和姿态。你可以通过 Cartesian3 对象来指定目标位置&#xff0c;并通过 orien…

AI 代码生成工具如何突破 Java 单元测试效能天花板?

一、传统单元测试的四大痛点 时间黑洞&#xff1a;根据 JetBrains 调研&#xff0c;Java 开发者平均花费 35% 时间编写测试代码覆盖盲区&#xff1a;手工测试覆盖率普遍低于 60%&#xff08;Jacoco 全球统计数据&#xff09;维护困境&#xff1a;业务代码变更导致 38% 的测试用…

客户端负载均衡与服务器端负载均衡详解

客户端负载均衡与服务器端负载均衡详解 1. 客户端负载均衡&#xff08;Client-Side Load Balancing&#xff09; 核心概念 定义&#xff1a;负载均衡逻辑在客户端实现&#xff0c;客户端主动选择目标服务实例。典型场景&#xff1a;微服务内部调用&#xff08;如Spring Cloud…

基于springboot的“流浪动物管理系统”的设计与实现(源码+数据库+文档+PPT)

基于springboot的“流浪动物管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;springboot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统…

爬虫解决debbugger之替换文件

鼠鼠上次做一个网站的时候&#xff0c;遇到的debbugger问题&#xff0c;是通过打断点然后编辑断点解决的&#xff0c;现在鼠鼠又学会了一个新的技能 首先需要大家下载一个reres的插件&#xff0c;这里最好用谷歌浏览器 先请大家看看案例国家水质自动综合监管平台 这里我们只…

奇怪的电梯——DFS算法

题目 题解 每到一层楼都面临了两种选择&#xff1a;上还是下&#xff1f;因此我们可以定义一个布尔数组用来记录选择。 终止条件其实也明显&#xff0c;要么到了B层&#xff0c;要么没有找到楼层。 如果找到了&#xff0c;选择一个步骤少的方式。又怎么表示没有找到楼层&…

Open GL ES-> 工厂设计模式包装 SurfaceView + 自定义EGL的OpenGL ES 渲染框架

XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.EGLSurfaceView xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"…

深入解析多表联查(MySQL)

前言 在面试中以及实际开发中&#xff0c;多表联查是每个程序员必备技能&#xff0c;下文通过最简单的学生表和课程表的实例帮大家最快入门多表联查技能。 建立数据表 1. 学生表&#xff08;students&#xff09; 创建学生表 CREATE TABLE students (student_id INT AUTO_…

宇视设备视频平台EasyCVR打造智慧酒店安防体系,筑牢安全防线

一、需求背景 酒店作为人员流动频繁的场所&#xff0c;对安全保障与隐私保护有着极高的要求。为切实维护酒店内部公共区域的安全秩序&#xff0c;24小时不间断视频监控成为必要举措。通常情况下&#xff0c;酒店需在本地部署视频监控系统以供查看&#xff0c;部分连锁酒店还希…

Linux中的文件传输(附加详细实验案例)

一、实验环境的设置 ①该实验需要两台主机&#xff0c;虚拟机名称为 L2 和 L3 &#xff0c;在终端分别更改主机名为 node1 和 node2&#xff0c;在实验过程能够更好分辨。 然后再重新打开终端&#xff0c;主机名便都更改了相应的名称。 ②用 ip a 的命令分别查看两个主机的 …

基于 OpenHarmony 5.0 的星闪轻量型设备应用开发——Ch2 OpenHarmony LiteOS-M 内核应用开发

写在前面&#xff1a; 此篇是系列文章《基于 OpenHarmony5.0 的星闪轻量型设备应用开发》的第 2 章。本篇介绍了如何在 OpenHarmony 5.0 框架下&#xff0c;针对 WS63 进行 LiteOS-M 内核应用工程的开发。 为了方便读者学习&#xff0c;需要OpenHarmony 5.0 WS63 SDK 的小伙伴可…

Linux--线程概念与控制

目录 1. Linux线程概念 1-1 什么是线程 1-2 分⻚式存储管理 1-2-1 虚拟地址和⻚表的由来 1-2-2 物理内存管理 1-2-3 ⻚表 1-2-4 ⻚⽬录结构 1-2-5 两级⻚表的地址转换 1-2-6 缺⻚异常 1-3 线程的优点 1-4 线程的缺点 1-5 线程异常 1-6 线程⽤途 2. Linux进程VS线…

Python | kelvin波的水平空间结构

写在前面 简单记录一下之前想画的一个图&#xff1a; 思路 整体比较简单&#xff0c;两个子图&#xff0c;本质上就是一个带有投影&#xff0c;一个不带投影&#xff0c;通常用在EOF的空间模态和时间序列的绘制中&#xff0c;可以看看之前的几个详细的画法。 Python | El Ni…

【音视频】SDL播放PCM音频

相关API 打开音频设备 int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired, SDL_AudioSpec * obtained); desired&#xff1a;期望的参数。obtained&#xff1a;实际音频设备的参数&#xff0c;一般情况下设置为NULL即可。 SDL_AudioSpec typedef struct SDL_AudioSpec { i…