【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结

news2024/10/6 1:34:17

文章目录

  • 1. 自定义封装springboot-starter案例
    • 1.1 自定义starter分析
    • 1.2 自定义starter实现
    • 1.3 自定义starter测试
  • 2. SpringBoot优势
    • 2.1 SpringBoot监控
      • 2.1.1 Actuator
      • 2.1.2 Springboot-Admin
    • 2.2 小结
  • 3. Web后端开发总结

1. 自定义封装springboot-starter案例

1.1 自定义starter分析

所谓starter指的就是SpringBoot当中的起步依赖。自定义 starter 起步依赖是因为在实际的项目开发当中,可能会用到很多第三方的技术,并不是所有的第三方的技术官方都提供了与SpringBoot整合的starter起步依赖,但是这些技术又非常的通用,在很多项目组当中都在使用。

业务场景:

  • 前面案例当中所使用的阿里云OSS对象存储服务,现在阿里云的官方是没有提供对应的起步依赖的,这个时候使用起来就会比较繁琐,需要引入对应的依赖。还需要在配置文件当中进行配置,还需要基于官方SDK示例来改造对应的工具类,在项目当中才可以进行使用。
  • 当前项目当中使用了阿里云OSS,需要进行这么多步的操作。在别的项目组当中要想使用阿里云OSS,也需要进行这么多步的操作,所以这个时候就可以自定义一些公共组件,在这些公共组件当中,就可以提前把需要配置的bean都提前配置好。将来在项目当中,要想使用这个技术,直接将组件对应的坐标直接引入进来,就已经自动配置好了,直接使用就可以了。也可以把公共组件提供给别的项目组进行使用,这样就可以大大的简化开发。

在SpringBoot项目中,一般都会将这些公共组件封装为SpringBoot当中的starter,也就是所说的起步依赖。
请添加图片描述

  • SpringBoot官方starter命名: spring-boot-starter-xxxx

  • 第三组织提供的starter命名: xxxx-spring-boot-starter
    请添加图片描述

Mybatis提供了配置类,并且也提供了springboot会自动读取的配置文件。当SpringBoot项目启动时,会读取到spring.factories配置文件中的配置类并加载配置类,生成相关bean对象注册到IOC容器中。

结果:可以直接在SpringBoot程序中使用Mybatis自动配置的bean对象。

在自定义一个起步依赖starter的时候,按照规范需要定义两个模块:

  1. starter模块(进行依赖管理[把程序开发所需要的依赖都定义在starter起步依赖中])
  2. autoconfigure模块(自动配置)

将来在项目当中进行相关功能开发时,只需要引入一个起步依赖就可以了,因为它会将autoconfigure自动配置的依赖给传递下来。

自定义starter的案例

需求:自定义aliyun-oss-spring-boot-starter,完成阿里云OSS操作工具类AliyunOSSUtils的自动配置。

目标:引入起步依赖引入之后,要想使用阿里云OSS,注入AliyunOSSUtils直接使用即可。

之前阿里云OSS的使用:

  • 配置文件
#配置阿里云OSS参数
aliyun:
  oss:
    endpoint: https://oss-cn-shanghai.aliyuncs.com
    accessKeyId: ***
    accessKeySecret: ***
    bucketName: ***
  • AliOSSProperties类
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
    //区域
    private String endpoint;
    //身份ID
    private String accessKeyId ;
    //身份密钥
    private String accessKeySecret ;
    //存储空间
    private String bucketName;
}

  • AliOSSUtils工具类
@Component //当前类对象由Spring创建和管理
public class AliOSSUtils {
    @Autowired
    private AliOSSProperties aliOSSProperties;

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile multipartFile) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = multipartFile.getInputStream();

        // 避免文件覆盖
        String originalFilename = multipartFile.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(aliOSSProperties.getEndpoint(),
                aliOSSProperties.getAccessKeyId(), aliOSSProperties.getAccessKeySecret());
        ossClient.putObject(aliOSSProperties.getBucketName(), fileName, inputStream);

        //文件访问路径
        String url =aliOSSProperties.getEndpoint().split("//")[0] + "//" + aliOSSProperties.getBucketName() + "." + aliOSSProperties.getEndpoint().split("//")[1] + "/" + fileName;

        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }
}

