万字长文讲解如何快速搭建一个Spring Cloud项目

news2024/11/17 13:50:08

文章目录

  • 概念
    • 基本概念
    • 微服务七大组件
  • 初始化Maven父工程
  • 整合注册中心组件
  • 整合远程调用与负载均衡组件组件
  • 整合网关组件
  • 整合配置中心组件
    • 以gateway模块为例
  • 整合分布式事务组件
    • 操作数据库模拟创建订单和扣减库存
    • 整合Seata
  • 整合熔断降级组件
  • 整合链路追踪组件
  • 源码地址
  • 参考来源

概念

基本概念

微服务就是将一个大型单体应用拆分成多个独立的、负责特定业务的小服务。一个单体应用改造成微服务应用会让应用的性能得到巨大提升,但也带来了微服务架构繁琐的治理工作。而微服务组件是为了更好的治理微服务架构项目,让程序员将更多的精力放在业务开发上。目前主流的微服务项目是使用Spring Cloud组件 + Spring Cloud Alibaba组件共同搭建的。

微服务七大组件

  • 注册中心
    国内常用的注册中心组件是Spring Cloud Alibaba的nacos
  • 远程调用与负载均衡
    国内常用的远程调用与负载均衡组件是Spring Cloud的openfeigh + loadbalancer
  • 网关
    国内常用的网关组件是Spring Cloud的gateway
  • 配置中心
    国内常用的配置中心组件是Spring Cloud Alibaba的nacos
  • 分布式事务
    国内常用的分布式事务组件是Spring Cloud Alibaba的seata
  • 熔断降级
    国内常用的熔断降级组件是Spring Cloud Alibaba的sentinel
  • 链路追踪
    国内常用的链路追踪组件是Spring Cloud的micrometer tracing + zipkin

初始化Maven父工程

  • 创建一个简单的maven工程
  • 规整目录
    删除src目录,只保留pom.xml文件和.gitignore文件
  • 将maven工程打包方式配置为pom
  <packaging>pom</packaging>
  • 规定编码方式以及依赖版本号
  <properties>
    <java.version>17</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>3.0.2</spring-boot.version>
    <spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
    <spring-cloud.version>2022.0.0</spring-cloud.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <!--  Spring Boot版本管理  -->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--  Spring Cloud版本管理  -->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--  Spring Cloud Alibaba版本管理  -->
      <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>
    </dependencies>
  </dependencyManagement>
  • 添加Spring Boot依赖
<dependencies>
    <!--  Spring Boot 启动依赖  -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>

整合注册中心组件

  • 下载解压nacos
    下载地址:nacos下载
  • 启动nacos(Windows环境)
    startup.cmd -m standalone
  • 用maven创建一个订单子模块order
  • 规定编译版本和编码方式
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
  • 父工程引入注册中心依赖
    <!--  注册中心组件  -->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
  • order模块引入web启动依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
  • 创建启动类
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}
  • 配置nacos注册中心地址
server:
  port: 20100
spring:
  application:
    name: order
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  • 启动order模块
  • 访问nacos

可以看到order服务已注册到nacos中了
在这里插入图片描述

整合远程调用与负载均衡组件组件

我们模拟订单服务创建订单后远程调用库存服务扣减库存的场景

  • 用之前的方式创建一个storage模块并整合注册中心组件
  • 编写storage服务扣减库存接口
@RestController
@RequestMapping("/storage")
public class StorageController {

    @GetMapping("/reduceStorage/{productId}")
    public String reduceStorage(@PathVariable Integer productId) {
        return "扣减库存成功;";
    }

}
  • order服务引入远程调用与负载均衡组件依赖
     <!--  远程调用组件  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--  负载均衡组件  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
  • order服务启动类开启远程调用注解
@EnableFeignClients
  • order服务编写Feign接口
@FeignClient("storage")
public interface StorageClient {
    @GetMapping("/storage/reduceStorage/{productId}")
    String reduceStorage(@PathVariable("productId") Integer productId);
}
  • order服务编写Controller接口
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private OrderService orderService;

    @GetMapping("/createOrder")
    public String createOrder() {
        return orderService.createOrder();
    }
}
  • order服务编写Service接口
