TX-LCN:分布式事务框架

news2024/10/6 12:22:58

文章目录

  • 概念
  • LCN模式
    • 创建父工程parent
    • 创建子工程TxManager: 管理事务
    • 创建子工程: Eureka Server 注册中心
    • 创建子工程: book: 被远程调用方
    • 创建子工程: student: 远程调用方
  • TCC模式
    • 在lcn的基础上创建子工程: redistest
    • 在student 调用 redistest

概念

TX-LCN由两大模块组成,TxClient、TxManager。
TxClient作为模块的依赖框架,提供了TX-LCN的标准支持,事务发起方和参与方都属于TxClient。TxManager作为分布式事务的控制方,控制整个事务。

1.创建事务组: 是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标识GroupId的过程。
2.加入事务组: 添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息通知给TxManager的操作。
3.通知事务组: 是指在发起方执行完业务代码以后,将发起方执行结果状态通知给TxManager,TxManager将根据事务最终状态和事务组的信息来通知相应的参与模块提交或回滚事务,并返回结果给事务发起方。

TX-LCN事务模式: Tx-LCN 5.0开始支持三种事务模式,分别是:LCN、TCC、TXC模式,每种模式在实际使用时有着自己对应的注解。
LCN:@LcnTransaction
TCC:@TccTransaction
TXC:@TxcTransaction

LCN模式

LCN模式是通过代理JDBC中Connection的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。
LCN模式适合能用JDBC连接的所有支持事务的数据库

测试思路:
开发两个微服务,注册在Eureka注册中心:

  • 微服务1:完成一个单表访问操作。新增和查询。一个学生可以有多个书籍
  • 微服务2:完成一个单表访问操作。新增和查询。一个书籍属于一个学生。
    添加学生同时添加书籍,两者同时完成或同时不完成

LcnTransaction - 当前方法使用TX-LCN框架的LCN模式,管理分布式事务。
所有的事务参与方,自动加入事务组。
如果事务参与方,使用的事务管理模式不一致,可以增加其他注解。

@LcnTransaction属性propagation可取值
DTXPropagation.REQUIRED:默认值,表示如果当前没有事务组创建事务组,如果有事务组,加入事务组。多用在事务发起方。
DTXPropagation.SUPPORTS:如果当前没有事务组以本地事务运行,如果当前有事务组加入事务组。多用在事务参与方法。

创建父工程parent

导入依赖:

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR12</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>

创建子工程TxManager: 管理事务

1.导入依赖:

    <dependencies>
        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-tm</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
    </dependencies>

2.properties文件配置,注意不是yml
注意: 其他项目加入事务,注册到这个项目中的端口号是,这个项目的tomcat端口号加100 (默认)或者自己手动指定tx-lcn.manager.port=7971

spring.application.name=TransactionManager
server.port=7970

# 操作事务组记录的连接在数据库中
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=fsfs

# 分布式锁实现在redis中
spring.redis.host=localhost

# TM服务器IP修改, TC访问TM时,使用的IP地址。必须精确匹配。默认127.0.0.1。代表TC和TM必须在同一个主机中。
tx-lcn.manager.host=127.0.0.1

# TM服务器日志系统配置,默认关闭日志系统。需要独立配置日志的存储数据库连接
tx-lcn.logger.enabled=false

# 修改登录密码,默认: codingapi
tx-lcn.manager.admin-key=fsfs

# TM事务管理端口。默认是server.port + 100计算得到。可以手动指定
# tx-lcn.manager.port=7971

# 配置TM服务器日志系统数据库连接
#tx-lcn.logger.driver-class-name=com.mysql.cj.jdbc.Driver
#tx-lcn.logger.jdbc-url=jdbc:mysql://localhost:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
#tx-lcn.logger.username=root
#tx-lcn.logger.password=fsfs


3.导入SQL
在依赖的资源txlcn-tm中,包含TxManager需要的数据库SQL脚本文件tx-manager.sql,可以查找并执行此脚本为TxManager创建需要的数据库表格。
在这里插入图片描述
脚本如下:

CREATE DATABASE IF NOT EXISTS  `tx-manager` DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
USE `tx-manager`;

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_tx_exception
-- ----------------------------
DROP TABLE IF EXISTS `t_tx_exception`;
CREATE TABLE `t_tx_exception`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `group_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `unit_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `mod_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `transaction_state` tinyint(4) NULL DEFAULT NULL,
  `registrar` tinyint(4) NULL DEFAULT NULL,
  `ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 待处理 1已处理',
  `remark` varchar(10240) NULL DEFAULT NULL COMMENT '备注',
  `create_time` datetime(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 967 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

4.启动类加注解@EnableTransactionManagerServer

@SpringBootApplication
@EnableTransactionManagerServer
public class ManagerApplicationStart {
    public static void main(String[] args) {
        SpringApplication.run(ManagerApplicationStart.class,args);
    }
}

5.启动并访问管理平台
通过浏览器访问 http://localhost:7970 。在界面中输入登录密码:bjsxt(默认密码是codingapi)。

创建子工程: Eureka Server 注册中心

创建Eureka Server 注册中心

创建子工程: book: 被远程调用方

1.导入依赖:

    <dependencies>
    向eureka注册
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        
        实体类所在模块
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>model</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        
        连接数据库
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        
        分步式事务相关
        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-txmsg-netty</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        分步式事务相关
        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-tc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
    </dependencies>

2.yml配置

server:
  port: 9999

spring:
  application:
    name: book
  datasource:
    url: jdbc:mysql://localhost:3306/test?charcterEncoding=utf8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: fsfs
eureka:
  client:
    service-url:
       defaultZone: http://localhost:8081/eureka/

# 配置TM服务器地址。格式是 ip:port。 ip和端口查看TM WEB控制台中的IP和端口。
tx-lcn:
  client:
    manager-address: 127.0.0.1:8070

3.被调用的代码:

controller
@RestController
public class BookController {
    @Autowired
    private BookService bookService;

    @RequestMapping("/insert")
    public void insert(){
        System.out.println("abc");
        bookService.insert(new Book(1,"abc",17));
    }
}

4.启动类加注解@EnableDistributedTransaction

@MapperScan("com.example.mapper")
@SpringBootApplication
@EnableDistributedTransaction
public class BookApplicationStart {
    public static void main(String[] args) {
        SpringApplication.run(BookApplicationStart.class,args);
    }
}

创建子工程: student: 远程调用方

1.导入依赖:

<dependencies>
		实体所在模块
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>model</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
		分步式事务相关
        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-txmsg-netty</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
	分步式事务相关
        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-tc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
    </dependencies>

2.yml配置文件

server:
  port: 8888

spring:
  application:
    name: student
  datasource:
    url: jdbc:mysql://localhost:3306/test?charcterEncoding=utf8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: fsfs

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8081/eureka/
      
# 配置TM服务器地址。格式是 ip:port。 ip和端口查看TM WEB控制台中的IP和端口。
tx-lcn:
  client:
    manager-address: 127.0.0.1:8070

3.远程调用

@Service
public class StuentServiceImpl implements StudentService {
    @Resource
    private StudentMapper studentMapper;

    @Autowired
    private BookOpenFeign bookOpenFeign;

    @Override
    @Transactional
    @LcnTransaction
    public void insert(Student zs) {
		//int a = 10/0;本地事务可以回滚
		
        studentMapper.insert(zs);
        
		//int a = 10/0;本地事务可以回滚

        bookOpenFeign.insert();//此处发生异常,则book的本地事务可以回滚book,异常抛到student本地事务可以回滚

        int a = 10/0;//student的本地事务可以回滚,但book无论如何都回滚不了,所以要使用分布式事务
    }
}

4.启动类加注解

@MapperScan("com.example.mapper")
@SpringBootApplication
@EnableFeignClients(basePackages = "com.example.service")
@EnableDistributedTransaction
public class StudentApplicatonStart {
    public static void main(String[] args) {
        SpringApplication.run(StudentApplicatonStart.class,args);
    }
}

5.执行
发现两个表中都没有添加数据

TCC模式

TCC事务不依赖资源管理器对XA的支持,而是通过对由业务系统提供的对业务逻辑的调度来实现分布式事务。
主要由三步操作:
Try:尝试执行业务(添加了@TccTransaction注解的方法)
Confirm:确认执行业务(确认方法作用编写提交事务的代码。当分布式事务执行成功时执行的方法,此方法需要程序员自己提供,自己维护。对于Mongo或Redis这种不支持事务的数据库都不去写此方法。)
Cancel:取消执行业务(需要程序员自己编写,自己维护,编写回滚事务的逻辑)。

  • 该模式对代码的侵入性高,要求每个业务需要写二个以上步骤的操作。
  • 该模式对有无本地事务控制都可以支持,使用面广。
  • 数据一致性控制几乎完全由开发者控制,对业务开发难度要求高。

总结:Tcc模式应用于所有不支持XA事务的软件。例如:Redis,Elasticsearch等。

在lcn的基础上创建子工程: redistest

1.导入依赖

<dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>model</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-txmsg-netty</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-tc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>model</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

2.yml配置:

server:
  port: 6666

spring:
  application:
    name: redistest
  datasource:
    url: jdbc:mysql://localhost:3306/test?charcterEncoding=utf8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: fsfs

  redis:
    host: localhost

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8081/eureka/
tx-lcn:
  client:
    manager-address: 127.0.0.1:8070

3.序列化器配置

@Configuration
public class PhoneManagerConfiguration {
    /**
     * redis连接工厂由spring-boot-starter-data-redis自动创建。
     * 根据配置文件,连接服务器。
     * @param factory
     * @return
     */
    protected RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String, Object> redisTemplate =
                new RedisTemplate<>();

        // 配置,访问Redis服务器时,如何序列化键值对数据对象。
        // key使用字符串序列化方式。就是字符串原值。
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // value使用JSON序列化方式。就是把Java对象,转换成JSON字符串并保存。
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        // hash数据的key序列化方案。字符串原值
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // hash数据的value序列化方案,JSON格式字符串
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

        // 设置Redis连接工厂
        redisTemplate.setConnectionFactory( factory );

        return redisTemplate;
    }
}