当在项目当中要使用阿里云OSS,就可以注入AliOSSUtils工具类来进行文件上传。但这种方式其实是比较繁琐的。

所以就可以制作一个公共组件(自定义starter)。starter定义好之后,将来要使用阿里云OSS进行文件上传,只需要将起步依赖引入进来之后,就可以直接注入AliOSSUtils使用了。

具体的实现步骤:

  • 第1步:创建自定义starter模块(进行依赖管理)
    • 把阿里云OSS所有的依赖统一管理起来
  • 第2步:创建autoconfigure模块
    • 在starter中引入autoconfigure (我们使用时只需要引入starter起步依赖即可)
  • 第3步:在autoconfigure中完成自动配置
    1. 定义一个自动配置类,在自动配置类中将所要配置的bean都提前配置好
    2. 定义配置文件,把自动配置类的全类名定义在配置文件中

1.2 自定义starter实现

首先我们先来创建两个Maven模块:

1). aliyun-oss-spring-boot-starter模块
请添加图片描述
请添加图片描述

创建完starter模块后,删除多余的文件,最终保留内容如下:
请添加图片描述

删除pom.xml文件中多余的内容后:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.11</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.aliyun.oss</groupId>
	<artifactId>aliyun-oss-spring-boot-starter</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<properties>
		<java.version>11</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
	</dependencies>

</project>

2). aliyun-oss-spring-boot-autoconfigure模块
请添加图片描述
请添加图片描述

创建完starter模块后,删除多余的文件,最终保留内容如下(其中test文件也可以删除):
请添加图片描述

删除pom.xml文件中多余的内容后:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.11</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.aliyun.oss</groupId>
	<artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<properties>
		<java.version>11</java.version>
	</properties>

	<dependencies>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
     </dependency>
	</dependencies>

</project>

需要在starter模块中来引入autoconfigure这个模块的。打开starter模块中的pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.11</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.aliyun.oss</groupId>
	<artifactId>aliyun-oss-spring-boot-starter</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<properties>
		<java.version>11</java.version>
	</properties>

	<dependencies>
		<!--引入autoconfigure模块-->
		<dependency>
			<groupId>com.aliyun.oss</groupId>
			<artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
	</dependencies>

</project>

前两步已经完成了,接下来是最关键的就是第三步:在autoconfigure模块当中来完成自动配置操作。

将之前案例中所使用的阿里云OSS部分的代码直接拷贝到autoconfigure模块下,进行改造。
请添加图片描述

拷贝过来后,还缺失一些相关的依赖,需要把相关依赖也拷贝过来:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.11</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.aliyun.oss</groupId>
	<artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<properties>
		<java.version>11</java.version>
	</properties>

	<dependencies>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
     </dependency>

		<!--引入web起步依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!--Lombok-->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>

		<!--阿里云OSS-->
		<dependency>
			<groupId>com.aliyun.oss</groupId>
			<artifactId>aliyun-sdk-oss</artifactId>
			<version>3.15.1</version>
		</dependency>

		<dependency>
			<groupId>javax.xml.bind</groupId>
			<artifactId>jaxb-api</artifactId>
			<version>2.3.1</version>
		</dependency>
		<dependency>
			<groupId>javax.activation</groupId>
			<artifactId>activation</artifactId>
			<version>1.1.1</version>
		</dependency>
		<!-- no more than 2.3.3-->
		<dependency>
			<groupId>org.glassfish.jaxb</groupId>
			<artifactId>jaxb-runtime</artifactId>
			<version>2.3.3</version>
		</dependency>
	</dependencies>
</project>

