【Spring底層原理高級進階】基于Spring Boot和Spring WebFlux的實時推薦系統的核心:響應式編程與 WebFlux 的顛覆性變革

?🎉🎉歡迎光臨🎉🎉

🏅我是蘇澤,一位對技術充滿熱情的探索者和分享者。🚀🚀

🌟特別推薦給大家我的最新專欄《Spring 狂野之旅:底層原理高級進階》 🚀

本專欄純屬為愛發電永久免費!!!

這是蘇澤的個人主頁可以看到我其他的內容哦👇👇

努力的蘇澤icon-default.png?t=N7T8http://suzee.blog.csdn.net/

最近在忙項目 好久沒做知識積累了? 這兩天狂補一下

廢話不多說 上正文

目錄

1. 傳統的Spring MVC架構的限制

2. 響應式編程的概念和優勢

響應式編程的基本概念和原則:

響應式編程相對于傳統編程模型的優勢和特點:

響應式編程在異步、并發和響應性方面的優勢

響應式編程的應用場景

?響應式編程的基本原理

事件驅動、數據流和異步編程的關系

響應式編程的調度和線程模型

引入依賴:在Maven或Gradle中引入Spring WebFlux的依賴,它是Spring框架中用于支持響應式編程的模塊。創建控制器:使用@RestController注解創建一個響應式的控制器類,該類將處理HTTP請求并返回響應。在控制器方法中,可以使用響應式的數據類型,如Mono和Flux。

處理數據流:在上述示例中,Mono表示一個包含單個值的數據流,而Flux表示一個包含多個值的數據流。通過使用這些響應式類型,可以將數據流作為響應返回給客戶端。

異步處理:Spring WebFlux使用基于事件驅動的非阻塞I/O模型來實現異步處理。它使用反應堆(Reactor)庫提供的線程池和調度器來處理大量的并發操作,而不會阻塞主線程。

響應式反饋:在Spring WebFlux中,可以使用操作符和函數式編程的方式對數據流進行轉換和處理。例如,可以使用map操作符對數據流中的元素進行轉換,使用filter操作符對數據流進行過濾,以及使用flatMap操作符對多個數據流進行合并等。


1. 傳統的Spring MVC架構的限制

  • 介紹傳統的Spring MVC架構的基本原理和組件

傳統的Spring MVC架構是一種基于Java的Web應用程序開發框架,它遵循了MVC(Model-View-Controller)設計模式。下面將介紹傳統Spring MVC架構的基本原理和組件:

  1. 基本原理:

    • 請求處理流程:當用戶發送一個HTTP請求時,Spring MVC的前端控制器(Front Controller)接收到請求并將其分發給相應的處理器(Handler)進行處理。處理器可以是一個控制器類或者一個處理器方法。處理器執行業務邏輯后,生成一個模型(Model)對象和視圖名稱(View Name)。
    • 視圖解析和渲染:模型和視圖名稱被傳遞給視圖解析器(View Resolver),它根據視圖名稱解析出具體的視圖對象。視圖對象負責將模型數據渲染成最終的響應結果,通常是HTML頁面或其他格式的數據。
  2. 組件:

    • 前端控制器(DispatcherServlet):作為整個框架的核心組件,負責接收所有的HTTP請求并進行分發。它是應用程序的入口點,協調其他組件的工作。
    • 處理器映射器(Handler Mapping):根據請求的URL路徑或其他條件,將請求映射到相應的處理器。它可以根據配置文件或注解來進行請求映射的定義。
    • 處理器(Handler):處理器是實際執行業務邏輯的組件,可以是一個控制器類或者一個處理器方法。它接收請求參數、處理業務邏輯,并生成模型數據和視圖名稱。
    • 處理器適配器(Handler Adapter):處理器適配器負責將具體的處理器包裝成一個可執行的處理器對象,以便前端控制器能夠調用它的方法來處理請求。
    • 視圖解析器(View Resolver):視圖解析器根據視圖名稱解析出具體的視圖對象,通常是一個JSP頁面或其他模板文件。它可以根據配置文件或注解來進行視圖解析的定義。
    • 視圖(View):視圖負責將模型數據渲染成最終的響應結果,通常是HTML頁面或其他格式的數據。視圖可以是JSP頁面、Thymeleaf模板、Freemarker模板等。

