微服务-商城订单服务项目

文章目录

    • 一、需求
    • 二、分析
    • 三、设计
    • 四、编码
      • 4.1 商品服务
      • 4.2 订单服务
      • 4.3 分布式事务
      • 4.4 订单超时

商品、购物车
商品服务:
1.全品类购物平台
image.png
image.png
image.png
image.png
image.png
SPU:Standard Product Unit 标准化产品单元。是商品信息聚合的最小单位。是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU。通俗的说法:商品属性
SKU:Stock Keeping Unit,库存进出计量的基本单元,可以是以件,盒,托盘等为单位。通俗的说法:影响商品库存的属性。
SPU包含SKU
一个商品有100个属性,SPU,2个属性影响库存,2个SKU
购物车服务:
加减号的性能:Redis缓存->更新Redis->MQ->更新Mysql

一、需求

image.png
实现订单业务:预览、下单、订单超时、取消订单、更新订单状态、我的订单
下单(超卖)、超时(回滚)、取消(回滚)
image.png

二、分析

订单状态:

  1. 待付款:代表买家下单了但是还没有付款。
  2. 待发货(同待接单):代表买家付款了卖家还没有发货。
  3. 已发货(同待收货):代表卖家已经发货并寄出商品了。
  4. 已完成(同待评价):代表买家已经确认收到货了。
  5. 已关闭(同已取消):代表订单过期了买家也没付款、或者卖家关闭了订单。
  6. 已超时:超过一定时间,没有付款

订单的核心接口:
下单:购物车选择
下单:商品详情-立即购买
下单接口
订单超时-MQ的延迟队列
订单取消接口
查询我的订单
更改订单状态接口

三、设计

数据库设计:


CREATE TABLE `t_items`  (
`id` int(11) primary key auto_increment,
`name` varchar(20) ,
`no` varchar(10)
) comment '10.商品类型表';CREATE TABLE `t_goods`  (
`id` int(11) primary key AUTO_INCREMENT,
`item_id` int(11) comment '类型id',
`title` varchar(256) comment '名称',
`promo_words` varchar(2048) comment '描述',
`small_pic` varchar(100) comment '图片',
`price` decimal(10, 2) comment '价格',
`create_time` datetime,
`status` char(1) comment '状态',
`stock_num` int(11) comment '库存数量'
) comment '11.商品表';CREATE TABLE `t_cart`  (
`id` int(11) primary key auto_increment,
`uid` int,
`gid` int,
`gjprice` decimal(10, 2) comment '加入时价格',
`num` int
) comment '12.购物车表';CREATE TABLE `t_order`  (
`id` int(11) primary key auto_increment,
`uid` int,
`uaid` int comment '用户收货地址',
`total_money` decimal(10, 2) comment '总金额',
`pay_money` decimal(10, 2) comment '支付金额',
`free_money` decimal(10, 2) comment '优惠金额',
`pay_type` int comment '支付类型',
`flag` int comment '订单状态',
`create_time` datetime comment '创建时间',
`update_time` datetime comment '更新时间'
) comment '13.订单表';CREATE TABLE `t_orderitem`  (
`id` int(11) primary key auto_increment,
`oid` int,
`gid` int,
`price` decimal(10, 2) comment '价格',
`num` int
) comment '14.订单详情表';CREATE TABLE `t_orderlog`  (
`id` int(11) primary key auto_increment,
`oid` int,
`type` int comment '对应订单状态类型',
`info` varchar(50) comment '内容',
`create_time` datetime
) comment '15.订单状态变化表';

难点:
1.超卖 -锁
2.数据一致性–事务
3.超时-MQ死信机制
4.性能-MQ削峰填谷

锁:保证多个线程,同时只能有一个访问
事务:保证多个SQL语句,要么都成功要么都失败

四、编码

4.1 商品服务

DDD领域驱动模型