4.业务层配置
分布式事务参与方法,需要使用注解@TccTransaction注解修饰
建议:为提示开发者和后期的维护人员,当前方法有事务管理,
在方法上增加事务管理注解@Transactional。

使用TCC事务管理模式,做事务控制。
要求定义confirm和cancel方法。

confirm方法定义要求。实现事务提交逻辑。
方法名: 是 confirm + try方法名称首字母转大写
访问修饰符、参数表、返回值、抛出异常,和try方法一致

cancel方法定义要求。实现事务回滚逻辑
方法名: 是 cancel + try方法名称首字母转大写
访问修饰符、参数表、返回值、抛出异常,和try方法一致

@Service
public class RedisTestServiceImpl {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Transactional
    @TccTransaction(confirmMethod = "confirmShow",cancelMethod = "cancelShow")
    public void show(){
        redisTemplate.opsForValue().set("a","1");
    }
    public void confirmShow(){
        System.out.println("confirmShow");
    }
    public void cancelShow(){
        System.out.println("cancelShow");
    }
}

5.启动类配置加注解@EnableDistributedTransaction

@SpringBootApplication
@EnableDistributedTransaction
public class RedisApplicationStart {
    public static void main(String[] args) {
        SpringApplication.run(RedisApplicationStart.class,args);
    }
}

在student 调用 redistest

远程调用

@Service
public class StuentServiceImpl implements StudentService {
    @Resource
    private StudentMapper studentMapper;

    @Autowired
    private BookOpenFeign bookOpenFeign;
	
	@Autowired
    private RedisttestOpenFeign redisttestOpenFeign ;

