微服務架構中的精妙設計:環境和工程搭建

?一.前期準備

1.1開發環境安裝

Oracle從JDK9開始每半年發布?個新版本, 新版本發布后, ?版本就不再進?維護. 但是會有?個?期維護的版本.
?前?期維護的版本有: JDK8, JDK11, JDK17, JDK21
在 JDK版本的選擇上,盡量選擇?期維護的版本.
為什么選擇JDK17?
Spring Cloud 是基于 SpringBoot 進?開發的, SpringBoot 3.X以下的版本, Spring官?已不再進?維護(還可以繼續使?), SpringBoot 3.X的版本, 使?的JDK版本基線為JDK17. 鑒于JDK21 是2023.09?發布的, 很多功能還沒有在?產環境驗證, 所以選擇使?JDK17來搭建

?Mysql安裝版本8.0即可

1.2分析需求

?個電商平臺包含的內容?常多, 以京東為例, 僅從首頁上就可以看到巨多的功能

我們該如何實現呢? 如果把這些功能全部寫在?個服務里, 這個服務將是巨?的.
巨多的會員, 巨?的流量, 微服務架構是最好的選擇.
微服務應用開發的第?步, 就是服務拆分. 拆分后才能進?"各自開發

1.3服務拆分原則

微服務到底多?才算"微", 這個在業界并沒有明確的標準. 微服務并不是越?越好, 服務越?, 微服務架構的優點和缺點都會越來越明顯.
服務越?, 微服務的獨?性就會越來越?, 但同時, 微服務的數量也會越多, 管理這些微服務的難度也會提?. 所以服務拆分也要考慮場景

1.3.1單?職責原則

單?職責原則原本是?向對象設計中的?個基本原則, 它指的是?個類應該專注于單?功能. 不要存在多于?個導致類變更的原因
在微服務架構中, ?個微服務也應該只負責?個功能或業務領域, 每個服務應該有清晰的定義和邊界, 只關注??的特定業務領域
組織團隊也是, ?個?專注做?件事情的效率遠高于同時關注多件事情

?比如電商系統:

1.3.2服務自治

服務?治是指每個微服務都應該具備?度?治的能?, 即每個服務要能做到獨?開發, 獨?測試, 獨?構建, 獨?部署, 獨?運?.(麻雀雖小,五臟俱全)
以上?的電商系統為例,每?個微服務應該有??的存儲, 配置,在進?開發, 構建, 部署, 運?和測試時,并不需要過多關注其他微服務的狀態和數據

1.3.3單向依賴

微服務之間需要做到單向依賴, 嚴禁循環依賴, 雙向依賴
  • 循環依賴: A -> B -> C ->A
  • 雙向依賴: A -> B, B ->?A

如果?些場景確實無法避免循環依賴或者雙向依賴, 可以考慮使用消息隊列等其他方式來實現

補充:

微服務架構并?標準架構, 合適的就是最好的
在架構設計的過程中, 堅持 "合適優于業界領先", 避免"過度設計"(為了設計?設計).

1.4設置需求

?個完整的電商系統是龐?的, 重點關注如何使?Spring Cloud解決微服務架構中遇到的問題
以訂單列表為例:
我們簡單來考慮, 這個列表提供了以下信息:
  • 訂單列表
  • 商品信息
根據服務的單?職責原則, 我們把服務進?拆分為: 訂單服務, 商品服務
訂單服務: 提供訂單ID, 獲取訂單詳細信息
商品服務: 根據商品ID, 返回商品詳細信息.

二.項目搭建

Spring Cloud 是基于SpringBoot搭建的, 所以Spring Cloud 版本與SpringBoot版本有關?

?該項?中使?的SpringBoot 版本為 3.1.6, 對應的Spring Cloud版本應該為2022.0.x, 選擇任?就可以

2.1數據準備

?根據服務自治原則, 每個服務都應有自己獨立的數據庫

訂單服務數據庫信息:
-- 訂單服務-- 建庫
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);

產品服務數據庫信息?

-- 產品服務
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);

2.2程搭建

?項目創建目前有兩種:

  • 使用JavaEE的方式,使用IDEA分別創建兩個項目,一個項目一個窗口(麻煩)
  • 采用父子工程的方式搭建(推薦)

1.創建父工程?

2.刪除src文件(因為不需要編寫代碼)