image.png
什么时候可以使用DDD领域驱动:大型互联网
业务:快速变化
需求变更快,需求迭代快,业务扩展快的项目。
开发人员:3-5年经验
需要熟练应用过很多设计模式,有了这些经验才能理解为什么这么设计,才能不偷懒的去做这件事,否则很容易对领域造成污染。
时间:更充分
需要有充分的时间去划分业务,设计领域,需要更多的类,编写更多代码量
DDD领域驱动设计的分包:

  • gate: 对外暴露的服务
    • rest:对外暴露的rest服务
  • application:应用服务层
  • domain:领域层
    • item:商品分类
    • goods:商品
  • infra:基础设施层
    • repo:仓储实现
    • mapper: 数据库交互

ORM框架:操作数据库的框架
Mybatis(Mybatis-plus)、Hibernate(曾经的王者)、Spring Data JPA
SSH框架:Struts2+Spring+Hibernate
SSM框架:SpringMVC+Spring+Mybatis
SSS框架:SpringMVC+Spring+Spring Data JPA
SpringBoot框架:Spring+SpringMVC+Mybatis(Spring Data JPA)
Spring Data JPA:Spring开发的一套操作数据库的框架
Spring Data系列框架,都是Spring封装操作数据的各种框架的组合
比如:
操作Mysql数据库:Spring Data JPA
操作Redis数据库:Spring Data Redis
操作ElasticSearch:Spring Data ElasticSearch
Spring Data JPA基于Java 的JPA技术,实现的操作数据库的框架,基于注解实现数据库的操作
特性:自动生成对应表,封装了单表的操作,多种实现方式(JPQL、方法名解析查询、原生SQL、CRUD接口)
使用步骤:
1.依赖jar包

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

2.实现配置

spring:application:name: GoodsServer-xphcloud:nacos:discovery:server-addr: 127.0.0.1:8848datasource:url: jdbc:mysql://110.40.192.129:3310/db_clouddriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: zzjavatype: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 15max-active: 100min-idle: 15max-wait: 60000web-stat-filter:enabled: trueurl-pattern: "/*"exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"stat-view-servlet:url-pattern: "/druid/*"reset-enable: falselogin-username: adminlogin-password: zzjavaenabled: truejpa:database: mysqlhibernate:ddl-auto: update

3.编写实体类

@Data
@Entity //标识 映射类
@Table(name = "t_goods")//设置表名
public class Goods {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;private Integer itemId;private String title;private String promoWords;private String smallPic;private Date createTime;private Integer status;private Integer stockNum;
}

4.编写持久
创建接口继承JpaRepository

public interface GoodsDao extends JpaRepository<Goods,Integer> {//查询 JQPL:面向对象查询语言 表->类@Query(value = "from Goods")List<Goods> selectAll();//方法名解析查询:按照约定,编写方法名,就会自动生成SQL语句Goods getById(int id);//模糊查询List<Goods> getByTitleLike(String title);//原生SQL语句@Modifying//执行DML类型@Query(value = "update t_goods set stock_num=stock_num+:num where id=:id",nativeQuery = true)int updateStock(int num,int id);
}

5.使用
Spring Data JPA的核心:
1.接口:JpaRepository<实体类名,注解的数据类型>
提供:单表的增删改查分页和排序
2.JPQL:面向对象查询语言
Spring Data JPA-封装的面向对象查询语句
表名—>类名
字段—>属性
@Query 注解

@Query(value = "from Goods")
List<Goods> selectAll();

比如:
sql:select * from t_goods
jpql:from Goods
3.方法名解析查询
根据规则,合理的命名方法名,可以自动根据方法名生成SQL语句
image.png
image.png
4.原生SQL语句
可以在注解@Query上面写SQL语句,但是需要设置属性:nativeQuery = true。否则只能写jpql
如果执行的sql语句是DML类型,那么必须使用一个注解:@Modifying//执行DML类型

