3.Spring Cloud LoadBalancer 入門與使用

3.Spring Cloud LoadBalancer 入門與使用

  • 1.什么是 LoadBalancer?
    • 1.1負載均衡分類
    • 1.2 常見負載均衡策略
  • 2.為什么要學 LoadBalancer?
  • 3.如何使用?
  • 4.默認負載均衡策略
  • 5.隨機負載均策略
    • 5.1 創建隨機負載均衡器
    • 5.2 設置隨機負載均衡器 (局部設置)
    • 5.3 設置全局負載均衡器
  • 6.Nacos 權重負載均器
    • 6.1 創建 Nacos 負載均衡器
    • 6.2 設置負載均衡器
  • 7.自定義負載均衡器
    • 7.1 創建自定義負載均衡器
    • 7.2 封裝自定義負載均衡器
    • 7.3 設置自定義負載均器
  • 8.緩存
    • 關閉緩存
  • 9.執行原理
      • 底層執行原理
        • 1. `ServiceInstanceListSupplier`
        • 2. `LoadBalancerClient`
        • 3. `LoadBalancer`
      • 執行流程
      • 源碼示例
      • 總結

1.什么是 LoadBalancer?

LoadBalancer(負載均衡器)是一種網絡設備或軟件機制,用于分發傳入的網絡流量負載(請求)到多個后端目標服務器上,從而實現系統資源的均衡利用和提高系統的可用性和性能。

1.1負載均衡分類

負載均衡分為服務器端負載均衡和客戶端負載均衡。

  1. 服務器端負載均衡指的是存放在服務器端的負載均衡器,例如 Nginx、HAProxy、F5 等.
  2. 客戶端負載均衡指的是嵌套在客戶端的負載均衡器,例如 Ribbon、Spring Cloud LoadBalancer。

1.2 常見負載均衡策略

在這里插入圖片描述
但無論是服務器端負載均衡和客戶端負載均衡,它們的負載均衡策略都是相同的,因為負載均衡策略本質上是一種思想。
常見的負載均衡策略有以下幾個:

  1. 輪詢(Round Robin):輪詢策略按照順序將每個新的請求分發給后端服務器,依次循環。這是一種最簡單的負載均衡策略,適用于后端服務器的性能相近,且每個請求的處理時間大致相同的情況。
  2. 隨機選擇(Random):隨機選擇策略隨機選擇一個后端服務器來處理每個新的請求。這種策略適用于后端服2務器性能相似,且每個請求的處理時間相近的情況,但不保證請求的分發是均的。
  3. 最少連接(Least Connections):最少連接策略將請求分發給當前連接數最少的后端服務器。這可以確保負載均衡在后端服務器的連接負載上均衡,但需要維護連接計數。
  4. IP 哈希(IP Hash):IP 哈希策略使用客戶端的 IP 地址來計算哈希值,然后將請求發送到與哈希值對應的后端服務器。這種策略可用于確保來自同一客戶端的請求都被發送到同一臺后端服務器,適用于需要會話保持的情況。
  5. 加權輪詢(Weighted Round Robin):加權輪詢策略給每個后端服務器分配一個權重值,然后按照權重值比例來分發請求。這可以用來處理后端服務器性能不均衡的情況,將更多的請求分發給性能更高的服務器。
  6. 加權隨機選擇(Weighted Random):加權隨機選擇策略與加權輪詢類似,但是按照權重值來隨機選擇后端服務器。這也可以用來處理后端服務器性能不均衡的情況,但是分發更隨機。
  7. 最短響應時間(Least Response Time):最短響應時間策略會測量每個后端服務器的響應時間,并將請求發送到響應時間最短的服務器。這種策略可以確保客戶端獲得最快的響應,適用于要求低延遲的應用。

2.為什么要學 LoadBalancer?

作為早期版本中內置的負載均衡器 Ribbon,在 Spring Cloud 2020.0.0 中已經被移除了,更新日志詳見,https://github.com/spring-cloud/spring-cloud-release/wiki/Spring-Cloud-2020.0-Release-Notes取而代之的是 Spring Cloud LoadBalancer,并日它也是 Spring cloud 官方提供的負載均衛器,所以咱們的課程就要學習最新最主流的機制棧,而 Spring Cloud LoadBalancer 則是繞不過去的必學知識。