    @Override
    @Transactional
    @LcnTransaction
    public void insert(Student zs) {
		//int a = 10/0;本地事务可以回滚
		
        studentMapper.insert(zs);
        
		//int a = 10/0;本地事务可以回滚

        bookOpenFeign.insert();//此处发生异常,则book的本地事务可以回滚book,异常抛到student本地事务可以回滚

		redisttestOpenFeign .insert();//此处发生异常,使用@TccTransaction(confirmMethod = "confirmShow",cancelMethod = "cancelShow")

        int a = 10/0;//student的本地事务可以回滚,但book无论如何都回滚不了,所以要使用分布式事务,非jdbc,使用@TccTransaction(confirmMethod = "confirmShow",cancelMethod = "cancelShow")
    }
}

执行该方法:
控制台打印: cancelShow

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

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

相关文章

设计模式:行为型模式 - 策略模式

文章目录 1.概述2.结构3.案例实现4.优缺点5.使用场景6.JDK源码解析 1.概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然…

基于SpringBoot医养中心管理系统

有需要请私信或看评论链接哦 可远程调试 SpringBoot医养中心管理系统 一 介绍 基于SpringBoot医养中心管理系统-登录角色分为用户和管理员。用户登录后可查看个人信息/家人情况&#xff0c;生活情况和收费标准。管理员登录后台可进行账号管理&#xff0c;健康管理&#xff0c…

如何在Android面试中脱颖而出,高频Android面试题解析,帮你快速拿到Offer

Android面试就“小技巧” 了解自己的技能水平&#xff1a;在面试前&#xff0c;确保你对所面试的职位的技能要求有足够的了解&#xff0c;并检查自己的技能水平是否符合这些要求。熟悉面试流程&#xff1a;了解面试过程中可能会遇到的问题&#xff0c;并为每个问题准备好回答。…

itop-3568开发板驱动学习笔记(20)中断线程化

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 中断线程化简介中断线程化 API中断线程化实验 中断线程化简介 中断线程化也是中断下文的一种方式&#xff0c;与工作队列和软中断不同的是&#xff0c;中断线程只用于这个中断&#xff0c;当发生中断的时候…

Java基于POI动态合并单元格

Java使用poi导出excel 前言1.Excel和POI对象对应关系&#xff1a;2.POI创建Excel的步骤 一、引入依赖二、示例1.准备数据2.创建Excel工作簿对象3.给excel创建表头4.填充数据5.浏览器访问下载excel6.完整代码 前言 有个需求需要后端将数据导出为excel。并且excel中需要合并单元格…

linux安装java1.8

前言 安装java1.8是为了适配pyspark&#xff0c; 出现错误&#xff1a;pyspark.sql.utils.IllegalArgumentException: Unsupported class file major version 55\56\57\60 通过“java -version”看一下java版本&#xff0c;发现版本是java11&#xff0c;应该安装1.8才对 1、…

GaussDB工作级开发者认证—第二章GaussDB数据库应用程序开发指引

一. 驱动概述 GaussDB客户端接入认证&#xff0c;GaussDB支持以下三种认证方式&#xff1a;基于主机的认证口令认证SSL加密 二. JDBC接口介绍 1. JDBC概述 Java数据库连接&#xff08;JDBC&#xff09;是Java标准&#xff0c;它提供了从Java连接到关系数 据库的接口&#x…

C++智能指针shared_ptr详解

智能指针shared_ptr详解 一、简介二、底层原理2.1、引用计数2.2、shared_ptr的构造和析构2.3、shared_ptr的共享和拷贝2.4、循环引用问题 三、shared_ptr的使用3.1、创建一个shared_ptr3.2、共享一个shared_ptr3.3、使用删除器3.4、解除关联 四、使用示例总结 一、简介 C智能指…

软件测试拿了几个20K offer,分享一波面经

1、你的测试职业发展是什么?  测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&#xff0c;不…

MySQL笔记-函数,约束

本文标签 : 数据库函数 约束 目录 一、函数 1.字符串函数. 2.数值函数. 3.日期函数. 4.流程函数 二、约束 1.概述 2.约束演示 3.外键约束 1.概念 : 2. 实现: 3.删除/更新行为: 三、总结 一、函数 1.字符串函数. 实现: -- 函数演示 ---- 语法: select 函数(参数);-- …

跨域和网关通俗小白理解