@Modifying//执行DML类型
@Query(value = "update t_goods set stock_num=stock_num+:num where id=:id",nativeQuery = true)
int updateStock(int num,int id);

4.2 订单服务

搬砖
下单接口–>考虑实现订单超时
下单接口的第一版实现:

@Service
public class OrderServiceImpl implements OrderService {@Resourceprivate OrderDao dao;@Resourceprivate OrderLogDao logDao;@Resourceprivate OrderItemDao itemDao;@Resourceprivate RabbitTemplate rabbitTemplate;@Resourceprivate GoodsProvider goodsProvider;@Resourceprivate CouponProvider couponProvider;//难点:1.超卖-锁 2.多服务调用-数据一致性-事务 3.性能-Redis MQ 4.订单超时@Overridepublic R save(OrderAddDto dto,int uid) {//下单业务-流程//1.查询商品 跨服务远程调用R rgoods=goodsProvider.single(dto.getGid());if(RCode.成功.getCode()==rgoods.getCode()){GoodsDto goodsDto= (GoodsDto) rgoods.getData();//2.验证库存 校验商品是否存在并查验商品状态if(goodsDto!=null && SystemConfig.GOODS_STATUS_UP==goodsDto.getStatus()){//检查库存 普通锁Lock lock=new ReentrantLock();lock.lock();try {if (goodsDto.getStockNum() >= dto.getNum()) {//库存够//3.生成订单Order order = new Order();order.setFlag(OrderFlag.待付款.getCode());order.setTotalMoney(goodsDto.getPrice() * dto.getNum());//优惠金额=积分抵扣+优惠券减免order.setFreeMoney(dto.getScore() / 100.0);//4.查询优惠信息,计算优惠boolean isCoupon = false;UserCouponDto couponDto = couponProvider.detail(dto.getUcid());if (couponDto != null) {//前端已经校验,为什么后端还需要校验,防止绕过前端// 验证优惠券是否可用 1.有没有失效 2.满减规则 3.范围if (couponDto.getCategory() == 51) {//满减 满一定金额。才可以使用优惠券if (order.getTotalMoney() >= couponDto.getLimitmoney()) {order.setFreeMoney(order.getFreeMoney() + couponDto.getDiscount());isCoupon = true;}} else if (couponDto.getCategory() == 52) {//折扣 满一定金额才可以才可以打折if (order.getTotalMoney() >= couponDto.getLimitmoney()) {order.setFreeMoney(order.getFreeMoney() + order.getTotalMoney() * couponDto.getDiscount());isCoupon = true;}} else if (couponDto.getCategory() == 53) {//立减order.setFreeMoney(order.getFreeMoney() + couponDto.getDiscount());isCoupon = true;}}//设置支付金额order.setPayMoney(order.getTotalMoney() - order.getFreeMoney());order.setCreateTime(new Date());order.setUaid(dto.getUaid());order.setUpdateTime(new Date());//操作数据库,新增订单if (dao.insert(order) > 0) {//4.扣减库存goodsProvider.update(new GoodsStockDto(goodsDto.getId(), dto.getNum()));//5.积分抵扣if (dto.getScore() > 0) {//MQrabbitTemplate.convertAndSend("",RabbitMQConstConfig.Q_USERSCORE,new MqMsgBo(SnowFlowUtil.getInstance().nextId(), RabbitMQConstConfig.MQTYPE_ORDERADD,new UserMqBo(uid, dto.getScore(), SystemConfig.USER_OP_SIGN, "", "")));}//6.优惠券使用if (isCoupon) {couponProvider.update(couponDto.getId(), SystemConfig.USER_COUPON_USED);}//7.新增订单详情OrderItem item = new OrderItem(order.getId(), dto.getGid(), goodsDto.getPrice(), dto.getNum());itemDao.insert(item);//8.记录订单流水logDao.insert(new OrderLog(order.getId(), OrderFlag.待付款.getCode(), "商品详情下单成功!"));return RUtil.ok(order);}} else {//库存不够return RUtil.fail("亲,商品库存不足!");}}finally {lock.unlock();}//分布式锁}else {return RUtil.fail("亲,商品不存在!");}}return RUtil.fail("亲,商品服务异常!");}
}