public interface OrderService {
    String createOrder();
}
@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    private StorageClient storageClient;

    @Override
    public String createOrder() {
        return "创建订单成功;" + storageClient.reduceStorage(1);
    }
}

  • 重启order服务和storage服务并访问测试
    在这里插入图片描述

整合网关组件

  • 用之前的方式创建一个gateway模块并整合注册中心组件
  • 引入网关和负载均衡组件依赖
  <dependencies>
  	<!--   无需引入web启动依赖     -->
  	<!--    网关启动依赖    -->
    <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-gateway</artifactId>
      </dependency>
      <!--  负载均衡组件  -->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-loadbalancer</artifactId>
      </dependency>
    </dependencies>
  • 配置网关路由
spring:
  cloud:
    gateway:
      routes:
        - id: order_route # 订单服务路由id
          uri: lb://order # 转发到订单服务并实现负载均衡
          predicates:
            - Path=/api-order/** # 匹配 /api-order 开头的请求
          filters:
            - RewritePath=/api-order/?(?<segment>.*), /$\{segment} # 路径重写,如 /api-order/order 重写为 /order
        - id: storage_route # 库存服务路由id
          uri: lb://storage # 转发到库存服务并实现负载均衡
          predicates:
            - Path=/api-storage/**
          filters:
            - RewritePath=/api-storage/?(?<segment>.*), /$\{segment}
  • 启动网关

网关已注册到注册中心了
在这里插入图片描述

  • 使用网关ip和接口前缀访问order服务和storage服务
    在这里插入图片描述
    在这里插入图片描述

整合配置中心组件

以gateway模块为例

  • 下载并启动nacos
    这一步前面已经做了,可以跳过
  • 引入配置中心相关依赖
    <!--  配置中心组件  -->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!--  bootstrap启动依赖  -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
  • 创建并配置bootstrap.yml
    在Spring Boot中,bootstrap.yml会比application.yml优先加载,所以可以将application.yml的部分配置迁移到bootstrap.yml,帮助程序加载配置中心的配置
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        prefix: ${spring.application.name}  #通过 ${prefix}-${spring.profiles.active}.${file-extension} 可以找到配置中心对应的配置文件
        file-extension: yml  # nacos配置文件扩展名,目前只支持 properties 和 yaml 类型
        namespace: public # 默认就是 public
        group: DEFAULT_GROUP # 默认就是 DEFAULT_GROUP

Spring Boot默认会将prefix-spring.profiles.active.file-extension作为DataID找到配置中心对应的配置文件,如果profiles.active.file不配置,则会将prefix.file-extension作为DataID找到配置中心对应的配置文件
默认情况下,配置文件的命名空间为public,分组名为DEFAULT_GROUP,我们可以为每个微服务创建不同的命名空间来区分不同服务,创建不同分组来区分不同环境,这里就不做演示了

  • 在配置中心创建配置文件
    在这里插入图片描述

  • 将网关的配置迁移到配置中心
    在这里插入图片描述

  • 重启gateway服务并测试

整合分布式事务组件

操作数据库模拟创建订单和扣减库存

前面我们调用创建订单接口只是返回字符串信息,接下来我们创建订单数据库、订单表、库存数据库和库存表,实现真实的数据库操作

  • 创建订单数据库spring_cloud_order
  • 创建订单表
CREATE TABLE `t_order` (
                           `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
                           `product_id` int(11) NOT NULL COMMENT '商品id',
                           `user_id` int(11) NOT NULL COMMENT '用户id',
                           `order_number` varchar(100) NOT NULL COMMENT '订单编号',
                           `order_amount` decimal(10,2) NOT NULL COMMENT '订单金额',
                           `flag` tinyint(4) NOT NULL DEFAULT '1' COMMENT '删除标志:0-删除,1-不删除',
                           `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                           `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
                           PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
  • 创建库存数据库spring_cloud_storage
  • 创建库存表
CREATE TABLE `t_storage` (
                             `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
                             `product_id` int(11) NOT NULL COMMENT '商品id',
                             `quantity` int(11) NOT NULL COMMENT '商品数量',
                             `flag` tinyint(4) NOT NULL DEFAULT '1' COMMENT '删除标志:0-删除,1-不删除',
                             `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                             `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
                             PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='库存表';
  • 新增产品id为1的库存数据
INSERT INTO `spring_cloud_storage`.`t_storage` (`id`, `product_id`, `quantity`, `flag`, `create_time`, `update_time`) VALUES (1, 1, 100, 1, '2024-06-01 09:22:56', '2024-06-08 16:32:13');

  • order服务整合Mybatis-Plus

    • 引入maven依赖
        <!--    MySQL驱动    -->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--    mybatis-plus启动依赖。注意依赖版本要匹配    -->
        <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>mybatis-plus-boot-starter</artifactId>
          <version>3.5.5</version>
        </dependency>
        <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
        </dependency>
    
    • 配置yml
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/spring_cloud_order?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false
        username: root
        password: root
    mybatis-plus:
      global-config:
        db-config:
          logic-delete-field: flag
          logic-not-delete-value: 1
          logic-delete-value: 0
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # mybatis-plus Sql日志打印
      mapper-locations: /mapper/**/*.xml # mapper对应xml扫描路径
    
    • 启动类配置Mapper接口扫描
    @MapperScan("com.xiaolin.order.mapper")
    
    • 编写代码
    @Data
    @TableName("t_order")
    public class Order implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @TableId(value = "id", type = IdType.AUTO)
        private Integer id;
        private Integer productId;
        private Integer userId;
        private String orderNumber;
        private BigDecimal orderAmount;
        private Integer flag;
        private LocalDateTime createTime;
        private LocalDateTime updateTime;
    }
    
    
    public interface OrderMapper extends BaseMapper<Order> {
    }
    
    
  • storage服务整合Mybatis-Plus
    同理,请自行整合

  • 优化创建订单接口

    @GetMapping("/createOrder")
    public String createOrder(Order order) {
        return orderService.createOrder(order);
    }
   String createOrder(Order order);
   @Override
    public String createOrder(Order order) {
        // 创建订单
        order.setOrderNumber(UUID.randomUUID().toString());
        orderMapper.insert(order);
        // 扣减库存
        String reduceRes = storageClient.reduceStorage(order.getProductId());
        return "创建订单成功 == " + reduceRes;
    }
  • 优化扣减库存接口
  @Autowired
    private StorageMapper storageMapper;

    @GetMapping("/reduceStorage/{productId}")
    public String reduceStorage(@PathVariable Integer productId) {
        Storage storage = storageMapper.selectOne(new LambdaUpdateWrapper<Storage>().eq(Storage::getProductId, productId));
        storage.setQuantity(storage.getQuantity() - 1);
        storageMapper.updateById(storage);
        return "库存扣减成功";
    }
  • 重启order和storage服务

  • 测试正常情况
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 测试异常情况

    • 库存接口新增一行异常代码,模拟扣减库存失败
      int a=10/0;
    
    • 重启库存服务并测试
      在这里插入图片描述
      在这里插入图片描述

    我们发现订单创建成功但库存却扣减失败了,这明显不符合数据一致性原理,所以接下来我们引入分布式事务组件Seata,解决分布式环境数据库事务问题

