当前位置: 首页 > news >正文

基础篇:03-SpringCloud工程部署启动

目录

1.工程搭建部署

方案一:完整工程导入

方案二:从零开始搭建

1.工程与module创建

2.数据库导入

3.项目启动

3.1 启动并访问user-service

3.2 启动并访问order-service

4.服务远程调用

时序图说明

服务远程调用实现

注入RestTemplate

RestTemplate完成远程服务调用

重启并访问order-service

RestTemplate如何实现远程服务调用

5.总结

6.推荐阅读资料


1.工程搭建部署

方案一:完整工程导入

  • cloud.zip,如无法运行尝试换未编译版:cloud-demo.zip

  • 下载解压上述工程,ide工具导入 

方案二:从零开始搭建

1.工程与module创建

1.1 父工程创建

1.2 子module创建

  • module名称:order-service、user-service

  • 无效文件夹删除,整体结构如图2 

1.3 父pom资源引入

粘贴以下资源依赖,粘贴后maven会自动拉取依赖,如未拉取请手动刷新

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEASE</version><relativePath/>
</parent>
​
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR10</spring-cloud.version><mysql.version>5.1.47</mysql.version><mybatis.version>2.1.1</mybatis.version><lombok.version>1.18.20</lombok.version>
</properties>
​
<dependencyManagement><dependencies><!-- springCloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies>
</dependencyManagement>

1.4 子module资源引入

user-service

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>
<build><finalName>app</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

order-service

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

1.5 业务代码编写

1.user-service

application.yml配置文件

server:port: 8081
spring:datasource:url: jdbc:mysql://localhost:3306/cloud_user?useSSL=falseusername: rootpassword: root123456driver-class-name: com.mysql.jdbc.Driver
mybatis:type-aliases-package: cn.itcast.user.pojoconfiguration:map-underscore-to-camel-case: true
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS

|--mapper |-- UserMapper

package cn.itcast.user.mapper;
​
import cn.itcast.user.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
​
/*** 用户持久层** @author * @date 2022-12-22 14:12*/
public interface UserMapper {
​/*** 根据ID查找用户* @param id    用户ID* @return      用户实体信息*/@Select("select * from tb_user where id=#{id}")User findById(@Param("id") Long id);
}

|--pojo |-- User

package cn.itcast.user.pojo;
​
import lombok.Data;
​
/*** 用户实体** @author * @date 2022-12-22 14:07*/
@Data
public class User {
​/*** 主键ID*/private Long id;
​/*** 用户姓名*/private String username;
​/*** 用户地址*/private String address;
}

|--service |-- UserService

package cn.itcast.user.service;
​
import cn.itcast.user.mapper.UserMapper;
import cn.itcast.user.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
​
import java.util.Objects;
​
/*** 用户业务层** @author * @date 2022-12-22 14:13*/
@Service
public class UserService {
​@Autowiredprivate UserMapper userMapper;
​/*** 根据ID查找用户* @param id    用户ID* @return      用户实体信息*/public User findById(Long id) {if (Objects.isNull(id)) {return null;}return userMapper.findById(id);}
​
}

|--web |-- UserController

package cn.itcast.user.web;
​
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
/*** 用户控制层** @author * @date 2022-12-22 14:15*/
@RestController
@RequestMapping("/user")
public class UserController {
​@Autowiredprivate UserService userService;
​/*** 根据ID查找用户* @param id    ID* @return      用户信息*/@GetMapping("/{id}")public User findById(@PathVariable("id") Long id) {return userService.findById(id);}
}

|--UserApplication

package cn.itcast.user;
​
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
​
/*** 启动类** @author * @date 2022-12-22 14:00*/
@MapperScan("cn.itcast.user.mapper")
@SpringBootApplication
public class UserApplication {
​public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);System.out.println("用户工程启动成功");}
}

2.order-service

application.yml配置文件

server:port: 8080
spring:datasource:url: jdbc:mysql://localhost:3306/cloud_order?useSSL=falseusername: rootpassword: root123456driver-class-name: com.mysql.jdbc.Driver
mybatis:type-aliases-package: cn.itcast.order.pojoconfiguration:map-underscore-to-camel-case: true
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS

|--mapper |-- OrderMapper

package cn.itcast.order.mapper;
​
import cn.itcast.order.pojo.Order;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
​
/*** 订单持久层** @author * @date 2022-12-22 14:22*/
public interface OrderMapper {
​/*** 根据ID查找订单* @param id    订单ID* @return      订单对象*/@Select("select * from tb_order where id=#{id}")Order findById(@Param("id")Long id);
}