请添加图片描述
请添加图片描述

在类上添加的@Component注解没用了。 在SpringBoot项目中,并不会去扫描com.aliyun.oss这个包,不扫描这个包那类上的注解也就失去了作用,可以从类上删除了。删除后报红色错误,暂时不理会,后面再来处理。
请添加图片描述

删除AliOSSUtils类中的@Component注解、@Autowired注解
请添加图片描述

定义一个自动配置类了,在自动配置类当中来声明AliOSSUtils的bean对象。
请添加图片描述

AliOSSAutoConfiguration类:

@Configuration//当前类为Spring配置类
@EnableConfigurationProperties(AliOSSProperties.class)//导入AliOSSProperties类,并交给SpringIOC管理
public class AliOSSAutoConfiguration {


 //创建AliOSSUtils对象,并交给SpringIOC容器
 @Bean
 public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties){
     AliOSSUtils aliOSSUtils = new AliOSSUtils();
     aliOSSUtils.setAliOSSProperties(aliOSSProperties);
     return aliOSSUtils;
 }
}

AliOSSProperties类:

/*阿里云OSS相关配置*/
@Data//如果不使用idea或者没安装Lombok插件,可以手动getter/setter
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
 //区域
 private String endpoint;
 //身份ID
 private String accessKeyId ;
 //身份密钥
 private String accessKeySecret ;
 //存储空间
 private String bucketName;
}

AliOSSUtils类:

@Data //如果不使用idea或者没安装Lombok插件,可以手动getter/setter
public class AliOSSUtils {
 private AliOSSProperties aliOSSProperties;

 /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile multipartFile) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = multipartFile.getInputStream();

        // 避免文件覆盖
        String originalFilename = multipartFile.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(aliOSSProperties.getEndpoint(),
                aliOSSProperties.getAccessKeyId(), aliOSSProperties.getAccessKeySecret());
        ossClient.putObject(aliOSSProperties.getBucketName(), fileName, inputStream);

        //文件访问路径
        String url =aliOSSProperties.getEndpoint().split("//")[0] + "//" + aliOSSProperties.getBucketName() + "." + aliOSSProperties.getEndpoint().split("//")[1] + "/" + fileName;

        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }
}

在aliyun-oss-spring-boot-autoconfigure模块中的resources下,新建自动配置文件:

  • META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

    com.aliyun.oss.AliOSSAutoConfiguration
    

请添加图片描述

1.3 自定义starter测试

创建测试工程springboot-autoconfiguration-test
请添加图片描述

测试前准备:

  1. 在test工程中引入阿里云starter依赖

    • 通过依赖传递,会把autoconfigure依赖也引入了
    <!--引入阿里云OSS起步依赖-->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-oss-spring-boot-starter</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    
  2. 在test工程中的application.yml文件中,配置阿里云OSS配置参数信息(从以前的工程中拷贝即可)

    #配置阿里云OSS参数
    aliyun:
      oss:
        endpoint: https://oss-cn-shanghai.aliyuncs.com
        accessKeyId: ***
        accessKeySecret: ***
        bucketName: ***
    
  3. 在test工程中的UploadController类编写代码

    @RestController
    public class UploadController {
    
        @Autowired
        private AliOSSUtils aliOSSUtils;
    
        @PostMapping("/upload")
        public String upload(MultipartFile image) throws Exception {
            //上传文件到阿里云 OSS
            String url = aliOSSUtils.upload(image);
            return url;
        }
    
    }
    

编写完代码后,启动当前的SpringBoot测试工程:

  • 随着SpringBoot项目启动,自动配置会把AliOSSUtils的bean对象装配到IOC容器中
    请添加图片描述

用postman工具进行文件上传:
请添加图片描述

通过断点可以看到自动注入AliOSSUtils的bean对象:
请添加图片描述

如果@Autowired注解存在error,实际上没有报错,可以讲error提示改为warn提示。光标在错误上鼠标右键,如下所示:
请添加图片描述
请添加图片描述