3.如何使用?

在項目中添加 Spring Cloud OpenFeign 和注冊中心如 Nacos 之后,再添加 Spring Cloud LoadBalancer 則會在進行接口調用時直接使用 Spring Cloud LoadBalancer。

4.默認負載均衡策略

Spring Cloud LoadBalancer 負載均衡策略默認的是輪詢,這一點可以通過 Spring Cloud LoadBalancer 的配置類LoadBalancerClientConfiguration 中發現,它的部分源碼如下:

public class LoadBalancerClientConfiguration {private static final int REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER = 193827465;@Bean@ConditionalOnMissingBeanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}

繼續查看 RoundRobinLoadBalancer 核心實現源碼如下:

	private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {if (instances.isEmpty()) {if (log.isWarnEnabled()) {log.warn("No servers available for service: " + serviceId);}return new EmptyResponse();}// Do not move position when there is only 1 instance, especially some suppliers// have already filtered instancesif (instances.size() == 1) {return new DefaultResponse(instances.get(0));}// Ignore the sign bit, this allows pos to loop sequentially from 0 to// Integer.MAX_VALUEint pos = this.position.incrementAndGet() & Integer.MAX_VALUE;ServiceInstance instance = instances.get(pos % instances.size());return new DefaultResponse(instance);}

在這里插入圖片描述

5.隨機負載均策略

Spring Cloud LoadBalancer 內置了兩種負載均衡策略

  1. 輪詢負載均衡策略,默認負載均衡策略。
  2. 隨機負載均衡策略

而要實現隨機負載均衡策略的步驟如下:

  1. 創建隨機負載均衡策略。
  2. 設置隨機負載均衡策略。
    在這里插入圖片描述
    在這里插入圖片描述

5.1 創建隨機負載均衡器

public class RandomLoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name,ServiceInstanceListSupplier.class), name);}
}

5.2 設置隨機負載均衡器 (局部設置)

package com.example.consumer.service;import com.example.consumer.config.CustomLoadBalancerConfig;
import com.example.consumer.config.NacosLoadBalancerConfig;
import com.example.consumer.config.RandomLoadBalancerConfig;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;@Service
@FeignClient("loadbalancer-service")
// 設置局部負載均衡策略
@LoadBalancerClient(name = "loadbalancer-service",configuration = RandomLoadBalancerConfig.class)
public interface UserService {@RequestMapping("/user/getname")String getName(@RequestParam("id") Integer id);
}

5.3 設置全局負載均衡器

package com.example.consumer;import com.example.consumer.config.CustomLoadBalancerConfig;
import com.example.consumer.config.RandomLoadBalancerConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableFeignClients // 開啟 Openfeign
// 設置全局的負載均衡策略
@LoadBalancerClients(defaultConfiguration =RandomLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

6.Nacos 權重負載均器

Nacos 中支持兩種負載均衡器,一種是權重負載均衡器,另一種是第三方 CMDB(地域就近訪問)標簽負載均後器,我們可以將 Spring Cloud Loadbalancer 直接配置為 Nacos 的負載均衡器,它默認就是權重負載均衡策略。它的配置有以下兩步:

  1. 創建 Nacos 負載均衡器
  2. 設置負載均衡器
    在這里插入圖片描述

6.1 創建 Nacos 負載均衡器

@LoadBalancerClients(defaultConfiguration = NacosLoadBalancerConfig.class)
public class NacosLoadBalancerConfig {@Resourceprivate NacosDiscoveryProperties nacosDiscoveryProperties;@Beanpublic ReactorLoadBalancer<ServiceInstance> nacosLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name,ServiceInstanceListSupplier.class), name,nacosDiscoveryProperties);}
}

6.2 設置負載均衡器