3.完善pom.xml文件信息

 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.6</version><relativePath/> <!-- lookup parent from repository --></parent><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>

補充:?

pom文件DependencyManagement Dependencies區別:?

dependencies :將所依賴的jar直接加到項?中. ?項?也會繼承該依賴?

dependencyManagement :dependencyManagement :只是聲明依賴, 并不實現Jar包引?. 如果?項?需要?到相關依賴,需要顯式聲明. 如果?項?沒有指定具體版本, 會從父項目中讀取version. 如果?項?中指定了版本號,就會使??項?中指定的jar版本. 此外父?程的打包?式應該是pom,不是jar, 這?需要?動使? packaging 來聲明.

4.創建兩個子項目(order-service , product-service)

??

?

?此時父項目的pom文件就會多出modul

5.給order.pom文件和 product.pom文件添加必要的依賴

<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>


?2.3編寫order服務

?1.給order子項目創建order包 - 編寫啟動類

package 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配置文件

開始編寫業務代碼

訂單服務:

  • 根據訂單ID,返回訂單詳情

3.先寫實體類

package 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.編寫mapper接口?

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

5,編寫service Service主要也是從mapper接口調用訂單的信息

package order.service;import order.mapper.OrderMapper;
import order.model.OrderInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;//注入這個接口public OrderInfo selectOrderById(Integer orderId){return orderMapper.selectOrderById(orderId);}
}

6.編寫controller 接口

package order.controller;import order.model.OrderInfo;
import 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);}
}

啟動項目失敗,

原因:忘記在mapper接口添加@Mapper注解

?7.項目啟動成功耶耶

2.4編寫product服務

給product子項目也跟上述操作類似(代碼就不粘貼了)

1.編寫啟動類

?2.配置yml文件(注意修改端口號成9090,數據庫名也要修改)

開始編寫業務代碼:

  • 根據商品ID,返回商品信息

?1.編寫實體類信息

2.編寫返回商品信息接口

?

3.編寫service層

4.編寫controller控制層

?5.啟動項目成功


?2.5遠程調用

實現兩個子項目進行交互,因為訂單信息里面肯定需要商品信息嘛

根據訂單查詢訂單信息時,根據訂單里產品ID,獲取產品的詳細信息

實現思路: order-service服務向product-service服務發送?個http請求, 把得到的返回結果, 和訂單結果融合在?起, 返回給調用方.


實現方式: 采用Spring 提供的RestTemplate?

1.在將product的實體類復制到order的實體類,并在order實體類添加product類信息

2.創建config包 -? 創建HTTP對象 -?定義RestTemplate

3.在servicec層使用http對象調用 ?

package order.service;import order.mapper.OrderMapper;
import order.model.OrderInfo;
import order.model.ProductInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;//注入這個接口@Autowiredprivate RestTemplate restTemplate;public 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;}
}

4.兩個項目都要啟動,然后調用order路徑就可以返回product的信息了

三.RestTemplate介紹

RestTemplate 是從 Spring3.0 開始?持的?個 HTTP 請求?具, 它是?個同步的 REST API 客?端, 提供了常見的REST請求方案的模版

?3.1什么是REST?

?REST(Representational State Transfer), 表現層資源狀態轉移.

可以把 REST 想象成一個大家都遵循的規則手冊,讓不同的軟件、系統之間能夠順暢地 “交流” 和 “合作”,就像人們說同一種語言能更好地溝通一樣。

這里面主要有三個概念:

  1. 資源: ?絡上的所有事物(文字,圖片,視頻等等)都可以抽象為資源, 每個資源都有?個唯?的資源標識符(URI)
  2. 表現層: 資源的表現形式, ?如?本作為資源, 可以?txt格式表現, 也可以通過HTML, XML, JSON等格式來表現, 甚?以?進制的格式表現.
  3. 狀態轉移: 訪問URI, 也就是客?端和服務器的交互過程. 客?端?到的?段,只能是HTTP協議. 這個過程中, 可能會涉及到數據狀態的變化. ?如對數據的增刪改查, 都是狀態的轉移

?REST 是?種設計?格, 指資源在?絡中以某種表現形式進?狀態轉移

簡單來說: REST描述的是在網絡中Client和Server的?種交互形式, REST本?不實?,實?的是如何設計 RESTful API(REST風格的?絡接?)

3.2什么是RESTful??

