SpringCloud中服务间通信(应用间通信)-亲测有效-源码下载-连载2
1、微服务概述
本案例主要解决微服务之间的相互调用问题
如果已经理解什么是微服务,可以直接跳到实战。
本案例采用springBoot3.1.7+springCloud2022.0.4版本测试
本案例使用springboot2.7.x版本测试代码相同

1、微服务是分布式架构,那么为什么要需要使用分布式架构?
因为单体服务是将所有的模块都放在一个项目中,这种架构部署简单,维护方便,但是随着功能的增加各个模块之间的边界会越来越模糊(即使各个模块的融合会越来越密切),这就造成了一个问题如当修改订单服务的时候,可能会影响到商品系统、短信系统等,使程序的维护性降低等。且单体服务有性能瓶颈,越来越无法满足当今的互联网工程,这就出现了微服务。
2、微服务和springCloud之间的关系?
如果说springCloud就是微服务这是不正确的,springCloud其实是一个工具集,将解决微服务中出现的各种问题的插件集成到一起,形成了一个整套的解决方案,这些解决方案偏向于服务治理等。
除此之外还有很多的其他工具如springCloudAlibaba等,都是很好的解决微服务问题的工具。
3、什么是微服务?
微服务就是一种分布式架构,本质就是将单体服务拆分中一个一个的独立运行的小工程,这些小的工程如订单系统、商品系统等运行在不同的服务器中,这些独立运行的小工程就是微服务。
使用了微服务之后我们需要解决一些列的问题?
问题1:微服务之间怎么知道彼此的存在,我们可以通过注册中心将每个微服务的信息注册到注册中心,注册中心可以使用Eureka或Nacos等。
问题2:各个独立运行的微服务之间如何进行通信,我们可以使用RestTemplate或openfeign
问题3:当微服务特别多的时候,各个微服务都有配置文件,如何统一管理这些配置文件,我们可以使用配置中心,将配置都放置在同一个地方如git中,通过配置中心统一加载。
问题4:使用了微服务之后,就会出现在分布式系统下的一些问题,如分布式的id,分布式锁,分布式事务等问题,我们需要使用到分布式相关的技术。
问题5:使用了微服务之后,一个项目会出现很多的微服务,这个时候项目的部署是一个非常麻烦的事情,为了方便,我们可以使用Jekins等实现自动化部署等。
问题6:使用了微服务之后,我们的服务部署在不同的服务上,不同的IP和不同的端口会为我们的方位带来一定的困扰,这个时候我们可以使用网关服务如zuul,gateway等技术解决这些问题。
2、案例中的微服务结构
重点1:我们创建二个微服务,一个订单系统,一个商品系统,并将这两个系统注册到注册中心EurekaServer中。这个时候我们需要解决OrderServer订单系统与GoodsServer商品系统的通信问题,我们可以通过二中方式解决通信问题,第一:RestTemplate,第二:OpenFeign。
重点2:我们在GoodsServer商品系统中创建deductStock方法模拟减库存,在OrderServer订单系统中创建createOrder方法模拟创建订单。然后在createOrder中调用deductStock方法。

3、创建EurekaServer
3.1、创建工程并导入包信息
核心包:
spring-cloud-starter-netflix-eureka-server
spring-boot-starter-web
<?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>3.1.7</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.txc</groupId><artifactId>eurekaserver0828</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>eurekaserver0828</name><description>eurekaserver0828</description><properties><java.version>17</java.version><spring-cloud.version>2022.0.4</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>3.1.0</version></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>com.txc.eurekaserver0828.Eurekaserver0828Application</mainClass></configuration></plugin></plugins></build></project>
3.2、在application.properties中配置注册中心信息
#注册中心端口号
server.port=8761
#注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
#是否将自己注册到Eureka-Server中,默认的为true
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
#为服务起一个别名
spring.application.name=eurekaserver
3.3、在启动类中添加注册中心服务配置
核心注解:@EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class Eurekaserver0828Application {public static void main(String[] args) {SpringApplication.run(Eurekaserver0828Application.class, args);}}
3.4、访问Eureka注册中心监控页面
访问地址:http://localhost:8761/
此时注册中心中没有任何的微服务