2. SpringBoot优势

  • 起步依赖
  • 自动配置
  • 辅助功能
    • 内嵌的web服务器
    • 项目监控功能

2.1 SpringBoot监控

2.1.1 Actuator

介绍

由springboot官方提供的监控功能,以json格式,展示监控信息

使用步骤

  • 导入依赖坐标
  • 做配置
    • 开启详细的健康功能
    • 开启其他监控功能
management:
	endpoint:
		health:
			show-details: always
	endpoints:
		web:
			exposure:
				include: '*'

2.1.2 Springboot-Admin

第三方基于actuator所封装监控功能,可以以图形化页面的形式展示监控信息。内部是一个服务端+客户端的模型
请添加图片描述

2.2 小结

请添加图片描述

3. Web后端开发总结

web后端开发现在基本上都是基于标准的三层架构进行开发的,在三层架构当中,Controller控制器层负责接收请求响应数据,Service业务层负责具体的业务逻辑处理,而Dao数据访问层也叫持久层,就是用来处理数据访问操作的,来完成数据库当中数据的增删改查操作。
请添加图片描述

在三层架构当中,前端发起请求首先会到达Controller(不进行逻辑处理),然后Controller会直接调用Service 进行逻辑处理, Service再调用Dao完成数据访问操作。

如果在执行具体的业务处理之前,需要去做一些通用的业务处理,比如:要进行统一的登录校验,要进行统一的字符编码等这些操作时,就可以借助于Javaweb当中三大组件之一的过滤器Filter或者是Spring当中提供的拦截器Interceptor来实现。
请添加图片描述

为了实现三层架构层与层之间的解耦,学习了Spring框架当中的第一大核心:IOC控制反转与DI依赖注入。

所谓控制反转,指的是将对象创建的控制权由应用程序自身交给外部容器,这个容器就是我们常说的IOC容器或Spring容器。

而DI依赖注入指的是容器为程序提供运行时所需要的资源。

除了IOC与DI还讲到了AOP面向切面编程,还有Spring中的事务管理、全局异常处理器,以及传递会话技术Cookie、Session以及新的会话跟踪解决方案JWT令牌,阿里云OSS对象存储服务,以及通过Mybatis持久层架构操作数据库等技术。
请添加图片描述
请添加图片描述

Filter过滤器、Cookie、 Session这些都是传统的JavaWeb提供的技术。
JWT令牌、阿里云OSS对象存储服务,是现在企业项目中常见的一些解决方案。
IOC控制反转、DI依赖注入、AOP面向切面编程、事务管理、全局异常处理、拦截器等,这些技术都是 Spring Framework框架当中提供的核心功能。
Mybatis就是一个持久层的框架,是用来操作数据库的。

在Spring框架的生态中,对web程序开发提供了很好的支持,如:全局异常处理器、拦截器这些都是Spring框架中web开发模块所提供的功能,而Spring框架的web开发模块,也称为:SpringMVC
请添加图片描述

SpringMVC不是一个单独的框架,它是Spring框架的一部分,是Spring框架中的web开发模块,是用来简化原始的Servlet程序开发的。

外界俗称的SSM,就是由:SpringMVC、Spring Framework、Mybatis三块组成。

基于传统的SSM框架进行整合开发项目会比较繁琐,而且效率也比较低,所以在现在的企业项目开发当中,基本上都是直接基于SpringBoot整合SSM进行项目开发的。

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

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

相关文章

chatgpt赋能Python-python3怎么下载安装

Python 3的下载安装方法 Python 3是一种高级编程语言&#xff0c;具有简单易学、基本语法易于理解、大量的第三方库支持等特点&#xff0c;适用于各种软件开发项目。本文将教您如何下载和安装Python 3。 下载Python3 首先您需要在官网https://www.python.org/downloads/上下…

【新星计划·2023】单臂理由的原理讲解