整合Seata

  • 下载并解压Seata
    下载地址 Seata
  • 在seata配置文件conf/application.yml配置注册中心地址
seata:
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848
      group: SEATA_GROUP
      namespace:
      cluster: default
      username:
      password:
  • 启动seata server
    双击 bin/seata-server.bat
    可以看到seata server已注册到注册中心
    在这里插入图片描述

  • 在订单数据库和库存数据库新建表undo_log

CREATE TABLE IF NOT EXISTS `undo_log`
(
    `branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',
    `xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',
    `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
    `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
    `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
    `log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',
    `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';
ALTER TABLE `undo_log` ADD INDEX `ix_log_created` (`log_created`);
  • order服务和storage服务配置seata server
seata:
  registry:
    type: nacos
    nacos:
      application: seata-server # seate 服务端服务名
      server-addr: 127.0.0.1:8848
      group : SEATA_GROUP # seata 服务端分组名,请确保seata服务端与客户端的namespace和group一致
      namespace: # seata 服务端命名空间
      username:
      password:
      context-path:
  tx-service-group: default_tx_group
  service:
    vgroup-mapping:
      default_tx_group: default
  • order服务service接口添加全局事务注解
    在这里插入图片描述

  • 重启order和storage服务测试

测试后我们可以发现,即使库存服务扣减库存失败了,订单服务也会回滚订单数据,这样就保证了数据一致性了

整合熔断降级组件

以order服务为例

  • 下载sentinel控制台
    下载地址:sentinel控制台
  • 启动sentinel控制台
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar
  • 引入maven依赖
    <!--  熔断降级组件sentinel  -->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
  • 配置sentinel
spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8080 # sentinel 控制台地址
  • 编写获取订单列表接口
    @GetMapping("/getOrders")
    public String getOrders() {
        return orderService.getOrderList();
    }
    String getOrderList();
 	@SentinelResource(value = "getOrderList")  // 指定资源名并标识资源是否被限流、降级
    @Override
    public String getOrderList() {
        return "返回订单列表";
    }
  • 重启order服务
  • 访问getOrders接口
  • 访问sentinel控制台
    • 访问地址:http://localhost:8080/#/login
    • 用户名:sentinel
    • 密码:sentinel

可以看到order服务
在这里插入图片描述

  • 对getOrders接口添加流控规则
    在这里插入图片描述

    这样我们就新增了一个流控规则
    在这里插入图片描述

    • 测试

    每秒请求数超过2就会出现限流报错
    在这里插入图片描述

    • 优化报错提示
      service接口中编写熔断降级提示方法
        /**
         * 编写熔断降级提示
         * @param be
         * @return
         */
        public String getOrderListBlockHandler(BlockException be) {
            be.printStackTrace();
            return "触发熔断降级处理规则";
        }
    
    

    @SentinelResource注解指定getOrderListBlockHandler

    @SentinelResource(value = "getOrderList",blockHandler ="getOrderListBlockHandler")
    
    • 重启order服务

    限流报错提示友好了
    在这里插入图片描述

    • 优化异常提示
      如果接口运行时抛出异常了,这时候不会触发流控规则,而是会提示500错误,如下图我们模拟接口异常
      在这里插入图片描述

    • service接口中编写异常提示方法

        public String getOrderListFallback(Throwable t) {
            t.printStackTrace();
            return "触发异常处理规则";
        }
    
    • @SentinelResource注解指定getOrderListFallback
    @SentinelResource(value = "getOrderList",blockHandler = "getOrderListBlockHandler",fallback = "getOrderListFallback")
    
    • 重启order服务

    异常提示友好了
    在这里插入图片描述

  • 对getOrders接口添加熔断规则
    添加熔断规则跟添加限流规则类似,我这里就不展示啦

整合链路追踪组件

  • 下载zipkin
    下载地址:zipkin
  • 启动zipkin
java -jar zipkin.jar
  • order和storage服务引入maven依赖
<!--  健康监控配置  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--  链路追踪依赖  -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-tracing</artifactId>
        </dependency>
        <!--   micrometer-tracing-bridge-brave适配zipkin的桥接包  -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-tracing-bridge-brave</artifactId>
        </dependency>
        <!--  OpenZipkin Zipkin with Brave  -->
        <dependency>
            <groupId>io.zipkin.reporter2</groupId>
            <artifactId>zipkin-reporter-brave</artifactId>
        </dependency>
        <!--  micrometer-observation  -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-observation</artifactId>
        </dependency>
        <!--  feign-micrometer  -->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-micrometer</artifactId>
        </dependency>
  • order和storage服务配置micrometer-tracing和zipkin
management:
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans
  tracing:
    sampling:
      probability: 1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。
  • 重启order和storage服务
  • 访问创建订单接口
  • 访问zipkin
    • 访问地址:http://127.0.0.1:9411

点击找到一个痕迹页签,可以看到,创建订单经过了order服务和storage这两个服务,点击show还可以查看调用详情
在这里插入图片描述

点击依赖页面,可以看到order服务依赖于storage服务
在这里插入图片描述

首先,恭喜各位朋友坚持看完了教程。相信你们看完这个教程并动手实践一遍,以后就能轻松搭建一个Spring Cloud服务了。也希望朋友们可以多多关注、多多点赞收藏哦。谢谢大家啦

源码地址

spring cloud demo

参考来源

  • nacos官网
  • spring cloud openfeign
  • spring cloud gateway
  • seata官网
  • sentinel官网
  • micrometer官网
  • zipkin官网
  • 尚硅谷 Spring Cloud 教程

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

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

相关文章

Rust : windows下protobuf和压缩传输方案

此前dbpystream库是用python开发 web api。今天在rust中试用一下protobuf。 本文关键词&#xff1a;编译器、protobuf、proto文件、序列化、zstd压缩&#xff0c;build。 一、 protobuf编译器下载 具体见相关文章。没有编译器&#xff0c;protobuf无法运行。 windows参见&am…

多年不见,我美少女又回来了!

各位&#xff0c;可能很多人都不记得我了&#xff0c;上学的时候喜欢记学习笔记&#xff0c;好多学弟学妹们经常来我的博客看笔记&#xff0c;对于学习也有帮助。 时过境迁&#xff0c;生活中的琐事和繁忙的工作&#xff0c;真的自顾不暇… 还记得之前说要转型给大家分享内容运…

量产导入 | DFT和ATE概述

什么是DFT DFT(Design for Test),即可测性设计。 一切为了芯片流片后测试所加入的逻辑设计,都叫DFT。 DFT只是为了测试芯片制造过程中有没有缺陷,而不是用来验证芯片功能的,芯片功能的完善应该应该是在芯片开发过程用先进验证方法学去做的。 芯片制造过程相当复杂,工艺缺陷…

LabVIEW程序内存泄漏分析与解决方案

维护他人编写的LabVIEW程序时&#xff0c;若发现程序运行时间越长&#xff0c;占用内存越大直至崩溃&#xff0c;通常是内存泄漏导致的。本文从多角度分析内存泄漏的可能原因&#xff0c;包括数组和字符串处理、未释放的资源、循环中的对象创建等&#xff0c;并提供具体的解决方…

SamSung PM9B1 1TB性能实测

** SamSung PM9B1 1TB性能实测 ** 一颗主控一颗NAND FLASH 单面器件布局&#xff0c;PMIC集成电源芯片DC\DC模组 PCIE Gen4.0X4 性能3673MB2954MB 工作状态功耗4.1w左右&#xff0c;待机状态功耗1.2W左右 全盘读速度2000MB左右 H2缓内速度1.2G H2缓外速度730MB H2读速度1.3G …

牛客little w and Discretization

玩一下样例发现&#xff0c;只要找到mex就可以知道有((1-mex)的值)所在的位置离散化后和原本的值是一样的&#xff0c;所以询问区间的长度-&#xff08;1-mex&#xff09;有几个值就是答案&#xff0c;数据范围3e5&#xff0c;莫队值域分块求区间mex,计算1-mex有几个位置属于这…

mmdeploy环境部署流程

参考&#xff1a;mmdeploy/docs/zh_cn/01-how-to-build/linux-x86_64.md at main open-mmlab/mmdeploy (github.com) 从零入门《openmmlab》mmdeploy[1]环境安装及简单上手_哔哩哔哩_bilibili 我的环境&#xff1a; docker容器&#xff0c;ubuntu20.04&#xff0c;cuda11.7…

迁移学习助力机器学习实践应用

大家好&#xff0c;迁移学习是一种技术&#xff0c;能使机器利用从以前任务中获得的知识来提高对新任务的泛化能力。作为ChatGPT和Google Gemini等模型的核心原理&#xff0c;迁移学习在长文档总结、复杂文章撰写、旅行规划以及诗歌和歌曲创作等重要任务中发挥着关键作用。 本…

Docker 安装gitLab

目录 1. 安装 Docker 2. 拉取 GitLab 镜像 3. 创建并运行 GitLab 容器 4. 登录GitLab 修改下载地址 修改账号密码 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易…

解决关于git clone 带子模块的项目得到的源码不完整,导致编译失败的解决办法

在使用 git 克隆一个项目的时候&#xff0c;你可能会碰到克隆后编译失败的情况&#xff0c;经过查找&#xff0c;发现原来是缺少一些文件&#xff0c;这些文件都有一个特点&#xff0c;如图&#xff1a; 要解决这个问题&#xff0c;需要在clone 命令的基础上加上一些参数 &…

Nature Communications|基于离子导电和强力蚕丝纤维的智能感知纺织品 (柔性智能织物/可穿戴电子/柔性纤维传感/柔性电子)

2024年4月17日,清华大学张莹莹教授(Yingying Zhang)课题组,在《Nature Communications》上发布了一篇题为“Intelligent perceptual textiles based on ionicconductive and strong silk fibers”的论文。论文内容如下: 一、 摘要 将纺织品赋予感知功能,类似于人类皮肤,…

Linux--08---挂载分区

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.查看系统磁盘分区情况1.lsblk 查看2.fdisk -l 2.挂载未分区磁盘1. 创建分区2. 格式化分区3. 创建挂载点4. 挂载分区5. 更新 /etc/fstab6.验证挂载 3.修改挂载的磁…

0.18微米 BCD 工艺兼容的准垂直功率 DMOS 器件结构参数对 RON,sp 的影响

来源&#xff1a;Influence of Structure Parameters on the RON,sp of Quasi-Vertical Power DMOS Compatible with 0.18μm BCD Process&#xff08;ISPSD 24年&#xff09; 摘要 “Lateral double-diffused MOSFET (LDMOS)是应用于功率电子领域最常见的器件之一,得益于其可…

【论文】2405.Phased Consistency Model(港中文提出了AI绘画加速模型,一步采样生成图像,支持SD1.5,SDXL)

论文&#xff1a;https://arxiv.org/abs/2405.18407 &#xff08;2024.05.30发布&#xff09; 代码&#xff1a;https://github.com/G-U-N/Phased-Consistency-Model 一、论文要解决什么问题&#xff1f;效果如何&#xff1f; (需要先了解LCM模型) (阶段性一致性模型:朝着稳定…

express入门02静态资源托管

目录 1 搭建静态资源结构2 代码助手3 多目录托管4 服务器热启动总结 上一篇我们讲解了使用express搭建服务器的过程&#xff0c;服务器搭建好了之后&#xff0c;除了在地址栏里输入URL发起get请求或者post请求外&#xff0c;通常我们还需要访问静态资源&#xff0c;比如html、c…

一文看懂linux ext4文件系统工作原理

前言 Linux系统中的ext2、ext3、ext4 文件系统&#xff0c;它们都有很强的向后和向前兼容性&#xff0c;可以在数据不丢失的情况下进行文件系统的升级。目前ext4是一个相对较成熟、稳定且高效的文件系统&#xff0c;适用于绝大部分规模和需求的Linux环境。 ext4它突出的特点有&…

修改SubVI的LabVIEW默认搜索路径

在启动顶级VI后&#xff0c;LabVIEW可能会遇到找不到subVI的情况。这通常是由于subVI的路径发生了变化或没有被正确配置。 LabVIEW默认搜索路径 默认情况下&#xff0c;LabVIEW会按以下顺序搜索文件位置&#xff08;*表示LabVIEW将搜索子目录&#xff09;&#xff1a; <t…

PS系统教程15

仿制图章与修饰照片 仿制图章工具使用&#xff08;S&#xff09;使用方法&#xff1a;按住Alt键进行采样选定照片新建图层&#xff08;方便修改&#xff09;按住Alt键&#xff0c;进行吸取进行采样复制 下面那个石柱是我们复制的石柱 多余的部分用历史画笔工具涂抹掉一部分 案…

外汇天眼:Brighter Super 选择 State Street 作为托管和管理合作伙伴

State Street Corporation&#xff08;纽约证券交易所代码&#xff1a;STT&#xff09;今日宣布&#xff0c;其已被选为 Brighter Super 成员所投资的超过300亿澳元基金的托管人和管理员。 State Street 将为 Brighter Super 涵盖多种资产类别的130多个投资组合提供广泛的服务…

一文带你入门 - Qt绘图QPainter

QPaintEvent绘图事件: QPaintEvent 是 Qt 框架中一个重要的事件类&#xff0c;专门用于处理绘图事件。当 Qt 视图组件需要重绘自己的一部分时&#xff0c;就会产生 QPaintEvent 事件。这通常发生在以下几种情况&#xff1a; 1. 窗口第一次显示时&#xff1a;当窗口或控件第一次…