總結起來,傳統的Spring MVC架構通過前端控制器(DispatcherServlet)、處理器映射器(Handler Mapping)、處理器(Handler)、處理器適配器(Handler Adapter)、視圖解析器(View Resolver)和視圖(View)等組件,實現了請求的分發和處理,以及模型數據到視圖的渲染過程。這種架構模式使得開發人員能夠將業務邏輯和視圖層分離,提高了代碼的可維護性和可測試性。

  • 分析傳統架構在高并發和大規模數據處理場景下的限制
  • 探討為什么需要一種更加靈活和高效的編程模型

2. 響應式編程的概念和優勢

  • 解釋響應式編程的基本概念和原則

當談論響應式編程的概念和優勢時,以下是一些示例代碼和解釋,以幫助說明響應式編程的基本概念和原則,以及相對于傳統編程模型的優勢和特點。

  1. 響應式編程的概念和優勢:

    • 響應式編程是一種基于異步數據流的編程范式,通過使用觀察者模式和函數式編程的概念,實現了事件驅動和數據流驅動的編程風格。
    • 響應式編程的優勢在于它可以提供更好的異步性能、并發處理能力和響應性能,以及更簡潔、可維護和可擴展的代碼。
  2. 響應式編程的基本概念和原則:

    • 觀察者模式:響應式編程使用觀察者模式來處理數據流。數據源(Observable)發布數據,并通知所有訂閱者(Observer)進行處理。
    • 數據流:數據在應用程序中以流的形式傳播,可以是單個值或一系列值的序列。數據流可以進行轉換、過濾和組合等操作。
      // 引入RxJS庫
      const { from, interval } = require('rxjs');
      const { map, filter, mergeMap } = require('rxjs/operators');// 創建一個數據流
      const dataStream = from([1, 2, 3, 4, 5]);// 使用響應式操作符進行轉換和過濾
      const modifiedStream = dataStream.pipe(map(value => value * 2), // 將每個值乘以2filter(value => value > 5) // 過濾掉小于等于5的值
      );// 訂閱數據流并處理結果
      modifiedStream.subscribe(value => {console.log('處理結果:', value);},error => {console.error('處理錯誤:', error);},() => {console.log('處理完成');}
      );// 異步處理示例
      const asyncDataStream = interval(1000); // 每秒生成一個遞增的值const asyncModifiedStream = asyncDataStream.pipe(mergeMap(value => {// 模擬異步操作,延遲一秒后返回處理結果return new Promise(resolve => {setTimeout(() => {resolve(value * 3); // 將值乘以3作為處理結果}, 1000);});})
      );asyncModifiedStream.subscribe(value => {console.log('異步處理結果:', value);},error => {console.error('異步處理錯誤:', error);},() => {console.log('異步處理完成');}
      );// 響應式反饋示例
      const feedbackStream = from([1, 2, 3]);feedbackStream.subscribe(value => {console.log('接收到數據:', value);if (value === 3) {// 當數據為3時觸發響應式反饋,打印反饋消息console.log('觸發響應式反饋');}
      });

    • 響應式操作符:響應式編程提供了一組操作符,如map、filter、reduce等,用于對數據流進行處理和轉換。
      Spring Reactor提供了豐富的操作符,用于對數據流進行轉換、過濾、合并等操作。這些操作符包括mapfilterflatMapconcatmerge等,可以通過鏈式組合的方式形成復雜的數據流處理邏輯。例如:
      Flux<Integer> dataStream = Flux.just(1, 2, 3, 4, 5);Flux<Integer> modifiedStream = dataStream.map(value -> value * 2)  // 將每個值乘以2.filter(value -> value > 5);  // 過濾掉小于等于5的值

      ?
    • 異步:響應式編程鼓勵使用異步操作,以避免阻塞線程和提高并發性能。Spring Reactor支持異步處理,可以在不阻塞主線程的情況下處理大量的并發操作。通過使用異步操作符,例如subscribeOnpublishOn,可以將操作轉移到其他線程池中執行,從而提高應用程序的性能和響應能力。
      Flux<Integer> asyncDataStream = Flux.range(1, 10).map(value -> {// 模擬耗時操作try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}return value * 2;}).subscribeOn(Schedulers.elastic());asyncDataStream.subscribe(value -> {System.out.println("異步處理結果: " + value);
      });

    • 響應式調度器:通過使用調度器,可以控制數據流操作在不同線程上的執行,實現并發處理和響應性能的優化。在響應式編程中,響應式反饋鼓勵組件之間的反饋機制,當數據流發生變化時,可以自動觸發相關的操作和邏輯。在Spring框架中,可以通過使用FluxMono類型的數據流以及訂閱操作來實現響應式反饋。
      Flux<Long> intervalStream = Flux.interval(Duration.ofSeconds(1));intervalStream.subscribe(value -> {System.out.println("接收到數據: " + value);if (value == 3) {System.out.println("觸發響應式反饋");}
      });

  3. 響應式編程相對于傳統編程模型的優勢和特點:

    • 異步性能:響應式編程通過使用異步操作和非阻塞的方式處理數據流,提供了更好的異步性能。以下是一個使用響應式編程處理異步任務的示例代碼:
      Observable.fromCallable(() -> {// 執行異步任務return result;
      })
      .subscribeOn(Schedulers.io())
      .observeOn(Schedulers.single())
      .subscribe(result -> {// 處理任務結果},error -> {// 處理錯誤}
      );

  • 響應式編程在異步、并發和響應性方面的優勢

  • 異步處理:響應式編程通過使用異步操作,能夠更好地處理并發任務,避免阻塞和等待,提高系統的吞吐量。
  • 并發性:響應式編程利用數據流的方式,可以同時處理多個請求和事件,充分利用系統資源,提高并發處理能力。
  • 響應性能:響應式編程的實時數據處理方式,能夠快速響應輸入事件,提供更好的用戶體驗和系統響應性能。

響應式編程的應用場景

響應式編程在以下場景中具有廣泛的應用:

  • 響應式Web開發:處理大量并發請求,實時更新UI,處理實時數據流等。
  • 大數據處理:處理大規模數據集,進行數據流處理和實時分析。
  • 事件驅動系統:處理異步事件和消息,實現松耦合的組件通信。
  • 實時流處理:處理實時數據流,進行流式計算和實時決策。
  • 物聯網應用:處理異步傳感器數據,實現實時監控和控制。

?響應式編程的基本原理

事件驅動、數據流和異步編程的關系

事件驅動、數據流和異步編程是響應式編程的關鍵概念和組成部分。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;// 事件驅動編程示例
class Event {private String data;public Event(String data) {this.data = data;}public String getData() {return data;}
}interface EventHandler {void handleEvent(Event event);
}class EventProducer {private List<EventHandler> handlers = new ArrayList<>();public void addHandler(EventHandler handler) {handlers.add(handler);}public void removeHandler(EventHandler handler) {handlers.remove(handler);}public void produceEvent(Event event) {for (EventHandler handler : handlers) {handler.handleEvent(event);}}
}class EventConsumer implements EventHandler {@Overridepublic void handleEvent(Event event) {System.out.println("Event consumed: " + event.getData());}
}// 數據流示例
class DataStream<T> {private List<T> data = new ArrayList<>();public void addData(T value) {data.add(value);}public void processData(DataProcessor<T> processor) {for (T value : data) {processor.process(value);}}
}interface DataProcessor<T> {void process(T value);
}class StringProcessor implements DataProcessor<String> {@Overridepublic void process(String value) {System.out.println("Processing string: " + value);}
}// 異步編程示例
public class AsyncProgrammingExample {public static void main(String[] args) {// 創建事件生產者和消費者EventProducer producer = new EventProducer();EventConsumer consumer = new EventConsumer();producer.addHandler(consumer);// 產生事件Event event = new Event("Event 1");producer.produceEvent(event);// 創建數據流并處理數據DataStream<String> stream = new DataStream<>();stream.addData("Data 1");stream.addData("Data 2");stream.addData("Data 3");DataProcessor<String> processor = new StringProcessor();stream.processData(processor);// 異步操作示例CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 模擬耗時操作try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return "Async Result";});future.thenAccept(result -> {System.out.println("Async operation completed: " + result);});System.out.println("Main thread continues...");}
}

?

  • 事件驅動編程:通過EventProducerEventConsumer來展示事件的觸發和處理。EventProducer產生一個事件,然后將其傳遞給所有注冊的EventHandler(在此示例中只有一個EventConsumer)進行處理。

  • 數據流:通過DataStreamDataProcessor來展示數據流的操作。DataStream可以添加數據,并通過processData方法將數據傳遞給注冊的DataProcessor(在此示例中是StringProcessor)進行處理。

  • 異步編程:通過CompletableFuture來展示異步操作。在示例中,我們使用supplyAsync方法模擬一個耗時的異步操作,然后使用thenAccept方法在操作完成后處理結果。

響應式編程的調度和線程模型

響應式編程中的調度和線程模型是為了處理異步操作和并發操作而設計的。

調度是指確定某個操作在什么時候執行的過程。在響應式編程中,可以使用調度器(Scheduler)來管理操作的執行時機,包括指定在哪個線程或線程池中執行操作,以及操作的優先級和順序。

線程模型是指應用程序中多個線程之間的關系和交互方式。在響應式編程中,通常使用事件循環或線程池來管理線程的執行。事件循環模型使用單個線程順序執行任務,而線程池模型使用多個線程并行執行任務。選擇合適的線程模型可以根據應用程序的需求來平衡性能和資源消耗。

響應式編程的調度和線程模型需要根據具體的應用場景和需求來進行選擇和配置。

  • 響應式編程是一種以數據流和變化傳播為核心的編程范式。其基本原理是將應用程序的各個組件和操作定義為數據流的操作符,通過訂閱和觸發事件的方式,實現組件之間的響應式交互。

    響應式編程的設計思想包括以下幾個方面:

  • 數據流:響應式編程將應用程序中的數據和狀態抽象為數據流,數據流可以是單個的值,也可以是一系列的值。組件之間通過訂閱和觸發數據流的方式進行交互。

  • 響應式操作符:響應式編程提供了豐富的操作符,用于對數據流進行轉換、過濾、合并等操作。這些操作符可以鏈式組合,形成復雜的數據流處理邏輯。

  • 異步處理:響應式編程支持異步處理,能夠在不阻塞主線程的情況下處理大量的并發操作。通過異步處理,可以提高應用程序的性能和響應能力。

  • 響應式反饋:響應式編程鼓勵組件之間的反饋機制,當數據流發生變化時,可以自動觸發相關的操作和邏輯。





    引入依賴:在Maven或Gradle中引入Spring WebFlux的依賴,它是Spring框架中用于支持響應式編程的模塊。

    創建控制器:使用@RestController注解創建一個響應式的控制器類,該類將處理HTTP請求并返回響應。在控制器方法中,可以使用響應式的數據類型,如MonoFlux
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;@RestController
public class ReactiveController {@GetMapping("/hello")public Mono<String> hello() {return Mono.just("Hello, World!");}@GetMapping("/numbers")public Flux<Integer> numbers() {return Flux.range(1, 10);}
}

處理數據流:在上述示例中,Mono表示一個包含單個值的數據流,而Flux表示一個包含多個值的數據流。通過使用這些響應式類型,可以將數據流作為響應返回給客戶端。

異步處理:Spring WebFlux使用基于事件驅動的非阻塞I/O模型來實現異步處理。它使用反應堆(Reactor)庫提供的線程池和調度器來處理大量的并發操作,而不會阻塞主線程。

響應式反饋:在Spring WebFlux中,可以使用操作符和函數式編程的方式對數據流進行轉換和處理。例如,可以使用map操作符對數據流中的元素進行轉換,使用filter操作符對數據流進行過濾,以及使用flatMap操作符對多個數據流進行合并等。

實戰應用

使用響應式編程的思想,我們可以通過構建一個基于數據流的實時推薦系統

基于Spring Boot和Spring WebFlux的實時推薦系統的核心部分:

  1. 創建實體類和存儲庫:
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;@Document(collection = "products")
public class Product {@Idprivate String id;private String name;private String description;// 省略構造函數、getter和setter方法
}import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import reactor.core.publisher.Flux;public interface ProductRepository extends ReactiveMongoRepository<Product, String> {Flux<Product> findByKeyword(String keyword);
}

?

創建服務類:

import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;@Service
public class ProductRecommendationService {private ProductRepository productRepository;public ProductRecommendationService(ProductRepository productRepository) {this.productRepository = productRepository;}public Flux<Product> getRecommendations(String keyword) {return productRepository.findByKeyword(keyword).flatMap(this::processRecommendation).take(5);}private Mono<Product> processRecommendation(Product product) {// 根據產品信息進行推薦處理邏輯// ...return Mono.just(product);}
}

控制器

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;@RestController
public class RecommendationController {private ProductRecommendationService recommendationService;public RecommendationController(ProductRecommendationService recommendationService) {this.recommendationService = recommendationService;}@GetMapping("/recommendations/{keyword}")public Flux<Product> getRecommendations(@PathVariable String keyword) {return recommendationService.getRecommendations(keyword);}
}

這里我們定義了一個Product實體類,它表示產品的基本信息。ProductRepository是一個響應式的存儲庫接口,用于對產品進行數據庫操作。

ProductRecommendationService是一個服務類,它依賴于ProductRepository,用于處理實時推薦的業務邏輯。getRecommendations方法接收一個關鍵字作為參數,通過調用productRepository.findByKeyword(keyword)從數據庫中查詢匹配的產品數據流。然后,使用flatMap操作符對每個產品進行推薦處理,最后使用take(5)操作符限制只返回前5個推薦產品。

RecommendationController是一個控制器類,它依賴于ProductRecommendationService,用于處理HTTP請求并返回響應。在getRecommendations方法中,我們通過調用recommendationService.getRecommendations(keyword)來獲取實時推薦的產品數據流。

好了這就是本期的全部 感謝觀看 資源過段時會傳哈 (要是有人要哈哈)

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

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

相關文章

QT_day2

1.思維導圖 2.使用手動連接&#xff0c;將登錄框中的取消按鈕使用qt4版本的連接到自定義的槽函數中&#xff0c;在自定義的槽函數中調用關閉函數 將登錄按鈕使用qt5版本的連接到自定義的槽函數中&#xff0c;在槽函數中判斷ui界面上輸入的賬號是否為"admin"&#xff…

幻獸帕魯1.4.1單機暢玩教程

文章目錄 游戲簡介游戲背景游戲玩法資源安裝和配置教程游戲包的下載和安裝Steam客戶端下載和配置 畢業存檔使用教程第一步&#xff1a;個人存檔備份第二步&#xff1a;畢業存檔導入 游戲簡介 Palworld&#xff1a;一款由日本獨立游戲工作室Pocketpair制作發行的動作角色扮演游…

LaunchPad 市場的復蘇,Penpad 成新興生力軍

以 Fair Launch 為主要啟動方式的銘文市場的爆發&#xff0c;推動了 LaunchPad 市場的復蘇&#xff0c;絕多數所銘文項目都能通過 Fairr Launch 的方式籌集資金實現啟動&#xff0c;該賽道的爆發不僅推動了數百億美元的熱錢開始在鏈上不斷涌動&#xff0c;同時也進一步形成了新…

【xss跨站漏洞】xss漏洞利用工具beef的安裝

安裝環境 阿里云服務器&#xff0c;centos8.2系統&#xff0c;docker docker安裝 前提用root用戶 安裝docker yum install docker 重啟docker systemctl restart docker beef安裝 安裝beef docker pull janes/beef 綁定到3000端口 docker run --rm -p 3000:3000 janes/beef …

JS實現根據數組對象的某一屬性排序

JS實現根據數組對象的某一屬性排序 一、冒泡排序&#xff08;先了解冒泡排序機制&#xff09;二、根據數組對象的某一屬性排序&#xff08;引用sort方法排序&#xff09; 一、冒泡排序&#xff08;先了解冒泡排序機制&#xff09; 以從小到大排序為例&#xff0c;冒泡排序的原…

【EI會議征稿通知】第十屆能源材料與環境工程國際學術會議(ICEMEE 2024)

第十屆能源材料與環境工程國際學術會議&#xff08;ICEMEE 2024&#xff09; 2024 10th International Conference on Energy Materials and Environment Engineering 隨著前9年的成功&#xff0c;ICEMEE在2024年迎來了第10屆。很榮幸地宣布&#xff0c;第十屆能源材料與環境…

養老項目技術架構和工程結構

數據層&#xff1a;MySQL、Redis 服務層&#xff1a;SpringBoot、SpringMVC、SpringCache結合Redis的緩存、定時任務XXL-JOB、和swagger配合使用生成接口文檔的Knife4j、Lombok、雙向通信使用的WebSocket以及Spring Security 接入層使用的nginx——反向代理、負載均衡 前端使…

【rust】vscode下rust-analyzer和Rust Test Lens的Lens

背景 一個粉絲問&#xff1a; 我編輯的launch.json為什么只在按F5的時候工作 按這個debug按鈕就不工作&#xff1f; 那在哪改這個插件的配置文檔&#xff1f;我一直用的F5 今天上午才注意到這個問題&#xff0c;比如怎么改程序的命令行參數&#xff0c;我意思是如果我非要用…

搭建sql-labs靶機環境

phpstudy&#xff08;小皮面板&#xff09; 先下載phpstudy&#xff08;小皮面板&#xff09;軟件&#xff0c;方便我們快速搭建環境&#xff0c;該軟件程序包集成最新的ApachePHPMySQLngix,一次性安裝,無須配置即可使用,是非常方便、好用的PHP調試環境.該程序不僅包括PHP調試…

D1302——高性能、低功耗并附帶RAM的涓流充電實時時鐘電路芯片,可提供秒、 分、小時、星期、日期、月 份和年等計時數據

D1302是一塊高性能、低功耗并附帶RAM的涓流充電實時時鐘電路。 主要特點&#xff1a; ● 實時時鐘可提供秒、 分、小時、星期、日期、月 份和年等計時數據&#xff0c;到2100 年止。一個月小于31天時可自動調整&#xff0c;且具有閏年補償功能 ● 31X8 位通用暫存RAM ● 采用S…

【Apache Spark】Spark 的基本概念和在大數據分析中的應用

Apache Spark是一個開源的分布式計算引擎&#xff0c;用于大規模數據處理和分析。它提供了一個高級別的API&#xff0c;可以在集群中快速執行計算任務&#xff0c;并且能夠處理多種類型的數據&#xff0c;包括結構化數據、半結構化數據和非結構化數據。 Spark的核心概念是彈性…

對話 zkPokerdot | 妙用 ZKP 技術,為鏈上游戲創造公平競技場

在數字游戲的領域中&#xff0c;無論是沉浸于傳統游戲的虛擬世界&#xff0c;還是探索 Web3 游戲的前沿領域&#xff0c;玩家們都追求擁有一場公平的對決。zkPokerdot 項目應運而生。通過 ZKP 技術&#xff0c;zkPokerdot 為鏈上游戲提供了一個既去中心化又保障隱私的公平競技場…

@Conditional注解

簡要說明 Conditional注解來源于org.springframework.context.annotation包中&#xff0c;也就是它是Spring中的注解&#xff0c;并不是SpringBoot的注解&#xff0c;他的作用是為了bean的裝載到容器中增加一個條件判斷&#xff0c;在滿足條件下才會裝載到容器中&#xff0c;這…

FariyGUI × Cocos Creator 入門

前言 程序員向的初探Cocos Creator結和FairyGUI的使用&#xff0c;會比較偏向FairyGUI一點&#xff0c;默認各位讀者都熟練掌握Cocos Creator以及js/ts腳本編寫。 初探門徑&#xff0c;歡迎大佬指教&#xff0c;歡迎在評論區或私信與本人交流&#xff0c;謝謝&#xff01; 下…

Linux系統安裝zookeeper

Linux安裝zookeeper 安裝zookeeper之前需要安裝jdk&#xff0c;確認jdk環境沒問題之后再開始安裝zookeeper 下載zookeeper壓縮包&#xff0c;官方下載地址&#xff1a;Apache Download Mirrors 將zookeeper壓縮包拷貝到Linux并解壓 # (-C 路徑)可以解壓到指定路徑 tar -zxv…

dubbo源碼中設計模式——負載均衡中模版模式的應用

模版模式介紹 在模板模式&#xff08;Template Pattern&#xff09;中&#xff0c;一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現&#xff0c;但調用將以抽象類中定義的方式進行。這種類型的設計模式屬于行為型模式。 使用場景&#xff1a;定…

Lua內存管理策略

傳統的內存管理策略主要分為兩種&#xff1a;引用計數&#xff0c;和垃圾回收。相比后者每一段時間執行一次回收周期&#xff0c;前者是對于每一個變量都維護被引用數的策略。對于Lua這種輕量化語言而言&#xff0c;占據大內存的開銷是極力避免的&#xff0c;而前者的方式顯然是…

singularity build用法詳解,及實例

singularity build 命令是 Singularity 中非常重要的一個功能,它允許用戶從定義文件、現有的 Singularity 容器或者其他容器平臺(如 Docker)的鏡像來構建一個新的 Singularity 容器。這個命令主要用于創建定制化的容器環境,以適應特定的應用和需求。 命令格式 singularit…

JDBC的DBUtil 和 xxxDAO 示例

DBUtil package common;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;public class DBUtil {// 需要封裝…

C語言運用中斷子系統用驅動控制led實驗,c語言串口led點燈實驗(驅動+應用層)

中斷子系統用驅動控制led實驗 驅動代碼 #include <linux/init.h> #include <linux/module.h>#include<linux/interrupt.h> #include<linux/gpio.h> #include<linux/timer.h>#include<linux/of.h> #include<linux/of_irq.h> #inclu…