主要参数含义介绍:
total-avail-memory:总可用内存
num-of-cpus:cpu数量
current-memory-usage:当前内存使用量
server-uptime:服务器正常运行时间
registerd-replicas:注册副本
available-replicas:可用副本
4、创建GoodsServer微服务并注册到注册中心中(服务注册)
服务注册:将微服务注册到Eureka Server中
4.1、创建GoodsServer工程并导包
核心包:
spring-cloud-starter-netflix-eureka-client
spring-boot-starter-web
<?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>3.1.7</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.txc</groupId><artifactId>goodsserver</artifactId><version>0.0.1-SNAPSHOT</version><name>goodsserver</name><description>goodsserver</description><properties><java.version>17</java.version><spring-cloud.version>2022.0.4</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><image><builder>paketobuildpacks/builder-jammy-base:latest</builder></image><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
4.2、创建GoodsServer配置信息
在application.properties中添加如下信息
server.port=8001
spring.application.name=goodsserver
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
4.3、在启动类中添加Eureka客户端注解
核心注解:@EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class GoodsserverApplication {public static void main(String[] args) {SpringApplication.run(GoodsserverApplication.class, args);}}
4.4、创建测试方法
创建deductStock模拟减库存行为,接收一个String类型参数,返回String类型参数。
@Controller
public class GoodsController {@RequestMapping("/deductStock")@ResponseBodypublic String deductStock(String goodsCode){System.out.println(goodsCode+"=====goods deduct success======");//模拟减库存return "库存减去成功";}}
4.5、启动工程并查看Eureka Server注册中心信息

5、创建OrderServer微服务并注册到注册中心中
5.1、创建OrderServer工程并导包
核心包:
spring-cloud-starter-netflix-eureka-client
spring-boot-starter-web
<?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>3.1.7</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.txc</groupId><artifactId>orderserver</artifactId><version>0.0.1-SNAPSHOT</version><name>orderserver</name><description>orderserver</description><properties><java.version>17</java.version><spring-cloud.version>2022.0.4</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><image><builder>paketobuildpacks/builder-jammy-base:latest</builder></image><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
5.2、创建OrderServer工程配置信息
这个工程我特地使用了yml文件配置,本质与properties相同
GoodsServer工程使用8081端口,所以我们的OrderServer工程使用8082端口
server:port: 8082
spring:application:name: orderserver
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/
5.3、在启动类中添加Eureka客户端注解
核心注解:@EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClientpublic class OrderserverApplication {public static void main(String[] args) {SpringApplication.run(OrderserverApplication.class, args);}}
5.4、创建createOrder测试方法
@Controller
public class OrderController {@RequestMapping("/createOrder")@ResponseBodypublic String createOrder(){System.out.println("=====order create success=====");return "订单创建成功返回值。";}}
5.5、启动工程并查看EurekaServer注册中心信息

6、实现OrderServer工程与GoodsServer工程通信(服务发现)
服务发现:就是通过RestTemplate和OpenFeign方式通信。
两个微服务通信的听着高大上,本质就是实现A工程中的方法调用B工程中的方法。在单体服务中可以直接通过new类调用方法的方式,微服务中稍微麻烦一些。
6.1、方式1:在OrderServer工程中调用deductStore方法
在OrderServer的createOrder方法中调用deductStore方法
这种调用方式的不足之处:无法使用高可用服务,只能指定访问8081端口。
@Controller
public class OrderController {@RequestMapping("/createOrder")@ResponseBodypublic String createOrder(){System.out.println("=====order create success=====");//需要调用商品服务中的商品信息,扣除库存信息。RestTemplate restTemplate=new RestTemplate();String result=restTemplate.getForObject("http://localhost:8081/deductStock?goodsCode=1001",String.class);System.out.println("===result==="+result);return "订单创建成功返回值。";}}
访问结果:
测试地址:http://localhost:8082/createOrder?goodsCode=1001


6.2、方式2:在OrderServer工程中调用deductStore方法
这种方式能够适应高可用服务,使用到了LoadBalanced
第一步:在启动类中添加如下信息
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@SpringBootApplication
@EnableDiscoveryClient
public class OrderserverApplication {public static void main(String[] args) {SpringApplication.run(OrderserverApplication.class, args);}@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
第二步:在控制类中使用
在调用的时候,不需要写具体的ip地址和port,而是直接写服务的名称,也就是GoodsServer工程中通过spring.application.name起的名字。
@Controllerpublic class OrderController {@AutowiredRestTemplate restTemplate;@RequestMapping("/createOrder")@ResponseBodypublic String createOrder(){System.out.println("=====order create success=====");//需要调用商品服务中的商品信息,扣除库存信息。//第一种/*RestTemplate restTemplate=new RestTemplate();String result=restTemplate.getForObject("http://localhost:8081/deductStock?goodsCode=1001",String.class);System.out.println("===result==="+result);*///第二种String result=restTemplate.getForObject("http://GOODSSERVER/deductStock?goodsCode=1001",String.class);System.out.println("===result==="+result);return "订单创建成功返回值。";}}
测试结果:
测试地址:
测试地址:http://localhost:8082/createOrder?goodsCode=1001

6.3、方式3:通过OpenFeign方式调用
OpenFeign方式调用能让开发者感觉在调用本地方法一样,体验较好。底层使用动态代理的方式实现,本质是基于HTTP的远程调用。
声明式REST客户端(伪RPC),采用基于接口的注解,内部使用ribbon做负载均衡—集群,能够达到仿佛调用本地方法的体验。
6.3.1、在OrderServer中加入OpenFeign的包信息
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>3.1.1</version></dependency>
6.3.2、在启动类中配置OpenFeign注解启动
核心注解:@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderserverApplication {public static void main(String[] args) {SpringApplication.run(OrderserverApplication.class, args);}@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
6.3.3、在OrderServer中创建调用注解类
说明1:@FeignClient(name = "GOODSSERVER"):name的值必须等于调用的微服务goodsServer中spring.application.name定义的值 说明2:@RequestMapping("/deductStock"):括号中的名称必须等于调用的微服务中真实的请求的地址
@FeignClient(name = "GOODSSERVER")
public interface GoodsServerClients {@RequestMapping("/deductStock")public String deductStock(String goodsCode);
}
6.3.4、测试程序
测试地址:http://localhost:8082/createOrder?goodsCode=1001


7、源码下载
下载地址:https://download.csdn.net/download/tangshiyilang/88771218
相关文章:
SpringCloud中服务间通信(应用间通信)-亲测有效-源码下载-连载2
1、微服务概述 本案例主要解决微服务之间的相互调用问题 如果已经理解什么是微服务,可以直接跳到实战。 本案例采用springBoot3.1.7springCloud2022.0.4版本测试 本案例使用springboot2.7.x版本测试代码相同 1、微服务是分布式架构,那么为什么要需要…...
Axios取消请求:AbortController
AbortController AbortController() 构造函数创建了一个新的 AbortController 实例。MDN官网给出了一个利用AbortController取消下载视频的例子。 核心逻辑是:利用AbortController接口的只读属性signal标记fetch请求;然后在需要取消请求的时候࿰…...
【江科大】STM32:(超级详细)定时器输出比较
文章目录 输出比较单元特点 高级定时器:均有4个通道 PWM简介PWM(Pulse Width Modulation)脉冲宽度调制输出比较通道PWM基本结构基本定时器 参数计算捕获/比较通道的输出部分详细介绍如下: 舵机介绍硬件电路 直流电机介绍ÿ…...
Go 复合数据类型
1. 数组(array)(OK) 数组数组的概念数组是具有固定长度且拥有零个或多个相同数据类型元素的序列 i. 元素的数据类型相同 ii. 长度固定的序列 iii. 零个或多个元素的序列 与 slice 对比 由于数组的长度固定,所以在 G…...
Redis(01)——常用指令
基础指令 select 数字:切换到其他数据库flushdb:清空当前数据库flushall:清空所有数据库dbsize:查看数据库大小exists key1[key2 …]:判断当前的key是否存在keys *:查看所有的keyexpire key 时间ÿ…...
基本语法和 package 与 jar
3.基本语法 1.输入输出 // 导入 java.util 包中的 Scanner 类 import java.util.Scanner;// 定义名为 ScannerExample 的公共类 public class ScannerExample {// 主方法,程序的入口点public static void main(String[] args) {// 创建 Scanner 对象,用…...
本地读取Excel文件并进行数据压缩传递到服务器
在项目开发过程中,读取excel文件,可能存在几百或几百万条数据内容,那么对于大型文件来说,我们应该如何思考对于大型文件的读取操作以及性能的注意事项。 类库:Papa Parse - Powerful CSV Parser for JavaScript 第一步…...
【开源】基于JAVA的停车场收费系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…...
基于java+Springboot操作系统教学交流平台详细设计实现
基于javaSpringboot操作系统教学交流平台详细设计实现 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统…...
Nginx 基础使用
目录结构 进入Nginx的主目录我们可以看到这些文件夹 client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件 client_body_temp fastcgi_temp proxy_temp scg…...
JavaEE:多线程(2):线程状态,线程安全
目录 线程状态 线程安全 线程不安全 加锁 互斥性 可重入 死锁 死锁的解决方法 Java标准库中线程安全类 内存可见性引起的线程安全问题 等待和通知机制 线程饿死 wait notify 线程状态 就绪:线程随时可以去CPU上执行,也包含在CPU上执行的…...
Flutter 自定义AppBar实现滚动渐变
1、使用ListView实现上下滚动。 2、使用Stack:允许将其子部件放在彼此的顶部,第一个子部件将放置在底部。所以AppBar,写在ListView下面。 3、MediaQuery.removePadding:当使用ListView的时候发现,顶部有块默认的Padd…...
编程语言MoonBit新增矩阵函数的语法糖
MoonBit更新 1. 新增矩阵函数的语法糖 新增矩阵函数的语法糖,用于方便地定义局部函数和具有模式匹配的匿名函数: fn init {fn boolean_or { // 带有模式匹配的局部函数true, _ > true_, true > true_, _ > false}fn apply(f, x) {f(x)}le…...
Angular:跨域请求携带 cookie
新建拦截器,设置 XMLHttpRequest:withCredentials 属性 1. 新建文件夹 http-interceptors 该文件夹下可有多个不同用途的拦截器2. 新建拦截器 common.interceptor.ts import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from "an…...
【C++】list容器迭代器的模拟实现
list容器内部基本都是链表形式实现,这里的迭代器实现的逻辑需要注意C语言中指针的转换。 list容器如同数据结构中的队列,通常用链式结构进行存储。在这个容器中,我们可以模仿系统的逻辑,在头结点后设置一个“ 哨兵 ”,…...
Docker镜像操作
镜像名称 镜名称一般分两部分组成:[repository]:[tag]。 在没有指定tag时,默认是latest,代表最新版本的镜像。 这里的mysql就是repository,5.7就是tag,合一起就是镜像名称,代表5.7版本的MySQL镜像。 镜像…...
【Java-框架-SpringSecurity】单点登录(认证和授权)- 随笔
项目文件; 【1】 【2】 【3】 【4】 【5】 【6】 【7】 【8】...
大数据开发之Scala
第 1 章:scala入门 1.1 概述 scala将面向对象和函数式编程结合成一种简洁的高级语言 特点 1、scala和java一样属于jvm语言,使用时都需要先编译为class字节码文件,并且scala能够直接调用java的类库 2、scala支持两种编程范式面向对象和函数式…...
数字时代的大对决
数字时代如今正酝酿着一场大对决,浏览器、艺术品、音乐平台和社交通信的巅峰之战正在发生。Brave、Yuga Labs、Audius和Discord分别对标着Chrome、Disney、Spotify和WhatsApp,这场数字时代的较量不仅涉及浏览器、艺术品、音乐平台和社交通信的竞争&#…...
网络防御保护1
网络防御保护 第一章 网络安全概述 网络安全(Cyber Security)是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断 随着数…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