查询我的订单
取消订单

4.3 分布式事务

事务、分布式事务:解决数据操作(DML)的一致性
分布式事务:解决多个服务嵌套调用(涉及到数据库的数据改变),保证要么都成功,要么都失败
比如:订单服务,远程调用商品服务、优惠券服务,保证三个服务要么都成功,要么都失败!
为什么需要使用分布式事务?
因为在服务的嵌套调用的时候,每个服务都有自己的Connection,所以之前的事务,只能保证同一个Connection下操作的一致性。
什么时候使用分布式事务:
服务嵌套调用,且服务(>1)都涉及到了DML语句的执行
为什么说:分布式事务是世界性难题?
原因:CAP

分布式事务解决方案:
1.2PC
1.准备阶段
2.确认阶段:提交或回滚
2.3PC
1.准备阶段
2.预提交阶段
3.确认阶段:提交或回滚
3.TCC
try:尝试执行
confrim:尝试成功,确认
cancel:尝试失败,取消
4.基于MQ
订单业务实现分布式事务:
订单服务:
1.依赖jar包

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><version>2021.1</version>
</dependency>

2.实现配置
image.png
3.入口方法上开启全局事务
所有被分布式事务协调的方法都需要本地事务的支持
image.png
商品服务:
1.依赖jar包

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><version>2021.1</version>
</dependency>

2.实现配置
image.png
3.涉及方法上开启本地事务
image.png
优惠券服务:
1.依赖jar包

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><version>2021.1</version>
</dependency>

2.实现配置
image.png
3.涉及方法上开启本地事务
image.png
默认使用的是Seata中的XA模式的事务提交方案,运行前务必保证nacos的运行和Seata-Server的运行
启动Seata-Server:sh seata-server.sh -p 8091 -m file

4.4 订单超时

image.png
代码示例:

// 下单->Redis->MQ->数据同步+延迟队列@Overridepublic R save2(OrderAddDto dto, int uid) {R rgoods=goodsProvider.single(dto.getGid());if(RCode.成功.getCode()==rgoods.getCode()) {GoodsDto goodsDto = (GoodsDto) rgoods.getData();//2.验证库存 校验商品是否存在并查验商品状态if (goodsDto != null && SystemConfig.GOODS_STATUS_UP == goodsDto.getStatus()) {//检查库存 普通锁Lock lock = new ReentrantLock();lock.lock();try {if (goodsDto.getStockNum() >= dto.getNum()) {//生成订单 存储Redis--MQ--MysqlOrder order = new Order();order.setNo(SnowFlowUtil.getInstance().nextId());order.setFlag(OrderFlag.待付款.getCode());order.setCreateTime(new Date());order.setUaid(dto.getUaid());order.setUid(uid);order.setUpdateTime(new Date());order.setTotalMoney(goodsDto.getPrice() * dto.getNum());if(dto.getUcid()>0){//有优惠券UserCouponDto couponDto = couponProvider.detail(dto.getUcid());order.setFreeMoney(couponDto.getCategory()==52?order.getTotalMoney()-(order.getTotalMoney() * couponDto.getDiscount()):couponDto.getDiscount());}if(dto.getScore()>0){//有积分抵扣order.setFreeMoney(order.getFreeMoney()+dto.getScore()/100.0);}order.setPayMoney(order.getTotalMoney()-order.getFreeMoney());//扣减库存R r=goodsProvider.update(new GoodsStockDto(goodsDto.getId(), -dto.getNum()));if(r.getCode()==RCode.成功.getCode()){//订单存储到Redis中 类型 有效期 数据 同步RedissonUtils.setHash(RedisKeyConfig.ORDER_ADD,order.getNo()+"",order);//基于MQ发送消息rabbitTemplate.convertAndSend(RabbitMQConstConfig.EX_ORDERADD,"",new MqMsgBo(SnowFlowUtil.getInstance().nextId(), RabbitMQConstConfig.MQTYPE_ORDERSYNC,new OrderSyncDto(order.getNo()+"",dto.getUcid(),dto.getGid(),dto.getNum(),goodsDto.getPrice())));//.积分抵扣if (dto.getScore() > 0) {//MQrabbitTemplate.convertAndSend("",RabbitMQConstConfig.Q_USERSCORE,new MqMsgBo(SnowFlowUtil.getInstance().nextId(), RabbitMQConstConfig.MQTYPE_ORDERADD,new UserMqBo(uid, dto.getScore(), SystemConfig.USER_OP_SIGN, "", "")));}return RUtil.ok();}else {return RUtil.fail("亲,网络异常,商品服务库存问题!");}}} finally {lock.unlock();}}}return RUtil.fail("亲,下单失败!");}@Overridepublic R queryMy(int uid, int flag) {QueryWrapper<Order> queryWrapper=new QueryWrapper<>();queryWrapper.eq("uid",uid);if(flag>0){queryWrapper.eq("flag",flag);}queryWrapper.orderByDesc("id");return RUtil.ok(dao.selectList(queryWrapper));}//后台调用-发货@Overridepublic R updateFlag(OrderFlagDto dto) {if(dao.updateFlag(dto.getOid(),dto.getFlag())>0){return RUtil.ok();}else {return RUtil.fail();}}@Transactional@GlobalTransactional //分布式事务@Overridepublic R cancel(String no,int uid) {//1.查询订单状态,防止Order order=dao.selectOne(new QueryWrapper<Order>().eq("no",no).eq("uid",uid));if(order!=null){//验证订单状态if(order.getFlag()==OrderFlag.待付款.getCode()){//超时了,取消订单//更改订单状态if(dao.updateFlag(order.getId(),OrderFlag.已关闭.getCode())>0){//查询订单详情List<OrderItem> items=itemDao.selectList(new QueryWrapper<OrderItem>().eq("oid",order.getId()));items.forEach(oi->{//释放库存goodsProvider.update(new GoodsStockDto(oi.getGid(),oi.getNum()));});//释放优惠券OrderLog couponlog=logDao.selectOne(new QueryWrapper<OrderLog>().eq("oid",order.getId()).eq("type",100));if(couponlog!=null){//用了优惠券,释放couponProvider.update(Integer.parseInt(couponlog.getInfo()),SystemConfig.USER_COUPON_NO);}//释放积分OrderLog scorelog=logDao.selectOne(new QueryWrapper<OrderLog>().eq("oid",order.getId()).eq("type",101));if(scorelog!=null){//用了积分,释放userProvider.updateScore(order.getUid(),Integer.parseInt(scorelog.getInfo()),SystemConfig.SCORETYPE_ORDERCANCEL);}//记录日志logDao.insert(new OrderLog(order.getId(), OrderFlag.已超时.getCode(), "订单超时,自动取消!"));}}}return RUtil.fail("订单取消失败!");}

如果感觉有用点个关注,一键三连吧!蟹蟹!!!
在这里插入图片描述

各位看官》创作不易,点个赞!!!
诸君共勉:看花不是花,看雪不是雪
免责声明:本文章仅用于学习参考

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

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

相关文章

[Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包

一、设置应用包名 在Flutter开发中&#xff0c;修改应用程序的包名&#xff08;也称作Application ID&#xff09;涉及几个步骤&#xff0c;因为包名是在项目的Android和iOS平台代码中分别配置的。请按照以下步骤操作&#xff1a; 1.Android Flutter工程中全局搜索替换包名 …

企业网络布局的新宠——SD-WAN

在数字化转型的浪潮下&#xff0c;企业对网络的需求日益复杂和多样化。面对分支机构间的协作需求和不断增长的网络流量&#xff0c;企业亟需一种更加高效、灵活且成本可控的组网方案。SD-WAN&#xff08;软件定义广域网络&#xff09;正是在这样的背景下应运而生&#xff0c;成…

【漏洞复现】大华智慧园区综合管理平台信息泄露漏洞

Nx01 产品简介 大华智慧园区综合管理平台是一款综合管理平台&#xff0c;具备园区运营、资源调配和智能服务等功能。该平台旨在协助优化园区资源分配&#xff0c;满足多元化的管理需求&#xff0c;同时通过提供智能服务&#xff0c;增强使用体验。 Nx02 漏洞描述 大华智慧园区…

主题公园保管资产难?三防加固平板对此说不!

主题公园是一个活跃&#xff0c;快节奏的环境&#xff0c;主题公园最重要的资产之一是他们的表演者和每天制作的节目。但是检查道具以及寻找服装的去向是一项艰巨的任务&#xff1b;如果没有适当的系统和流程&#xff0c;可能会导致资产损失和材料放错位置&#xff0c;最终导致…

【大厂AI课学习笔记NO.51】2.3深度学习开发任务实例(4)计算机视觉实际应用的特点

今天考试通过腾讯云人工智能从业者TCA级别的认证了&#xff01; 还是很开心的&#xff0c;也看不到什么更好的方向&#xff0c;把一切能利用的时间用来学习&#xff0c;总是对的。 我把自己考试通过的学习笔记&#xff0c;都分享到这里了&#xff0c;另外还有一个比较全的思维…

51单片机 wifi连接

一、基本概念 ESP8266是一款集成了WiFi功能的高性能芯片&#xff0c;广泛应用于物联网设备、智能家居、传感器网络等领域。以下是ESP8266的详细讲解&#xff1a; 1. 功能特点&#xff1a;ESP8266集成了TCP/IP协议栈&#xff0c;支持STA&#xff08;Station&#xff09;和AP&am…

15. QML中一些相关的图形效果汇总

1.说明 本篇博客主要记录一些在QML中&#xff0c;对图片进行操作的一些控件 2.示例代码 博客中用到的两张图片分别如下所示&#xff1a; 2.1 混合效果 效果展示&#xff1a; 相关代码&#xff1a; import QtQuick 2.2 import QtQuick.Window 2.1 import QtQuick.Cont…

论文阅读:SOLOv2: Dynamic, Faster and Stronger

目录 概要 Motivation 整体架构流程 技术细节 小结 论文地址&#xff1a;[2003.10152] SOLOv2: Dynamic and Fast Instance Segmentation (arxiv.org) 代码地址&#xff1a;GitHub - WXinlong/SOLO: SOLO and SOLOv2 for instance segmentation, ECCV 2020 & NeurIPS…

< JavaScript技巧:如何优雅的使用 【正则】校验 >

文章目录 &#x1f449; 一、正则表达式的概念&#x1f449; 二、常见使用正则表达式的方法① RegExp 对象方法1. 创建 RegExp 对象的语法2. RegExp对象方法① compile(value)② exec(value)③ test(value)③ reg.toString() ② 支持正则表达式的 String 对象的方法1. search()…

飞天使-学以致用-devops知识点1-安装gitlabharbor

文章目录 rpm 安装gitlab页面配置配置secretsecret 查看信息-chatgpt回复 为项目配置webhook,等jenkins部署完毕后在配置卸载 harbor配置secret所有k8s集群节点安装信任 http rpm 安装gitlab # 下载安装包 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitla…

统计分析笔记3

文章目录 统计检验选择正确的统计检验统计检验是做什么的&#xff1f;何时进行统计检验选择参数化测试&#xff1a;回归、比较或相关性选择非参数检验 假设检验的假设条件skewness什么是零偏度right skewleft skew计算skewnesswhat to do if your data is skewed kurtosis怎么计…

BevFusion (2): nuScenes 数据介绍及点云可视化

1. nuScenes 数据集 1.1 概述 nuScenes 数据集 (pronounced /nu:ːsiː:nz/) 是由 Motional (以前称为 nuTonomy) 团队开发的自动驾驶公共大型数据集。nuScenes 数据集的灵感来自于开创性的 KITTI 数据集。 nuScenes 是第一个提供自动驾驶车辆整个传感器套件 (6 个摄像头、1 …

计算机网络:IP

引言&#xff1a; IP协议是互联网协议族中的核心协议之一&#xff0c;负责为数据包在网络中传输提供路由寻址。它定义了数据包如何在互联网上从源地址传输到目的地址的规则和流程。IP协议使得各种不同类型的网络设备能够相互通信&#xff0c;实现了全球范围内的信息交换。 目录…

Qt项目:网络1

文章目录 项目&#xff1a;网路项目1&#xff1a;主机信息查询1.1 QHostInfo类和QNetworkInterface类1.2 主机信息查询项目实现 项目2&#xff1a;基于HTTP的网络应用程序2.1 项目中用到的函数详解2.2 主要源码 项目&#xff1a;网路 项目1&#xff1a;主机信息查询 使用QHostI…

基于vue的图书管理系统的设计与实现

高校师生在教学中承受的压力越大就对知识拥有了更多的需求&#xff0c;而满足这一需求的最佳场所无疑就是图书馆。当前虽然信息技术在各个方面都发挥出重要作用&#xff0c;但是在相当多的高校图书馆中依然由工作人员手动完成图书借阅、归还及逾期提醒等所有工作&#xff0c;在…

如何使用Logstash搜集日志传输到es集群并使用kibana检测

引言&#xff1a;上一期我们进行了对Elasticsearch和kibana的部署&#xff0c;今天我们来解决如何使用Logstash搜集日志传输到es集群并使用kibana检测 目录 Logstash部署 1.安装配置Logstash &#xff08;1&#xff09;安装 &#xff08;2&#xff09;测试文件 &#xff…

集群分发脚本xsync

集群分发脚本xsync 一、简介二、环境准备三、添加到机器的 hosts 文件四、ping 命令测试五、SSH 配置5.1.本地先生成公钥和私钥5.2.将公钥拷贝到其他机器 六、xsync 脚本编写6.1.安装 rsync6.2.新建 xsync.sh6.3.xsync.sh脚本6.4.赋予脚本执行权限6.5.测试 endl 一、简介 配置…

完全分布式运行模式

完全分布式运行模式 分析&#xff1a;之前已经配置完成 ​ 1&#xff09;准备3台客户机&#xff08;关闭防火墙、静态ip、主机名称&#xff09; ​ 2&#xff09;安装JDK ​ 3&#xff09;配置环境变量 ​ 4&#xff09;安装Hadoop ​ 5&#xff09;配置环境变量 ​ 6&am…

163邮箱SMTP端口号及服务器地址详细设置?

163邮箱SMTP端口号是什么&#xff1f;163邮件SMTP设置教程&#xff1f; 除了基本的邮箱账号和密码外&#xff0c;还需要了解SMTP服务器地址和端口号&#xff0c;以及相应的设置。这些设置对于确保邮件能够顺利发送至关重要。下面&#xff0c;蜂邮EDM将详细介绍163邮箱SMTP端口…

Ubuntu常用状态命令

目录 一、温度 1&#xff0c;查看CPU温度 2&#xff0c;查看硬盘温度 二、CPU状态 1&#xff0c;显示CPU的详细信息&#xff0c;包括型号、频率、缓存等 2&#xff0c;显示CPU架构、CPU核心数、线程数、频率等信息 三、登录状态 1&#xff0c;查看成功登录的用户 2&am…