|--pojo |-- Order

package cn.itcast.order.pojo;
​
import lombok.Data;
​
/*** 订单实体(vo并非dto)** @author * @date 2022-12-22 14:19*/
@Data
public class Order {
​/*** 主键ID*/private Long id;
​/*** 用户主键ID*/private Long userId;
​/*** 商品名称*/private String name;
​/*** 商品价格*/private Long price;
​/*** 商品数量*/private Integer num;
​/*** 用户信息*/private User user;
}

|-- User

package cn.itcast.order.pojo;
​
import lombok.Data;
​
/*** 用户实体** @author * @date 2022-12-22 14:07*/
@Data
public class User {
​/*** 主键ID*/private Long id;
​/*** 用户姓名*/private String username;
​/*** 用户地址*/private String address;
}

|--service |-- OrderService

package cn.itcast.order.service;
​
import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
​
/*** 订单业务层** @author * @date 2022-12-22 14:24*/
@Service
public class OrderService {
​@Autowiredprivate OrderMapper orderMapper;
​/*** 根据ID查找订单* @param id    订单ID* @return      订单对象*/public Order findById(Long id) {Order order = orderMapper.findById(id);return order;}
}

|--web |-- OrderController

package cn.itcast.order.web;
​
import cn.itcast.order.pojo.Order;
import cn.itcast.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
/*** 订单控制层** @author * @date 2022-12-22 14:25*/
@RestController
@RequestMapping("/order")
public class OrderController {
​@Autowiredprivate OrderService orderService;
​/*** 根据ID查找订单* @param orderId    订单ID* @return           订单对象*/@GetMapping("/{orderId}")public Order findById(@PathVariable("orderId")Long orderId) {return orderService.findById(orderId);}
}

|--OrderApplication

package cn.itcast.order;
​
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
​
/*** 启动类** @author * @date 2022-12-22 14:05*/
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
​public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);System.out.println("订单工程启动成功");
​}
}
 

2.数据库导入

  • 需参见上图新建两个数据库,然后导入DDL语句

  • cloud-order.sql

  • cloud-user.sql

导完如下

3.项目启动

3.1 启动并访问user-service

3.2 启动并访问order-service

        观察发现,虽然order-service服务调用成功,但是里面的user对象却是空的。原因我们应该也可以了解到是因为User对象数据数存储在数据库:tb_user,而此工程连接数据库是:tb_order,查询此数据库时无法获取对应的User数据,怎么获取?获取的具体实现我们将在下一章节进一步铺开。 

4.服务远程调用

分析现有链路调用关系可以发现:

  • http://localhost:8081/user/{id} 可以获取用户信息

  • http://localhost:8081/order/{orderId} 可以获取订单信息,但是用户信息为空

想要订单信息中返回用户信息,只要在获取订单链路中追加对用户信息的获取、返回值的组装即可,由此引申出微服务之间的远程服务调用,具体调整可见下图。

时序图说明

        上述图形为时序图,一般用来描述系统与系统之间的交互流程,主要是交互API、代码顺序、参数一般忽略,时序图不同于业务流程,更关注业务实现过程中系统前后依赖,数据请求与返回,以下为笔者实际工作场景示例:

服务远程调用实现

注入RestTemplate

此处推荐一个小的优雅工具:Carbon | Create and share beautiful images of your source code

RestTemplate完成远程服务调用

在此笔者除了完成远程服务调用,同时对代码做了结构化、异常校验、函数封装。虽然此处逻辑并不复杂,但是对于主干逻辑简化和代码风格,希望能起到一个引导作用。

package cn.itcast.order.service;
​
import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
​
import java.util.Objects;
​
/**
* 订单业务层
*
* @author 
* @date 2022-12-22 14:24
*/
@Service
public class OrderService {
​@Autowiredprivate OrderMapper orderMapper;
​@Autowiredprivate RestTemplate restTemplate;
​/*** 根据ID查找订单* @param id    订单ID* @return      订单对象*/public Order findById(Long id) {
​// step 1 : 查询订单原始数据Order order = orderMapper.findById(id);if (Objects.isNull(order)) {return null;}
​// step 2 : 查询用户数据User user = queryUserInfoById(order.getUserId());
​// step 3 : 组装用户数据if (Objects.nonNull(user)) {order.setUser(user);}
​// step 4: 数据返回return order;}
​/*** 根据用户ID查找用户信息* @param userId    用户ID* @return          用户信息*/private User queryUserInfoById(Long userId) {String url = "http://localhost:8081/user/" + userId;return restTemplate.getForObject(url, User.class);}
}

重启并访问order-service

RestTemplate如何实现远程服务调用

5.总结