跨域 跨域就是协议域名端口不同的服务器不能互相请求&#xff0c;企业级解决办法一般是通过Nginx反向代理实现 我们服务&#xff0c;线上都是通过S3服务器的Nginx反向代理解决跨域问题&#xff0c;因为Nginx和服务端沟通属于服务器之间的问题&#xff0c;不像浏览器有同源策略…

哇塞,炫云的智能优化太厉害啦!渲染费用竟然大幅降低了!

你有没有遇到过因为设置参数错误而导致云渲染费用突然飙升的情况呢&#xff1f;或者不知道自己设置的参数是否过高&#xff1f;现在&#xff0c;这些问题都可以轻松解决了&#xff0c;因为炫云的渲染质量功能非常智能和人性化。根据不同用户需求&#xff0c;它将参数优化分为五…

二进制部署nacos、docker部署nacos、k8s部署nacos、helm部署nacos

目录 前言Nacos支持三种部署模式官方文档二进制部署nacos&#xff08;单机模式&#xff09;安装jdk创建数据库及用户名下载安装包并解压导入nacos的表结构修改配置文件&#xff0c;启动nacos&#xff0c;登录nacos 二进制部署nacos&#xff08;cluster模式&#xff09;安装jdk&…

干货 | 什么是高频电解电容,它有普通电解电容有什么区别?

高频电解电容是一种常见的电容器&#xff0c;它在高频电路中发挥着重要的作用。与普通电解电容不同&#xff0c;高频电解电容能够更好地适应高频电路的需求&#xff0c;具有更高的频率响应和更低的ESR&#xff08;等效串联电阻&#xff09;。 电解电容重要性&#xff1a;电解电…

射频功率放大器在超声换能器声场特性校准中的应用

实验名称&#xff1a;基于水听器法的超声换能器声场特性校准技术的研究 研究方向&#xff1a;超声换能器 测试目的&#xff1a; 超声无损检测是无损检测领域重要的技术之一&#xff0c;而换能器作为超声检测中的关键部件&#xff0c;广泛应用于工业检测和医用超声成像领域。其性…

opencv配置安装

opencv配置安装 1、安装方式 https://blog.csdn.net/qq_45022687/article/details/120241068 根据这个网址的配置进行安装 2、解编译 mutex/thread等 似乎因为mingw的问题,#include 等直接引入线程无法直接引用&#xff0c;这导致了原有代码中直接使用mutex/thread的部分需要…

关于ARM核心板、一体板、底板的知识分享

嵌入式处理器模组&#xff0c;又称嵌入式核心板&#xff0c;或为CPU模组/核心板/SOM&#xff08;System on Module)&#xff0c;它是包含处理系统的核心电子部件的子电路板&#xff0c;集成了主芯片、存储器&#xff08;eMMC/Nand Flash)、运行内存&#xff08;DDR&#xff09;…

太神奇了,1984 年的电脑也能跑 Chat-GPT

新加坡的逆向计算爱好者 Yeo Kheng Meng 发布了一个 “doschgpt” ChatGPT 客户端&#xff0c;这个客户端适用于上世纪八十年代的 MS-DOS 系统。 目前这个 DOS 系统的 ChatGPT 客户端已成功在 1984 年的 IBM 5155 便携式 PC 上运行&#xff0c;这台机子配备 4.77Mhz 主频的 In…

孤儿僵尸守护进程基本概念与使用

文章目录 前言孤儿进程僵尸进程守护进程总结 前言 孤儿进程、僵尸进程和守护进程是操作系统中的概念&#xff0c;它们分别表示不同的进程状态和特性。孤儿进程和僵尸进程了解了解(都是为守护进程做铺垫)&#xff0c;但是对于守护进程大家还是可以好好学习学习&#xff0c;相信…

人民满意手机银行服务白皮书——服务分析篇

易观&#xff1a;商业银行积极践行“金融为民”&#xff0c;坚持“以用户为中心”的发展理念&#xff0c;从全客群、全服务、全渠道推动金融服务触达广大人民群众。其中&#xff0c;手机银行作为服务及经营主阵地&#xff0c;是人民群众获取金融服务的超级入口及服务平台。 “以…