SpringCloud 环境工程搭建

SpringCloud 环境&工程搭建

文章目录

  • SpringCloud 环境&工程搭建
    • 1. SpringCloud介绍
    • 2. 服务拆分原则
      • 2.1 单一职责原则
      • 2.2 服务自治
      • 2.3 单向依赖
      • 2.4 服务拆分示例
    • 3. 数据准备
    • 4. 工程搭建
      • 4.1 创建父工程
      • 4.2 创建子工程
        • 4.2.1 子项目-订单服务
        • 4.2.2 子项目-商品服务
      • 4.3 完善子工程
        • 4.3.1 完善订单服务
        • 4.3.2 完善商品服务
    • 5. 远程调用

1. SpringCloud介绍

SpringCloud 提供了一些可以让开发人员快速搭建分布式服务的工具,比如配置管理、服务发现、熔断、智能路由等,它们可以在任何分布式环境中很好的工作:

在这里插入图片描述

更直接的讲,SpringCloud 介绍分布式微服务架构的一站式解决方案,是微服务架构落地的多种技术的集合,比如:

  • Distributed/versioned configuration 分布式版本配置
  • Service registration and discovery 服务注册和发现
  • Load balancing 负载均衡
  • Service-to-service calls 服务调用

同时,SrpingCloud的所有子项目都依赖于SpringBoot,所以SpringBoot和SpringCloud的版本之间也存在一定的对应关系,在使用时需要注意彼此间的对应匹配:

在这里插入图片描述

2. 服务拆分原则

拆分微服务一般遵循如下原则:

2.1 单一职责原则

在微服务架构中,一个微服务应该只负责一个功能或业务领域,每个服务应该有清晰的定义和边界,只关注自己的特定业务领域。

比较类似于,一个人专注的做一件事的效率远高于同时关注多件事情,而业务中如电商系统也是由多个服务共同构成的:

在这里插入图片描述

2.2 服务自治

服务自治是指每个微服务都应该具备高度自治的能力,即每个服务要能做到独立开发,独立测试,独立构建,独立部署,独立运行。

以上面的电商系统为例,每一个微服务应该有自己的存储、配置,在进行开发、构建、部署、运行和测试时,并不需要过多关注其它微服务的状态和数据:

在这里插入图片描述

2.3 单向依赖

微服务之间需要做到单向依赖,严禁导致循环依赖、双向依赖:

在这里插入图片描述

在特定场景下如果无法避免循环依赖或双向依赖,可以考虑使用消息队列等其它方式来实现。

注:微服务并无标准架构,合适的就是最好的,在架构设计的过程中,坚持”合适由于业界领先“,避免为了设计而设计

2.4 服务拆分示例

我们以电商系统中的一个管理服务为例,即订单管理

在这里插入图片描述

概括的讲,这个页面提供了以下信息:

  1. 订单列表
  2. 商品信息

根据服务的单一职责原则,我们把服务拆分为:

  • 订单服务:提供订单ID,获取订单详细信息
  • 商品服务:根据商品ID,返回商品详细信息

在这里插入图片描述

3. 数据准备

对于上述案例,我们使用JDK-17版本MySQL8版本进行构造,这里需要提前配置好。

根据服务自治原则,每个服务都应有自己独立的数据库。

订单服务:

-- 订单服务-- 建库
create database if not exists cloud_order charset utf8mb4;use cloud_order;
-- 订单表
DROP TABLE IF EXISTS order_detail;
CREATE TABLE order_detail (`id` INT NOT NULL AUTO_INCREMENT COMMENT '订单id',`user_id` BIGINT ( 20 ) NOT NULL COMMENT '用户ID',`product_id` BIGINT ( 20 ) NULL COMMENT '产品id',`num` INT ( 10 ) NULL DEFAULT 0 COMMENT '下单数量',`price` BIGINT ( 20 ) NOT NULL COMMENT '实付款',`delete_flag` TINYINT ( 4 ) NULL DEFAULT 0,`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now(),
PRIMARY KEY ( id )) ENGINE = INNODB DEFAULT CHARACTER 
SET = utf8mb4 COMMENT = '订单表';-- 数据初始化
insert into order_detail (user_id,product_id,num,price)
values
(2001, 1001,1,99), (2002, 1002,1,30), (2001, 1003,1,40),
(2003, 1004,3,58), (2004, 1005,7,85), (2005, 1006,7,94);

商品服务:

-- 数据初始化
insert into order_detail (user_id,product_id,num,price)
values
(2001, 1001,1,99), (2002, 1002,1,30), (2001, 1003,1,40),
(2003, 1004,3,58), (2004, 1005,7,85), (2005, 1006,7,94);-- 产品服务
create database if not exists cloud_product charset utf8mb4;-- 产品表
use cloud_product;
DROP TABLE IF EXISTS product_detail;
CREATE TABLE product_detail (`id` INT NOT NULL AUTO_INCREMENT COMMENT '产品id',`product_name` varchar ( 128 ) NULL COMMENT '产品名称',`product_price` BIGINT ( 20 ) NOT NULL COMMENT '产品价格',`state` TINYINT ( 4 ) NULL DEFAULT 0 COMMENT '产品状态 0-有效 1-下架',`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now(),
PRIMARY KEY ( id )) ENGINE = INNODB DEFAULT CHARACTER 
SET = utf8mb4 COMMENT = '产品表';-- 数据初始化
insert into product_detail (id, product_name,product_price,state)
values
(1001,"T恤", 101, 0), (1002, "短袖",30, 0), (1003, "短裤",44, 0), 
(1004, "卫衣",58, 0), (1005, "马甲",98, 0),(1006,"羽绒服", 101, 0), 
(1007, "冲锋衣",30, 0), (1008, "袜子",44, 0), (1009, "鞋子",58, 0),
(10010, "毛衣",98, 0);

4. 工程搭建

在这个案例中,我们使用父子工程的方式来创建项目

4.1 创建父工程

  1. 先创建一个空的Maven项目,删除所有代码,只保留pom.xml
    在这里插入图片描述

  2. 完善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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>spring-cloud-demo</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.6</version><relativePath/> <!-- lookup parent from repository --></parent><packaging>pom</packaging><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><java.version>17</java.version><mybatis.version>3.0.3</mybatis.version><mysql.version>8.0.33</mysql.version><spring-cloud.version>2022.0.3</spring-cloud.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></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><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>${mybatis.version}</version><scope>test</scope></dependency></dependencies></dependencyManagement>
    </project>
    

    :我们这里使用到了dependencyMangement来进行声明依赖,并不实现jar包的引入。如果子项目需要用到相关依赖,需要显式声明(也需要引入);如果子项目没有指定具体版本,会从父项目中读取version。如果子项目中指定了版本号,就会使用子项目中指定的jar版本。此外父工程的打包方式应该是pom,不是jar,这里需要手动使用packagin来声明.

    SpringCloud版本需要于Springboot版本对应,我们这里Springboot使用的是3.1.6版本,对应的SpringCloud版本则需使用2022.0.x中的任意版本即可:

    在这里插入图片描述

4.2 创建子工程

4.2.1 子项目-订单服务

在这里插入图片描述

构建order-service子工程:

在这里插入图片描述