@SpringBootApplication
@EnableFeignClients // 開啟 Openfeign
// 設置全局的負載均衡策略
@LoadBalancerClients(defaultConfiguration =NacosLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

7.自定義負載均衡器

實現自定義負載均衡策略需要以下 3步:

  1. 創建自定義負載均衡器
  2. 封裝自定義負載均衡器
  3. 為服務設置自定義負載均衡器

7.1 創建自定義負載均衡器

package com.example.consumer.config;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.DefaultResponse;
import org.springframework.cloud.client.loadbalancer.EmptyResponse;
import org.springframework.cloud.client.loadbalancer.Request;
import org.springframework.cloud.client.loadbalancer.Response;
import org.springframework.cloud.loadbalancer.core.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import reactor.core.publisher.Mono;import java.util.List;public class CustomLoadBalancer implements ReactorServiceInstanceLoadBalancer {private static final Log log = LogFactory.getLog(RandomLoadBalancer.class);private final String serviceId;private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;public CustomLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId) {this.serviceId = serviceId;this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;}public Mono<Response<ServiceInstance>> choose(Request request) {ServiceInstanceListSupplier supplier = (ServiceInstanceListSupplier)this.serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);return supplier.get(request).next().map((serviceInstances) -> {return this.processInstanceResponse(supplier, serviceInstances);});}private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier, List<ServiceInstance> serviceInstances) {Response<ServiceInstance> serviceInstanceResponse = this.getInstanceResponse(serviceInstances);if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {((SelectedInstanceCallback)supplier).selectedServiceInstance((ServiceInstance)serviceInstanceResponse.getServer());}return serviceInstanceResponse;}private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {if (instances.isEmpty()) {if (log.isWarnEnabled()) {log.warn("No servers available for service: " + this.serviceId);}return new EmptyResponse();} else {// 核心:自定義隨機策略// 獲取 Request 對象ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String ipAddress = request.getRemoteAddr();System.out.println("用戶 IP:" + ipAddress);int hash = ipAddress.hashCode();// 自定義負載均衡策略【這行代碼是關鍵】int index = hash % instances.size();// 得到服務實例方法ServiceInstance instance = (ServiceInstance) instances.get(index);return new DefaultResponse(instance);}}
}

7.2 封裝自定義負載均衡器

public class CustomLoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> customLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new CustomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name,ServiceInstanceListSupplier.class), name);}
}

7.3 設置自定義負載均器