REST 是?種設計風格, 并沒有?個明確的標準. 滿足這種設計風格的程序或接?我們稱之為RESTful(從單詞字?來看就是?個形容詞). 所以RESTful API 就是滿?REST架構風格的接?.

?RESTful 風格大致有以下?個主要特征:

  • 資源: 資源可以是?個圖?, ?頻, 視頻或者JSON格式等?絡上的?個實體, 除了?些?進制的資源外普通的?本資源更多以JSON為載體、?向??的?組數據(通常從數據庫中查詢?得到)
  • 統?接?: 對資源的操作. ?如獲取, 創建, 修改和刪除. 這些操作正好對應HTTP協議提供的GET、POST、PUT和DELETE?法. 換??知,如果使?RESTful?格的接?, 從接?上你可能只能定位其資源,但是?法知曉它具體進?了什么操作,需要具體了解其發?了什么操作動作要從其HTTP請求?法類型上進?判斷

這些內容都是通過HTTP協議來呈現的. 所以RESTful是基于HTTP協議的,RestTemplate 是Spring提供, 封裝HTTP調用, 并強制使用RESTful風格. 它會處理HTTP連接和關閉,只需要使用者提供資源的地址和參數即可。

3.3RESTful實踐

RESTful?格的API 固然很好很規范, 但?多數互聯?公司并沒有按照其規則來設計, 因為REST是?種風格,而不是?種約束或規則, 過于理想的RESTful API 會付出太多的成本

?RESTful API 缺點:

  • 操作?式繁瑣,?RESTful API通常根據GET, POST, PUT, DELETE 來區分對資源的操作動作. 但是HTTP Method 并不可直接?到, 需要通過抓包等?具才能觀察. 如果把動作放在URL上反?更加直觀, 更利于團隊的理解和交流.
  • ?些瀏覽器對GET, POST之外的請求?持不太友好, 需要額外處理.
  • 過分強調資源. ?實際業務需求可能?較復雜, 并不能單純使?增刪改查就能滿?需求, 強?使?RESTful API會增加開發難度和成本

所以, 在實際開發中, 如果業務需求和RESTful API不太匹配或者很麻煩時, 也可以不?RESTful API. 如果使用場景和REST風格比較匹配, 就可以采用RESTful API.
總之: 無論哪種風格的API, 都是為了?便團隊開發, 協商以及管理, 不能墨守成規. 盡信書不如無書, 盡信規范不如無規范。

3.4總結?

REST:
想象有一個超級大的 “信息超市”,里面有各種各樣的 “商品”,這些 “商品” 就是資源。比如說有水果類的資源(像蘋果、香蕉),電器類的資源(像電視、冰箱),REST 就是這個 “信息超市” 里大家都遵守的一套規則,有了它,不管是誰來超市(不管是哪種客戶端),也不管超市是誰開的(不管是哪個服務器),大家都能按照統一的方式順暢地交易 “商品”(交換信息)。?

RESTful:
如果說 REST 是規則,那 RESTful 就是嚴格遵守這個規則的 “好超市”。這個 “好超市” 里的每一個 “商品” 都有清晰準確的標簽(唯一的 URI),工作人員和顧客交流時也完全按照規定的方式來(使用標準 HTTP 方法)。

RESTful 實踐:

資源標識:
給每一本書都分配一個獨一無二的編號,在網絡里就是 URI。比如/books/1?代表編號為 1 的書,這就像給書貼上了專屬標簽,方便大家查找。

HTTP 方法使用:

  • GET:你在網頁上輸入/books/1?并發送請求,就像你在書店里跟工作人員說 “我想看看編號為 1 的書的信息”,服務器會返回這本書的詳細信息,如書名、作者、價格等。
  • POST:你在網頁上填寫新書的信息并提交,就像你要把一本新書放到書店里賣。服務器接收到這個請求后,會創建一個新的圖書資源。
  • PUT:你發現編號為 1 的書價格寫錯了,于是修改價格后再次提交,這就像你在書店里把書的價格標簽換了。服務器會根據你提供的新信息更新這本書的資源。
  • DELETE:你覺得編號為 1 的書不再需要了,發送一個刪除請求,就像你把這本書從書店的貨架上拿走了。服務器會把對應的圖書資源刪除。

現在假設有一個在線書店,我們把它當作一個遵守 REST 規則的 “信息超市” 來實踐。