单臂路由是指在路由器的一个接口上通过配置子接口的方式&#xff0c;实现原来互相隔离的VLAN之间可以互相通信。 一、单臂路由概述 网络中通过VLAN技术来实现隔离广播、方便管理及提高安全性等功能&#xff0c;一旦划分VLAN后&#xff0c;同—VLAN之间可以相互通信&#xff0…

一、通过命令行体验长安链

一、通过命令行体验长安链 1 、概述2、环境依赖2.1、硬件依赖2.2、软件依赖2.3、git安装2.4、golang安装2.5、gcc 3、环境搭建3.1、源码下载3.2、 源码编译3.3、编译及安装包制作3.4、启动节点集群3.5、查看节点启动使用正常 4、使用CMC命令行工具部署、调用合约4.1、编译&…

jenkins pipeline如何在一个任务中触发另外一个任务以及从下游任务获取文件

1、 前言 我们在创建jenkins任务的时候&#xff0c;有时候一个任务需要调用多个子任务来完成。比如&#xff0c;我们在编译某个镜像的时候&#xff0c;镜像由多个组件构成。那么我们就可以创建一个主任务以及多个子任务&#xff0c;主任务负责调用每个子任务&#xff0c;并将每…

PySide6/PyQT多线程之 线程池的基础概念和最佳实践

前言 在PySide6/PyQT 多线程编程中&#xff0c;线程池也是重要的一项知识点&#xff0c;线程池是一种高效管理和调度多个线程执行任务的方式。 通过结合线程池&#xff08;QThreadPool&#xff09;和任务类&#xff08;QRunnable&#xff09;&#xff0c;可以轻松地实现并发执行…

【分布族谱】正态分布和卡方分布的关系

文章目录 正态分布卡方分布卡方分布的极限 正态分布 正态分布&#xff0c;最早由棣莫弗在二项分布的渐近公式中得到&#xff0c;而真正奠定其地位的&#xff0c;应是高斯对测量误差的研究&#xff0c;故而又称Gauss分布。。测量是人类定量认识自然界的基础&#xff0c;测量误差…

FFmpeg命令实战(上)

标题 1.FFmpeg命令行环境搭建2.ffmpeg,ffplay和ffprobe的区别3.ffmpeg处理流程4.ffmpeg命令分类查询5.ffplay播放控制6.ffplay命令选项 1.FFmpeg命令行环境搭建 1.到达FFmpeg的github,选择下载需要的版本,这里以windows举例。 这里有两个压缩包&#xff0c;ffmpeg-master-lat…

Flutter 笔记 | Flutter Native 插件开发 (Android)

oh, 我亲爱的朋友&#xff0c;很高兴你来到了这里&#xff01;既然来了&#xff0c;那么就让我们在这篇糟糕的烂文章中&#xff0c;一起来学习一下&#xff0c;如何在一个糟糕的 Flutter 混合应用中开发一个糟糕的 Android Native 烂插件吧&#xff01;&#x1f611; 首先&…

研报精选230519

目录 【行业230519头豹研究院】2023年中国产后康复设备行业词条报告 【行业230519山西证券】有色金属行业周报&#xff1a;锂价快速回升&#xff0c;释放锂电行业复苏信号 【行业230519头豹研究院】2023年中国氢能重卡行业词条报告 【个股230519西南证券_森麒麟】腾飞的高端轮胎…

网页外包开发的测试方法及工具

网页开发的软件项目完成代码开发后需要进行全面的测试&#xff0c;这是正规的软件公司开发软件项目必须要做的工作&#xff0c;这方面有不少好用的工具供大家使用。今天和大家分享这方面的知识&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件…

Elasticsearch实战之处理邮件附件进行进行内容全文检索

目录 一、系统环境和软件要求 二、软件说明 三、定义文本抽取管道(pipeline) 四、建立索引设置文档结构映射 五、插入文档 六、查询文档 需求是将本地邮件内容以及PDF&#xff0c;EXCEL&#xff0c;WORD等附件内容进行处理&#xff0c;保存到ES数据库&#xff0c;实现邮件…