@SpringBootApplication
@EnableFeignClients // 開啟 Openfeign
// 設置全局的負載均衡策略
@LoadBalancerClients(defaultConfiguration =CustomLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

8.緩存

Spring Cloud LoadBalancer 在獲取實例時有兩種選擇:

  1. 即時獲取:每次從注冊中心得到最新健康的實例,效果好、開銷太大。
  2. 緩存服務列表:每次得到服務列表之后,緩存一段時間,這樣既能保證性能,同時也能兼容一定的及時性。而 Spring Cloud LoadBalancer 中默認開啟了緩存服務列表的功能。Spring

Cloud LoadBalancer 默認緩存的重要特性有兩項:

  1. 緩存的過期時間為 35s。
  2. 緩存保存個數為 256 個
    我們可以通過以下配置來改變這些配置:

關閉緩存

    loadbalancer:cache:enabled: true # 關閉 loadbalancer 緩存ttl: 10 # 緩存存活時間capacity: 1000 # 緩存存儲容量

9.執行原理

OpenFeign 底層是通過 HTTP 客戶端對象 RestTemplate 實現接口請求的,而負載均衡器的作用只是在請求客戶端發送請求之前,得到一個服務的地址給到 RestTemplate 對象,而 Spring Cloud LoadBalancer 的整體類圖如下:
在這里插入圖片描述

通過查看 Spring Cloud LoadBalancer 源碼我們可以發現,@LoadBalanced 注解出 spring-cloud-commons 實現查看實現邏輯我們發現, spring-cloud-commons 存在自動配置類 LoadBalancerAutoConfiquration,當滿足條件時將自動創建 LoadBalancerInterceptor 并注入到 RestTemplate 中,部分源碼如下:

Spring Cloud LoadBalancer 是 Spring Cloud 提供的一種客戶端負載均衡解決方案,用于替代 Netflix Ribbon。它通過將負載均衡邏輯從服務端移到客戶端,使得每個客戶端實例都可以獨立地選擇要調用的服務實例,從而實現更靈活和高效的負載均衡。

底層執行原理

Spring Cloud LoadBalancer 的核心組件包括 ServiceInstanceListSupplierLoadBalancerClientLoadBalancer。下面結合源碼來詳細說明其執行原理。

1. ServiceInstanceListSupplier

ServiceInstanceListSupplier 是一個接口,用于提供服務實例列表。它的實現類負責從服務注冊中心(如 Eureka、Consul 等)獲取可用的服務實例列表。

public interface ServiceInstanceListSupplier {Flux<List<ServiceInstance>> get();
}

Flux 是 Reactor 庫中的一個類,表示一個異步序列。ServiceInstanceListSupplierget 方法返回一個 Flux,它會異步地提供服務實例列表。

2. LoadBalancerClient

LoadBalancerClient 是一個接口,定義了負載均衡客戶端的基本操作。它的主要方法是 choose,用于選擇一個服務實例。

public interface LoadBalancerClient {<T> ServiceInstance choose(String serviceId, Request<T> request);
}

choose 方法接受服務 ID 和請求信息,返回一個 ServiceInstance 對象,表示選擇的服務實例。

3. LoadBalancer

LoadBalancer 是負載均衡的核心接口,定義了負載均衡的策略。它的主要方法是 choose,用于根據負載均衡策略選擇一個服務實例。

public interface LoadBalancer<T> {Mono<Response<T>> choose(Request request);
}

choose 方法返回一個 Mono<Response<T>>,其中 Mono 是 Reactor 庫中的另一個類,表示一個異步的單值序列。

執行流程

  1. 獲取服務實例列表

    • ServiceInstanceListSupplier 從服務注冊中心獲取可用的服務實例列表,并返回一個 Flux<List<ServiceInstance>>
  2. 選擇服務實例

    • LoadBalancer 使用負載均衡策略(如輪詢、隨機等)從服務實例列表中選擇一個服務實例。
    • LoadBalancerClient 調用 LoadBalancerchoose 方法,獲取選擇的服務實例。
  3. 執行請求

    • LoadBalancerClient 使用選擇的服務實例執行請求,并返回結果。

源碼示例

以下是一個簡單的 ServiceInstanceListSupplier 實現示例:

public class SimpleServiceInstanceListSupplier implements ServiceInstanceListSupplier {private final List<ServiceInstance> instances;public SimpleServiceInstanceListSupplier(List<ServiceInstance> instances) {this.instances = instances;}@Overridepublic Flux<List<ServiceInstance>> get() {return Flux.just(instances);}
}

以下是一個簡單的 LoadBalancer 實現示例:

public class RoundRobinLoadBalancer implements LoadBalancer<ServiceInstance> {private final AtomicInteger position;private final ServiceInstanceListSupplier supplier;public RoundRobinLoadBalancer(ServiceInstanceListSupplier supplier) {this.supplier = supplier;this.position = new AtomicInteger(0);}@Overridepublic Mono<Response<ServiceInstance>> choose(Request request) {return supplier.get().next().map(instances -> {if (instances.isEmpty()) {return new EmptyResponse();}int pos = Math.abs(this.position.incrementAndGet());ServiceInstance instance = instances.get(pos % instances.size());return new DefaultResponse(instance);});}
}

總結

Spring Cloud LoadBalancer 通過 ServiceInstanceListSupplier 獲取服務實例列表,通過 LoadBalancer 選擇服務實例,并通過 LoadBalancerClient 執行請求。其核心思想是將負載均衡邏輯從服務端移到客戶端,使得每個客戶端實例都可以獨立地選擇要調用的服務實例,從而實現更靈活和高效的負載均衡。

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

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

相關文章

基礎—SQL—DML(數據操作語言)修改和刪除

一、引言 接著上次博客&#xff0c;這次講解DML語句中的修改數據和刪除數據操作。 二、DML—修改數據 UPDATE 表名 SET 字段名1值1 ,字段名2值2 , ...[ WHERE 條件]; 注意&#xff1a;修改語句的條件可以有&#xff0c;也可以沒有。如果沒有條件&#xff0c;則會修改整張表的…

TypeScript 泛型

泛型基礎 泛型允許我們在定義函數、類或接口時使用參數化類型&#xff0c;從而實現代碼的通用性。例如&#xff1a; function identity<T>(arg: T): T {return arg; }let output identity<string>("hello"); console.log(output); // 輸出&#xff1a…

為什么就是不顯示呢?

為了練習JavaScript中函數的使用方法&#xff0c;寫了下面的關于Date&#xff08;&#xff09;函數的使用&#xff0c;奇怪的是&#xff0c;網頁中就是不顯示相關內容&#xff0c;為什么呢&#xff1f;&#xff1f;&#xff1f; <!DOCTYPE html> <html lang"en&…

【更新】一次“問題反饋”,下定決心做了多約束多目標智能算法的“模板”

目錄 1 主要內容 2 部分代碼 3 程序結果 4 下載鏈接 1 主要內容 關注該代碼的同學應該清楚&#xff0c;這個代碼已經免費更新了兩版了&#xff0c;修復和增加了一些約束內容&#xff0c;本次增加蓄電池初始時刻和終止時刻容量一致約束&#xff0c;可別小瞧這么簡單的增加約…

工控一體機10.1寸顯示器電容觸摸屏(YA05WK)產品規格說明書

如果您對工控一體機有任何疑問或需求&#xff0c;或者對如何集成工控一體機到您的業務感興趣&#xff0c;可移步控芯捷科技。 一、硬件功能介紹 YA05WK是我公司推出的一款新型安卓屏&#xff0c;4核Cortex-A7 架構&#xff0c;主頻1.2GHz的CPU。采用12V供電&#xff0c;標配5寸…

2024.05.13 校招 實習 內推 面經

綠*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;內推/實習/校招匯總表格 1、實習 | 寧德新能源2025實習生招聘全面啟動 實習 | 寧德新能源2025實習生招聘全面啟動 2、實習 | 中國工業和信息化部電子第五研究所- 2025屆薪火計劃OFFER快捷通道正式開啟 實習 | 中…

深入理解深度學習中的激活層:Sigmoid和Softmax作為非終結層的應用

深入理解深度學習中的激活層&#xff1a;Sigmoid和Softmax作為非終結層的應用Sigmoid 和 Softmax 激活函數簡介Sigmoid函數Softmax函數 Sigmoid 和 Softmax 作為非終結層多任務學習特征變換增加網絡的非線性實際案例 注意事項結論 深入理解深度學習中的激活層&#xff1a;Sigmo…

云聯網驅動的全球智能網絡

在當今這個全球一體化加速的時代&#xff0c;企業網絡的邊界正被無限擴展&#xff0c;跨國運營、多云環境和遠程工作模式已經成為常態。中國聯通依托其強大的全球網絡資源&#xff0c;推出了以云聯網為核心技術的全球化智能組網方案&#xff0c;旨在為全球企業提供前所未有的靈…

什么是DELINS交貨指示?

DELINS 是指 Delivery Instruction&#xff08;交貨指示&#xff09;報文&#xff0c;用于在供應鏈管理中傳遞交貨指令和相關信息。該報文用于在供應鏈中的不同合作伙伴之間交換關于交貨的詳細信息。 DELINS 報文的主要功能 交貨指示&#xff1a;傳達具體的交貨指令&#xff…

如何評價GPT-4o

對比分析&#xff1a;GPT-4o與GPT-4 在人工智能領域的浪潮中&#xff0c;OpenAI的GPT系列模型一直是備受矚目的焦點。GPT-4o作為GPT系列的最新成員&#xff0c;相較于其前代GPT-4&#xff0c;無疑帶來了許多值得關注的改進和變化。 首先&#xff0c;從版本更迭的角度來看&#…

【Python】 深入理解 Python 包管理器:pip vs conda

基本原理 在Python編程世界中&#xff0c;包管理器是一個不可或缺的工具。它幫助開發者安裝、更新和管理Python庫。目前&#xff0c;最流行的兩個包管理器是pip和conda。了解它們之間的區別&#xff0c;對于Python開發者來說至關重要。 pip pip是Python的官方包管理器&#…

智慧農田視頻監控技術應用:智能監管引領農業新時代

據新聞報道&#xff0c;5月24日合肥市公安局接到群眾報警&#xff0c;反映自己辛苦種植的小麥有幾十畝地被人偷偷用收割機盜割。公安機關迅速出警并立案偵查&#xff0c;通過查看監控視頻得知&#xff0c;用戶所在的公司租用了幾千畝土地進行農業種植&#xff0c;因公司與村民之…

Day26

Day26 注解 什么是注解 java.annotation包Annotation是從JDK1.5開始引入的新技術&#xff0c;注解即可以對程序員解釋又可以對程序解釋 注解與注釋的區別 注釋&#xff1a;對程序員解釋代碼信息注解&#xff1a;對程序和程序員解釋代碼信息 注解的所用 不是程序本身&#xff0…

【C語言】9.C語言函數棧幀的創建和銷毀

C語言函數棧幀的創建和銷毀 看完本文你能了解什么? 局部變量是怎么創建的&#xff1f;為什么局部變量的值是隨機值&#xff1f;函數是怎么傳參的&#xff1f;傳參的順序是怎么樣的&#xff1f;實參和形參是什么關系&#xff1f;函數調用是怎么做的&#xff1f;函數調用結束后怎…

LeetCode hot100-57-G

17. 電話號碼的字母組合 給定一個僅包含數字 2-9 的字符串&#xff0c;返回所有它能表示的字母組合。答案可以按 任意順序 返回。給出數字到字母的映射如下&#xff08;與電話按鍵相同&#xff09;。注意 1 不對應任何字母。不會&#xff0c;放IDEA里執行了一下大概理解了流程 …

『大模型筆記』KV緩存:Transformer中的內存使用!

『大模型筆記』KV緩存:Transformer中的內存使用! 文章目錄 一. KV緩存:Transformer中的內存使用!1.1. 介紹1.2. 自注意力機制回顧1.3. KV 緩存的工作原理1.4. 內存使用和示例1.4.1. 存儲鍵值緩存需要多少內存1.4.2. Example: OPT-30B(300億參數)四. 參考文獻進一步閱讀:…

深圳比創達電子|EMC與EMI濾波器:電子設備的“電磁防護罩”

在電子科技日新月異的今天&#xff0c;電磁兼容性&#xff08;EMC&#xff09;問題越來越受到工程師和技術人員的關注。其中&#xff0c;電磁干擾&#xff08;EMI&#xff09;和電磁干擾抑制&#xff08;即EMI濾波器&#xff09;是實現良好EMC性能的關鍵技術之一。 一、EMC與E…

KineFX —— 簡介

KineFX是綁定和動畫的框架和工具集&#xff0c;可在SOP級別創建和編輯角色&#xff1b;可從頭創建自己的KineFX角色&#xff0c;或使用特定的KineFX SOP和常規的SOP去編輯導入的角色和動畫&#xff1b; 程序化綁定 KineFX構建與程序化綁定的原則上&#xff0c;可快速非破壞性迭…

AI繪畫Stable Diffusion【藝術寫真】:蒙版法圖生圖,局部重繪實現AI藝術寫真

大家好&#xff0c;我是設計師阿威 之前我分享過幾篇使用SD插件換臉方式實現AI寫真的教程&#xff0c;主要存在2個大的問題。 &#xff08;1&#xff09;人臉相似度 &#xff08;2&#xff09;生成的圖片整體色調有時候會比較怪異 對于上面的問題&#xff0c;在對圖片質量要…

一些圖形界面的工具可以幫助你模擬點擊和進行其他瀏覽器自動化操作

1. Selenium IDE Selenium IDE 是一個用于記錄、編輯和調試測試的集成開發環境。它有一個圖形界面,允許你通過點擊和錄制來創建測試用例。它支持Chrome和Firefox瀏覽器。 安裝和使用步驟: 在Chrome或Firefox的擴展商店中搜索“Selenium IDE”并安裝。打開Selenium IDE擴展。…