        本节笔者带领大家完成了SpringCloud工程从0->1的搭建,当然你不想搭建也可以直接采用方案一,二者等效,至此读者们完成了一个微服务工程的搭建、部署、访问。同时在本节最后一章,笔者基于RestTemplate发起的http请求实现远程调用,实现当A系统想要获取B系统数据时的跨系统数据交互。然而RESTful API(进一步了解可移步:链接)访问并不是微服务的唯一解决方案,如Dubbo的交互一样可以实现,希望读者们能不限于此。

         在本章节,笔者希望大家对于微服务的拆分,服务调用关系有个初步认知,本例中当order-service调用user-service时,前者就充当了服务调用方,后者则是服务提供方,这种调用关系在后续我们将会大量使用。


思考问题

  • 如何实现服务远程调用?

  • 服务远程调用解决了什么问题?

  • 还有哪些技术可以实现远程服务调用?


6.推荐阅读资料

  • 了解时序图绘制:https://www.cnblogs.com/liuyitan/p/16631240.html

相关文章:

基础篇:03-SpringCloud工程部署启动

目录 1.工程搭建部署 方案一&#xff1a;完整工程导入 方案二&#xff1a;从零开始搭建 1.工程与module创建 2.数据库导入 3.项目启动 3.1 启动并访问user-service 3.2 启动并访问order-service 4.服务远程调用 时序图说明 服务远程调用实现 注入RestTemplate Res…...

二、产品经理——【需求收集】【需求管理】

0. 学习目标 能够理解并描述需求能够收集并管理需求 1. 如何定义需求 1.1. 需求的定义 原始需求&#xff1a;没有经过任何分析&#xff0c;或者没有经过任何额外解读的需求信息 避免日后纠纷&#xff0c;尽量记录一下原始需求&#xff01;先记录下来&#xff0c;后面再进行分…...

蓝桥杯stm32 USART 串口接收数据

文章代码使用 HAL 库。 文章目录 前言一、创建 CubeMX 工程:二、 中断接收数据 函数:三、串口接收回调函数实验效果四、接收固定长度的数据。五、串口接收 不定长数据。总结前言 上篇文章是 串口的发送数据,这篇文章接着上次的 讲 串口的接受数据。 一、创建 CubeMX 工程:…...

CellularAutomata元胞向量机-9-生命游戏MATLAB代码分享

主程序&#xff1a;%%Conways life with GUI clf % 清除图形clc, clear% %build the GUI %define the plot button plotbuttonuicontrol(style,pushbutton,... string,Run, ... fontsize,12, ... position,[100,400,50,20], ... callback, run1;); %define the stop button era…...

基于Java+Swing+mysql图书管理系统

基于JavaSwingmysql图书管理系统一、系统介绍二、功能展示1.用户登陆、注册2.类别管理--管理员3.图书管理--管理员4.用户管理--管理员5.图书借还情况查看--管理员7.用户主页8.办理还书--用户9.办理还书三、数据库四、其它系统五、获取源码一、系统介绍 该系统实现了 用户: 图书…...

高通IPQ支持串口转RS485

IPQ60xx支持串口转RS485 1. IPQ6018支持串口转RS4851.1 功能需求1.2 原理1.3 实现方法1.4 如何使用RS485?1.5 修改底层串口驱动来进行控制收发状态,上层应用可以直接当成串口来进行操作1. IPQ6018支持串口转RS485 1.1 功能需求 IPQ60xx/IPQ501x/IPQ80xx项目中使用RS485, 需…...

力扣-组合两个表

大家好&#xff0c;我是空空star&#xff0c;本篇带你了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;175. 组合两个表二、解题1.left join提交SQL运行结果2.right join提交SQL运行结果总结前言 一、题目&#xff1a;175. 组合两个表 表: Person ----------…...

Linux权限概念

目录 Linux权限的概念 什么是权限 如何去操作权限 设置文件所属角色 设置文件属性 umask 粘滞位 Linux权限的概念 首先我们要了解到&#xff0c;在linux下有两种用户&#xff1a;超级用户(root)和普通用户。超级用户的命令提示符是“#”&#xff0c;普通用户的命令提示…...

备战金三银四,这些无数测试前辈们踩过的坑,在面试中,一定要注意这些

你觉得软件测试师这个职位怎么样&#xff1f;大多数人可能会给出答案:“测试&#xff1f;啊&#xff0c;没有技术含量。无非是看需求、业务手册、设计文档&#xff0c;然后点击功能是否实现。问题是测试中的部署和安装是否存在兼容性问题。” 是的&#xff0c;不可否认&#x…...

注解(加与不加的区别)

起因&#xff1a; 在看到这个文章时&#xff0c;对于注解的作用半知半解&#xff0c;由此&#xff0c;写了个例子&#xff0c;验证注解作用 以Override举例 新建一个父类&#xff0c;取名为textone(类名首字母应该大写) 写一个方法&#xff1a; 再新建一个类&#xff0c;继承…...

小众免费的短视频素材库

推荐5个小众但好用的视频素材网站&#xff0c;免费可商用&#xff0c;视频剪辑、自媒体必备~ 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky ​ 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计素材为主&#xff0c;高清视频素材也很多&#xff0c;像风…...

docker-compose安装SonarQube

前言SonarQube 是一个开源的代码分析平台, 用来持续分析和评测项目源代码的质量。 通过SonarQube我们可以检测出项目中重复代码&#xff0c; 潜在bug&#xff0c; 代码规范&#xff0c;安全性漏洞等问题&#xff0c; 并通过SonarQube web UI展示出来。一、docker-compose配置#v…...

《数字经济全景白皮书》金融篇:五十弦翻塞外声,金融热点领域如何实现增长?

易观分析&#xff1a;《数字经济全景白皮书》浓缩了易观分析对于数字经济各行业经验和数据的积累&#xff0c;并结合数字时代企业的实际业务和未来面临的挑战&#xff0c;以及数字技术的创新突破等因素&#xff0c;最终从数字经济发展大势以及各领域案例入手&#xff0c;帮助企…...

微服务门神-Gateway与Sentinel的集成

目录 引言 概述 集成Sentinel 限流维度 网关集成 Route维度 API分组 精准匹配 前缀匹配 正则匹配 自定义限流返回格式 转视频版 引言 书接上篇&#xff1a;微服务门神-Gateway过滤器Filter&#xff0c;讲完了解Gateway过滤器之后&#xff0c;接下来看下Gateway与…...

查找的基本概念

查找表是由同一类型的数据元素&#xff08;或记录&#xff09;构成的集合。根据给定的某个值&#xff0c;在查找表中确定一个其关键字等于给定值的数据元素或记录。关键字&#xff1a;用来标识一个数据元素&#xff08;或记录&#xff09;的某个数据项的值。查找算法的评价指标…...

安装v-router出错

一、场景 1、安装v-router npm i --save vue-router 2、报错&#xff1a; npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: sph20.1.0 npm ERR! Found: vue2.7.14 npm ERR! node_modules/vue npm ERR! v…...

2023美赛C题:预测 Wordle 结果

以下内容全部来自本人人工翻译&#xff0c;仅供参考。 文章目录背景要求附件数据文件条目描述纽约时报网站上发布的Wordle指导方针词汇表参考文献服务背景 Wordle是目前纽约时报每天提供的一种受欢迎的谜题。玩家试图通过在六次或更少的机会内猜测一个五个字母的单词来解决谜题…...

minio public桶禁止在直接访问桶位置时列出所有文件url

minio的public桶因为没有限制&#xff0c;所以在直接访问到桶地址的时候会列出桶内所有文件的url&#xff0c;这样很不安全&#xff0c;如何禁止这个功能&#xff0c;可以使用三种方法 1、如果是新版的可以直接设置桶的Access Policy为自定义就好 编辑custom的Policy&#xff…...

Python 元组简介

Python 的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。元组使用小括号&#xff0c;列表使用方括号。元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。如下实例&#xff1a;实例(Python 2.0)tup1 (physics, chemistry, 1997…...

python gui构造openai api可视化页面

背景&#xff1a;最近chatgpt很火&#xff0c;前几天也想注册体验一下&#xff0c;一顿操作之后&#xff0c;卡在该国家不支持。最后发现自己的代理开在香港&#xff0c;改在漂亮国就行了。虽然有chatgpt可以用&#xff0c;但是小平是自己封装了一个&#xff0c;我不能输。正好…...

告别系统卡顿:RyTuneX全方位性能优化指南

告别系统卡顿&#xff1a;RyTuneX全方位性能优化指南 【免费下载链接】RyTuneX RyTuneX is a cutting-edge optimizer built with the WinUI 3 framework, designed to amplify the performance of Windows devices. Crafted for both Windows 10 and 11. 项目地址: https://…...

机械视觉入门:9点法手眼标定实战指南(附Halcon代码示例)

机械视觉入门&#xff1a;9点法手眼标定实战指南&#xff08;附Halcon代码示例&#xff09; 在工业自动化领域&#xff0c;机械视觉系统正逐渐成为智能制造的核心组件。当机械臂需要精准抓取或放置物体时&#xff0c;如何让"眼睛"&#xff08;相机&#xff09;看到的…...

手把手排查 DeepSpeed CPUAdam 报错:从 AttributeError 到成功编译 Op 的完整日志分析

深度解析DeepSpeed CPUAdam编译报错&#xff1a;从日志分析到精准修复 当你第一次看到AttributeError: DeepSpeedCPUAdam object has no attribute ds_opt_adam这个错误时&#xff0c;可能会感到困惑。这个错误背后隐藏着DeepSpeed框架中CPUAdam优化器与CUDA环境之间复杂的交互…...

快速原型:用快马一键生成win11右键菜单传统样式恢复工具

快速原型&#xff1a;用快马一键生成win11右键菜单传统样式恢复工具 最近升级到Windows 11后&#xff0c;最让我不习惯的就是那个右键菜单了。新版的设计把所有选项都折叠起来&#xff0c;每次想找个功能还得点"显示更多选项"&#xff0c;效率大打折扣。作为一个习惯…...

告别重复造轮子:用快马AI为qclaw项目封装高效算法模板与优化工具

在量子计算领域&#xff0c;qclaw项目的开发往往需要处理大量重复性工作。每次从零开始编写量子算法不仅耗时耗力&#xff0c;还容易引入人为错误。最近我在开发一个量子化学模拟项目时&#xff0c;发现了一个能显著提升效率的方法——利用InsCode(快马)平台构建可复用的算法模…...

如何用3分钟搭建深度学习的漫画翻译流水线?BallonsTranslator深度解析

如何用3分钟搭建深度学习的漫画翻译流水线&#xff1f;BallonsTranslator深度解析 【免费下载链接】BallonsTranslator 深度学习辅助漫画翻译工具, 支持一键机翻和简单的图像/文本编辑 | Yet another computer-aided comic/manga translation tool powered by deeplearning 项…...

MySQL 8.0隐藏技能:不用.frm文件,用Go语言工具+ALTER TABLE命令直接解析.ibd恢复表结构

MySQL 8.0数据恢复新思路&#xff1a;用Go语言逆向解析.ibd文件的技术实践 当数据库遭遇灾难性故障时&#xff0c;.frm文件的消失让MySQL 8.0的数据恢复变得更具挑战性。本文将带你深入InnoDB存储引擎的核心&#xff0c;探索一种不依赖传统.frm文件的全新恢复方案。 1. MySQL 8…...

服务机器人开发终极指南:从NAO到Pepper的完整编程实战

服务机器人开发终极指南&#xff1a;从NAO到Pepper的完整编程实战 【免费下载链接】awesome-robotics A list of awesome Robotics resources 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-robotics 服务机器人开发是一个融合机械设计、人工智能与编程的跨学科…...

用ESP32和MAX4466做个无线对讲机?手把手教你MQTT传音频(附完整代码)

用ESP32和MAX4466打造高保真无线对讲系统&#xff1a;从硬件搭建到音质优化 记得去年在创客空间第一次听到用ESP32传输的实时音频时&#xff0c;那种"原来物联网还能这么玩"的震撼感至今难忘。今天我们就来复刻这个魔法——用不到百元的硬件成本&#xff0c;构建一套…...

FFTW3内存管理最佳实践:fftw_malloc与数据对齐技巧

FFTW3内存管理最佳实践&#xff1a;fftw_malloc与数据对齐技巧 【免费下载链接】fftw3 DO NOT CHECK OUT THESE FILES FROM GITHUB UNLESS YOU KNOW WHAT YOU ARE DOING. (See below.) 项目地址: https://gitcode.com/gh_mirrors/ff/fftw3 FFTW3&#xff08;Fastest Fou…...