声明 项目依赖项目构建插件

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency>
</dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/**</include></includes></resource></resources>
</build>
4.2.2 子项目-商品服务

构建 product-service 子工程

在这里插入图片描述

声明 项目依赖项目构建插件

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency>
</dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/**</include></includes></resource></resources>
</build>

4.3 完善子工程

4.3.1 完善订单服务

实现以下目录结构:

在这里插入图片描述

  1. 完善启动类

    package com.order;import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
    public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
    }
    
  2. 配置文件 application.yml

    server:port: 8080
    spring:datasource:url: jdbc:mysql://127.0.0.1/cloud_order?characterEncoding=utf8&useSSL=falseusername: rootpassword: 11111driver-class-name: com.mysql.cj.jdbc.Driver
    # 设置 Mybatis 的 xml 保存路径
    mybatis:mapper-locations: classpath:mapper/*Mapper.xmlconfiguration: # 配置打印 MyBatis 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true  #自动驼峰转换
    
  3. 构建实体类

    package com.order.model;import lombok.Data;import java.util.Date;@Data
    public class OrderInfo {private Integer id;private Integer userId;private Integer productId;private Integer num;private Integer price;private Integer deleteFlag;private Date createTime;private Date updateTime;
    }
    
  4. Controller层

    package com.order.controller;import com.order.model.OrderInfo;
    import com.order.service.OrderService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;@RequestMapping("/order")
    @RestController
    public class OrderController {@Autowiredprivate OrderService orderService;@RequestMapping("/{orderId}")public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId) {return orderService.selectOrderById(orderId);}}
    
  5. Service层

    // OrderService
    package com.order.service;import com.order.model.OrderInfo;public interface OrderService {OrderInfo selectOrderById(Integer orderId);
    }// OrderServiceImpl
    package com.order.service.Impl;import com.order.mapper.OrderMapper;
    import com.order.model.OrderInfo;
    import com.order.service.OrderService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;@Service
    public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;@Overridepublic OrderInfo selectOrderById(Integer orderId) {OrderInfo orderInfo = orderMapper.selectOrderById(orderId);return orderInfo;}
    }
    
  6. Mapper层

    package com.order.mapper;import com.order.model.OrderInfo;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;@Mapper
    public interface OrderMapper {@Select("select * from order_detail where id = #{orderId}")OrderInfo selectOrderById(Integer orderId);
    }
    

完善好上述代码后,我们来启动测试一下:

在这里插入图片描述

运行成功!

4.3.2 完善商品服务

实现以下目录:

在这里插入图片描述

  1. 完善启动类

    package com.product;import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
    public class ProductServiceApplication {public static void main(String[] args) {SpringApplication.run(ProductServiceApplication.class, args);}
    }
    
  2. 配置文件 application.yml

    server:port: 9090
    spring:datasource:url: jdbc:mysql://127.0.0.1/cloud_product?characterEncoding=utf8&useSSL=falseusername: rootpassword: 11111driver-class-name: com.mysql.cj.jdbc.Driver
    # 设置 Mybatis 的 xml 保存路径
    mybatis:mapper-locations: classpath:mapper/*Mapper.xmlconfiguration: # 配置打印 MyBatis 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true  #自动驼峰转换
    
  3. 构建实体类

    package com.product.model;import lombok.Data;import java.util.Date;@Data
    public class ProductInfo {private Integer id;private String productName;private Integer productPrice;private Integer state;private Date createTime;private Date updateTime;
    }
    
  4. Controller层

    package com.product.controller;import com.product.model.ProductInfo;
    import com.product.service.ProductService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;@RequestMapping("/product")
    @RestController
    public class ProductController {@Autowiredprivate ProductService productService;@RequestMapping("/{productId}")public ProductInfo getProductById(@PathVariable("productId") Integer productId) {return productService.selectProductById(productId);}
    }
    
  5. Service层

    // ProductService
    package com.product.service;import com.product.model.ProductInfo;public interface ProductService {ProductInfo selectProductById(Integer productId);
    }// ProductServiceImpl
    package com.product.service.Impl;import com.product.mapper.ProductMapper;
    import com.product.model.ProductInfo;
    import com.product.service.ProductService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;@Service
    public class ProductServiceImpl implements ProductService {@Autowiredprivate ProductMapper productMapper;@Overridepublic ProductInfo selectProductById(Integer productId) {return productMapper.selectProductById(productId);}
    }
  6. Mapper层

    package com.product.mapper;import com.product.model.ProductInfo;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;@Mapper
    public interface ProductMapper {@Select("select * from product_detail where id = #{productId}")ProductInfo selectProductById(Integer productId);
    }
    

    完善好上述代码后,我们来启动测试一下:

    在这里插入图片描述

运行成功!

5. 远程调用

此时我们有一个需求,即根据订单查询订单信息时,根据订单里的产品ID来获取产品的详细信息:

在这里插入图片描述

我们可以通过远程调用的方式来实现:

实现思路order-service服务向product-service服务发送一个http请求,把得到的返回结果和订单结果融合在一起,返回给调用方;

实现方式:采用Spring提供的 RestTemplate 实现请求发送

  1. 定义RestTemplate

    package com.order.config;import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;@Configuration
    public class BeanConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}}
    
  2. 引入并在OrderInfo中添加ProductInfo

    package com.order.model;import lombok.Data;import java.util.Date;@Data
    public class OrderInfo {private Integer id;private Integer userId;private Integer productId;private Integer num;private Integer price;private Integer deleteFlag;private Date createTime;private Date updateTime;private ProductInfo productInfo;
    }
    
  3. 修改OrderServiceImpl

    package com.order.service.Impl;import com.order.mapper.OrderMapper;
    import com.order.model.OrderInfo;
    import com.order.model.ProductInfo;
    import com.order.service.OrderService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;@Service
    public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;@Overridepublic OrderInfo selectOrderById(Integer orderId) {OrderInfo orderInfo = orderMapper.selectOrderById(orderId);String url = "http://127.0.0.1:9090/product/" + orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
    }
    

    此时访问127.0.0.1:8080/order/1测试结果:

    在这里插入图片描述

测试成功!!
我们也可以看到上面在进行远程调用时URL的IP和端口号是写死的(http://127.0.0.1:9090/product/),如果这个时候我们要更换IP了,原本部署完毕的程序就需要重新修改再部署,这样就会导致很多的问题,对此也能使用SrpingCloud来这个解决问题,敬请期待!!

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

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

相关文章

Django cursor()增删改查和shell环境执行脚本

在Django中&#xff0c;cursor()方法是DatabaseWrapper对象&#xff08;由django.db.connectio提供&#xff09;的一个方法&#xff0c;用于创建一个游标对象。这个游标对象可以用来执行SQL命令&#xff0c;从而实现对数据库的增删改查操作。 查询&#xff08;Select&#xff0…

四、GD32 MCU 常见外设介绍 (4) EXTI 中断介绍

4.EXTI 中断介绍 EXTI(中断/事件控制器)包含多个相互独立的边沿检测电路并且能够向处理器内核产生中断请求或唤醒事件。 EXTI 有三种触发类型&#xff1a;上升沿触发、下降沿触发和任意沿触发。 EXTI中的每一个边沿检测电路都可以独立配置和屏蔽。 4.1.GD32 EXTI 外设原理简介…

自动驾驶---视觉Transformer的应用

1 背景 在过去的几年&#xff0c;随着自动驾驶技术的不断发展&#xff0c;神经网络逐渐进入人们的视野。Transformer的应用也越来越广泛&#xff0c;逐步走向自动驾驶技术的前沿。笔者也在博客《人工智能---什么是Transformer?》中大概介绍了Transformer的一些内容&#xff1a…

setsockopt选项对tcp速度

GPT-4 (OpenAI) 每个setsockopt调用都涉及到一个套接字描述符&#xff0c;一个指定网络层的常数&#xff08;如IPPROTO_IP, IPPROTO_TCP, IPPROTO_IPV6, SOL_SOCKET等&#xff09;&#xff0c;一个指定需配置的选项的常数&#xff0c;一个指向配置值的指针&#xff0c;以及那个…

时钟芯片LMK04828调试记录

平台&#xff1a;vivado2018.3 芯片&#xff1a;LMK04828 应用场景&#xff1a;在一些高速ADC和DAC的芯片中&#xff0c;需要时钟芯片对其提供专用的高速时钟&#xff0c;并且往往伴随这jesd204b的时钟产生。所以使用时钟芯片来产生同源时钟。 官方手册下载地址 LMK04828 数…

粘包问题、mmap和分片上传

一、粘包问题&#xff1a; 如果一端要把文件发给另一端&#xff0c;要发送两个部分的数据&#xff1a;其一是文件名&#xff0c;用于对端创建文件&#xff1b;另一个部分是文件内容。服务端在接收文件名&#xff0c;实际上并不知道有多长&#xff0c; 所以它会试图把网络缓冲区…

Anaconda下安装配置Jupyter

Anaconda下安装配置Jupyter 1、安装 conda activate my_env #激活虚拟环境 pip install jupyter #安装 jupyter notebook --generate-config #生成配置文件提示配置文件的位置&#xff1a; Writing default config to: /root/.jupyter/jupyter_notebook_config.py检查版本&am…

android studio中svn的使用

第一步&#xff0c;建立一个项目。 第二步&#xff0c;share project。 第三步&#xff0c;选择存放的位置&#xff0c;然后添加提交信息&#xff0c;最后点击share。这样就可以在svn上面看到一个空的项目名称。 第四步&#xff0c;看到文件变成了绿色&#xff0c;点击commit图…

来聊聊redis集群数据迁移

写在文章开头 本文将是笔者对于redis源码分析的一个阶段的最后一篇&#xff0c;将从源码分析的角度让读者深入了解redis节点迁移的工作流程&#xff0c;希望对你有帮助。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CS…

华为OD机考题(HJ61 放苹果)

前言 经过前期的数据结构和算法学习&#xff0c;开始以OD机考题作为练习题&#xff0c;继续加强下熟练程度。 描述 把m个同样的苹果放在n个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问共有多少种不同的分法&#xff1f; 注意&#xff1a;如果有7个苹果和3…

C语言 | Leetcode C语言题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; int hIndex(int* citations, int citationsSize) {int left 0, right citationsSize - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > citationsSize - mid) {right mid - 1;} else {left mi…

Java 中的线程

创建线程的三种方式 方式一&#xff1a;继承Thread类 实现步骤&#xff1a; 继承Thread类并重写run()方法&#xff1b; 创建线程并启动。 代码实现&#xff1a; public class MyThread extends Thread {Overridepublic void run() {for(int i0; i<100; i) {System.out…

DB-GPT:LLM应用的集大成者

整体架构 架构解读 可以看到&#xff0c;DB-GPT把架构抽象为7层&#xff0c;自下而上分别为&#xff1a; 运行环境&#xff1a;支持本地/云端&单机/分布式等部署方式。顺便一提&#xff0c;RAY是蚂蚁深度参与的一个开源项目&#xff0c;所以对RAY功能的支持应该非常完善。…

Vue自定义指令与Vue插槽学习

文章目录 自定义指令1.指令介绍2.自定义指令3.自定义指令语法4.指令中的配置项 自定义指令-指令的值1.使用效果2.语法 插槽-默认插槽1.作用2.用处4.插槽的基本语法 插槽-具名插槽1.作用2.具名插槽语法3.v-slot的简写 插槽总结1.插槽分类2.作用3.场景4.使用步骤 自定义指令 1.指…

实现Nginx的反向代理和负载均衡

一、反向代理和负载均衡简介 1.1、反向代理 反向代理(reverse proxy)指:以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端。此时代理服务器对外就表现为一个反向代理服务器。 反向代…

【Android Compose】ListView效果

【Android Compose】ListView效果 1、Column、Row 和 Box2、LazyColumn和LazyRow3、Compose 中的状态4、ListView效果5、android-compose-codelabs Jetpack Compose 使用入门 Jetpack Compose 教程 Jetpack Compose 1、Column、Row 和 Box Compose 中的三个基本标准布局元素是 …

算法day05 master公式估算递归时间复杂度 归并排序 小和问题 堆排序

2.认识O(NlogN)的排序_哔哩哔哩_bilibili master公式 有这样一个数组&#xff1a;【0&#xff0c;4&#xff0c;2&#xff0c;3&#xff0c;3&#xff0c;1&#xff0c;2】&#xff1b;假设实现了这样一个sort()排序方法&#xff0c; 将数组二分成左右两等分&#xff0c;使用so…

linux、windows、macos,命令终端清屏

文章目录 LinuxWindowsmacOS 在Linux、Windows和macOS的命令终端中&#xff0c;清屏的命令或方法各不相同。以下是针对这三种系统的清屏方法&#xff1a; Linux clear命令&#xff1a;这是最常用的清空终端屏幕的命令之一。在终端中输入clear命令后&#xff0c;屏幕上的所有内容…

【计算机网络】TCP/IP——流量控制与拥塞控制

学习日期&#xff1a;2024.7.22 内容摘要&#xff1a;TCP的流量控制与拥塞控制 流量控制 一般来说&#xff0c;我们总是希望数据传输的快一些&#xff0c;但是如果数据传输的太快&#xff0c;接收方可能就来不及接收&#xff0c;这就会导致数据的丢失&#xff0c;流量控制正是…

Vue中渲染函数

why? 在绝大多数情况下&#xff0c;Vue 推荐使用模板语法来创建应用。然而在某些使用场景下&#xff0c;我们真的需要用到 JavaScript 完全的编程能力。这时渲染函数就派上用场了。 例如&#xff1a;下方要在多个模型上方设置对话框&#xff0c;如果使用Vue模板语法相对较困难…