【I2C 通信的工作原理是什么?Arduino 和 I2C 教程】

【I2C 通信的工作原理是什么?Arduino 和 I2C 教程】 1. 概述2. I2C 的工作原理3. I2C 协议4. 例程5. Arduino I2C 代码在本教程中,我们将了解 I2C 通信协议的工作原理,我们还将使用 Arduino 板和使用该协议的传感器制作一个实际示例。您可以观看以下视频或阅读下面的书面教程…

chatgpt赋能Python-python3虚拟环境搭建

Python3虚拟环境搭建&#xff1a;介绍和步骤 Python是一门非常强大的编程语言&#xff0c;因此在许多不同类型的项目中都广泛使用。但是&#xff0c;不同项目可能需要使用不同版本的Python库和依赖项。这就是使用Python的虚拟环境的重要性&#xff0c;可以避免不同项目之间的冲…

「实验记录」MIT 6.824 Raft Lab2B Log Replication

#Lab2B - Log Replication I. SourceII. My CodeIII. MotivationIV. SolutionS1 - leader上任即初始化S2 - leader发送AppendEntriesS3 - follower接收AppendEntriesS4 - leader收到AppendEntries 回信S5 - candidate选举限制S6 - defs.go约定俗成和实现Start() V. Result I. S…

yolov7结构改进策略解析

论文链接&#xff1a;https://arxiv.org/abs/2207.02696 代码链接&#xff1a;https://github.com/WongKinYiu/yolov7 具体分割如何训练&#xff0c;请参考我之前的博客论文&#xff1a; https://blog.csdn.net/qq_41920323/article/details/129464115?spm1001.2014.3001.5502…

联用多个插件可以让 GPT-4 的能力更加强大,实现更加复杂的操作

&#x1f680; 联用多个插件可以让 GPT-4 的能力更加强大&#xff0c;实现更加复杂的操作。 联用多个插件可以让 GPT-4 的能力更加强大&#xff0c;实现更加复杂的操作。 不过&#xff0c;使用插件和联网功能也有一些要注意的地方。 首先是安全性问题&#xff0c;特别是像购…

Burpsuite模块—-Intruder模块详解

一、简介 Burp Intruder是一个强大的工具&#xff0c;用于自动对Web应用程序自定义的攻击&#xff0c;Burp Intruder 是高度可配置的&#xff0c;并被用来在广范围内进行自动化攻击。你可以使用 Burp Intruder 方便地执行许多任务&#xff0c;包括枚举标识符&#xff0c;获取有…

Kali-linux密码在线破解

为了使用户能成功登录到目标系统&#xff0c;所以需要获取一个正确的密码。在Kali中&#xff0c;在线破解密码的工具很多&#xff0c;其中最常用的两款分别是Hydra和Medusa。本节将介绍使用Hydra和Medusa工具实现密码在线破解。 8.1.1 Hydra工具 Hydra是一个相当强大的暴力密…

浅谈分布式事物解决方案

目录 背景 1 XA规范分布式事物方案 1.1 俩阶段提交&#xff08;2PC&#xff09; 1.2 三阶段提交&#xff08;3PC&#xff09; 2 补偿事务&#xff08;TCC&#xff09; 3 可靠消息最终一致性方案 4 可靠消息最终一致性方案 5 SAGA事物 6 Seata AT 模式 背景 分布式事务出现…

使用Git-lfs上传超过100m的大文件到GitHub

文章目录 1. 安装 git-lfs2. 在Git中安装git-ifs3. 找到工程中的所有大文件4.执行完这行命令&#xff0c;项目目录下会生成文件 .gitattributes&#xff0c;此时Git push将 .gitattributes 提交到远程仓库。 5. 需要注意的事 1. 安装 git-lfs Git Large File Storage | Git La…