通過這些方式,在線書店就能高效地管理圖書信息,并且能和不同的用戶(客戶端)進行良好的交互,這就是 RESTful 實踐.

四.項目存在問題?

  • 遠程調?時, URL的IP和端?號是寫死的(http://127.0.0.1:9090/product/), 如果更換IP, 需要修改代
  • 調??如何可以不依賴服務提供?的IP? 如果多機部署, 如何分攤壓??
  • 遠程調?時, URL非常容易寫錯, ?且復?性不?, 如何優雅的實現遠程調?
  • 所有的服務都可以調用該接?, 是否有風險?

?微服務架構還面臨很多問題, 接下來我們學習如何使用Spring Cloud 來解決這些問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899629.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899629.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899629.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Maven 構建配置文件詳解

Maven 構建配置文件詳解 引言 Maven 是一個強大的項目管理和構建自動化工具,廣泛應用于 Java 開發領域。在 Maven 項目中,配置文件扮演著至關重要的角色。本文將詳細介紹 Maven 構建配置文件的相關知識,包括配置文件的作用、結構、配置方法等,幫助讀者更好地理解和應用 M…

【YOLO系列】基于YOLOv8的無人機野生動物檢測

基于YOLOv8的無人機野生動物檢測 1.前言 在野生動物保護、生態研究和環境監測領域&#xff0c;及時、準確地檢測和識別野生動物對于保護生物多樣性、預防人類與野生動物的沖突以及制定科學的保護策略至關重要。傳統的野生動物監測方法通常依賴于地面巡邏、固定攝像頭或無線傳…

Hive UDF開發實戰:構建高性能JSON生成器

目錄 一、背景與需求場景 二、開發環境準備 2.1 基礎工具棧 2.2 Maven依賴配置 三、核心代碼實現

分布式特性對比

以下是關于 分片(Sharding)、一致性哈希、兩階段提交(2PC)、Paxos、Raft協議、數據局部性 的對比分析與關聯性總結,涵蓋核心機制、適用場景及相互關系: 一、概念對比與關聯 概念核心目標關鍵特性典型應用場景與其它技術的關聯分片(Sharding)數據水平拆分按規則(哈希、…

歷史分鐘高頻數據

外盤期貨高頻分鐘歷史回測行情數據下載 鏈接: https://pan.baidu.com/s/1RUbAMxfiSyBlXfrwT_0n2w?pwdhgya 提取碼: hgya通過美國期貨高頻交易所歷史行情可以看到很多細節比如品種之一&#xff1a;FGBX_1min (1)在2024-02-29 11:14:00關鍵交易時刻&#xff0c;一筆大規模訂單突…

final+模版設計模式的理解

模板設計模式在 Java 里是一種行為設計模式&#xff0c;它在抽象類里定義算法的骨架&#xff0c;把部分步驟的具體實現延遲到子類。如此一來&#xff0c;子類可以在不改變算法結構的基礎上&#xff0c;重新定義算法中的特定步驟。 模式組成 抽象類&#xff08;Abstract Class…

JAVA接口調用限速器

目錄 1、并發限速 2、串行限速 需求&#xff1a;批量調用第三方ERP接口&#xff0c;對方接口限流時&#xff0c;減緩調用速率。 1、并發限速 Slf4j RestController public class ApiCallTask {//第三方接口Resourceprivate ErpService erpService;//異步線程池Resourcepriv…

STM32 CAN控制器硬件資源與用法

1、硬件結構圖 以STM32F4為例&#xff0c;他有2個can控制器&#xff0c;分別為 CAN1 CAN2。 每個CAN控制器&#xff0c;都有3個發送郵箱、2個接收fifo&#xff0c;每個接收fifo又由3個接收郵箱組成。也即每個CAN控制器都有9個郵箱&#xff0c;其中3個供發送用&#xff0c;3個…

【C++ 繼承】—— 青花分水、和而不同,繼承中的“明明德”與“止于至善”

歡迎來到ZyyOvO的博客?&#xff0c;一個關于探索技術的角落&#xff0c;記錄學習的點滴&#x1f4d6;&#xff0c;分享實用的技巧&#x1f6e0;?&#xff0c;偶爾還有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原創??&#xff0c;感謝支持??&#xff01;請尊重原創&#x1…

Qt warning LNK4042: 對象被多次指定;已忽略多余的指定

一、常規原因&#xff1a; pro或pri 文件中源文件被多次包含 解決&#xff1a;刪除變量 SOURCES 和 HEADERS 中重復條目 二、誤用 對于某些pri庫可以使用如下代碼簡寫包含 INCLUDEPATH $$PWDHEADERS $$PWD/*.hSOURCES $$PWD/*.cpp但是假如該目錄下只有頭文件&#xff0c;沒…

Visual Studio Code 無法打開源文件解決方法

&#x1f308; 個人主頁&#xff1a;Zfox_ &#x1f525; 系列專欄&#xff1a;Linux &#x1f525; 系列專欄&#xff1a;C從入門到精通 目錄 一&#xff1a;&#x1f525; 突發狀況 二&#xff1a;&#x1f525; 共勉 一&#xff1a;&#x1f525; 突發狀況 &#x1f42c;…

js文字兩端對齊

目錄 一、問題 二、原因及解決方法 三、總結 一、問題 1.text-align: justify; 不就可以了嗎&#xff1f;但是實際測試無效 二、原因及解決方法 1.原因&#xff1a;text-align只對非最后一行文字有效。只有一行文字時&#xff0c;text-align無效&#xff0c;要用text-alig…

LeetCode算法題(Go語言實現)_20

題目 給你兩個下標從 0 開始的整數數組 nums1 和 nums2 &#xff0c;請你返回一個長度為 2 的列表 answer &#xff0c;其中&#xff1a; answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整數組成的列表。 answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整數組成…

每天認識一個設計模式-橋接模式:在抽象與實現的平行宇宙架起彩虹橋

一、前言&#xff1a;虛擬機橋接的啟示 使用過VMware或者Docker的同學們應該都接觸過網絡橋接&#xff0c;在虛擬機網絡配置里&#xff0c;橋接模式是常用的網絡連接方式。選擇橋接模式時&#xff0c;虛擬機會通過虛擬交換機與物理網卡相連&#xff0c;獲取同網段 IP 地址&…

java筆記02

運算符 1.隱式轉換和強制轉換 類型轉換的分類 1.隱式轉換&#xff1a; 取值范圍小的數值 轉換為 取值范圍大的數值 2.強制轉換&#xff1a; 取值范圍大的數值 轉換為 取值范圍小的數值隱式轉換的兩種提升規則 取值范圍小的&#xff0c;和取值范圍大的進行運算&#xff0c;小的…

Redis-07.Redis常用命令-集合操作命令

一.集合操作命令 SADD key member1 [member2]&#xff1a; sadd set1 a b c d sadd set1 a 0表示沒有添加成功&#xff0c;因為集合中已經有了這個元素了&#xff0c;因此無法重復添加。 SMEMBERS key: smembers set1 SCARD key&#xff1a; scard set1 SADD key member1 …

李飛飛、吳佳俊團隊新作:FlowMo如何以零卷積、零對抗損失實現ImageNet重構新巔峰

目錄 一、摘要 二、引言 三、相關工作 四、方法 基于擴散先前的離散標記化器利用廣告 架構 階段 1A&#xff1a;模式匹配預訓練 階段 1B&#xff1a;模式搜索后訓練 采樣 第二階段&#xff1a;潛在生成建模 五、Coovally AI模型訓練與應用平臺 六、實驗 主要結果 …

CSS3:現代Web設計的魔法卷軸

一、布局革命&#xff1a;從平面到多維空間 1.1 Grid布局的次元突破 星際戰艦布局系統 .galaxy {display: grid;grid-template-areas: "nav nav nav""sidebar content ads""footer footer footer";grid-template-rows: 80px 1fr 120p…

美觀快速的react 的admin框架

系統特色&#xff1a; - &#x1f3a8; 精心設計的UI主題系統&#xff0c;提供優雅的配色方案和視覺體驗 - &#x1f4e6; 豐富完整的組件庫&#xff0c;包含大量開箱即用的高質量組件 - &#x1f528; 詳盡的組件使用示例&#xff0c;降低開發者的學習成本 - &#x1f680…

【C++】 string底層封裝的模擬實現

目錄 前情提要Member functions —— 成員函數構造函數拷貝構造函數賦值運算符重載析構函數 Element access —— 元素訪問Iterator —— 迭代器Capacity —— 容量sizecapacityclearemptyreserveresize Modifiers —— 修改器push_backappendoperator(char ch)operator(const …