主頁 > 後端開發 > RabbitMQ入門看這一篇就夠了

RabbitMQ入門看這一篇就夠了

2020-12-17 06:21:15 後端開發

一文搞懂 RabbitMQ 的重要概念以及安裝

一 RabbitMQ 介紹

這部分參考了 《RabbitMQ實戰指南》這本書的第 1 章和第 2 章,

1.1 RabbitMQ 簡介

RabbitMQ 是采用 Erlang 語言實作 AMQP(Advanced Message Queuing Protocol,高級訊息佇列協議)的訊息中間件,它最初起源于金融系統,用于在分布式系統中存盤轉發訊息,

RabbitMQ 發展到今天,被越來越多的人認可,這和它在易用性、擴展性、可靠性和高可用性等方面的卓著表現是分不開的,RabbitMQ 的具體特點可以概括為以下幾點:

  • 可靠性: RabbitMQ使用一些機制來保證訊息的可靠性,如持久化、傳輸確認及發布確認等,
  • 靈活的路由: 在訊息進入佇列之前,通過交換器來路由訊息,對于典型的路由功能,RabbitMQ 己經提供了一些內置的交換器來實作,針對更復雜的路由功能,可以將多個交換器系結在一起,也可以通過插件機制來實作自己的交換器,這個后面會在我們將 RabbitMQ 核心概念的時候詳細介紹到,
  • 擴展性: 多個RabbitMQ節點可以組成一個集群,也可以根據實際業務情況動態地擴展集群中節點,
  • 高可用性: 佇列可以在集群中的機器上設定鏡像,使得在部分節點出現問題的情況下佇列仍然可用,
  • 支持多種協議: RabbitMQ 除了原生支持 AMQP 協議,還支持 STOMP、MQTT 等多種訊息中間件協議,
  • 多語言客戶端: RabbitMQ幾乎支持所有常用語言,比如 Java、Python、Ruby、PHP、C#、JavaScript等,
  • 易用的管理界面: RabbitMQ提供了一個易用的用戶界面,使得用戶可以監控和管理訊息、集群中的節點等,在安裝 RabbitMQ 的時候會介紹到,安裝好 RabbitMQ 就自帶管理界面,
  • 插件機制: RabbitMQ 提供了許多插件,以實作從多方面進行擴展,當然也可以撰寫自己的插件,感覺這個有點類似 Dubbo 的 SPI機制,

1.2 RabbitMQ 核心概念

RabbitMQ 整體上是一個生產者與消費者模型,主要負責接收、存盤和轉發訊息,可以把訊息傳遞的程序想象成:當你將一個包裹送到郵局,郵局會暫存并最終將郵件通過郵遞員送到收件人的手上,RabbitMQ就好比由郵局、郵箱和郵遞員組成的一個系統,從計算機術語層面來說,RabbitMQ 模型更像是一種交換機模型,

下面再來看看圖1—— RabbitMQ 的整體模型架構,

圖1-RabbitMQ 的整體模型架構

下面我會一一介紹上圖中的一些概念,

1.2.1 Producer(生產者) 和 Consumer(消費者)

  • Producer(生產者) :生產訊息的一方(郵件投遞者)
  • Consumer(消費者) :消費訊息的一方(郵件收件人)

訊息一般由 2 部分組成:訊息頭(或者說是標簽 Label)和 訊息體,訊息體也可以稱為 payLoad ,訊息體是不透明的,而訊息頭則由一系列的可選屬性組成,這些屬性包括 routing-key(路由鍵)、priority(相對于其他訊息的優先權)、delivery-mode(指出該訊息可能需要持久性存盤)等,生產者把訊息交由 RabbitMQ 后,RabbitMQ 會根據訊息頭把訊息發送給感興趣的 Consumer(消費者),

1.2.2 Exchange(交換器)

在 RabbitMQ 中,訊息并不是直接被投遞到 Queue(訊息佇列) 中的,中間還必須經過 Exchange(交換器) 這一層,Exchange(交換器) 會把我們的訊息分配到對應的 Queue(訊息佇列) 中,

Exchange(交換器) 用來接收生產者發送的訊息并將這些訊息路由給服務器中的佇列中,如果路由不到,或許會回傳給 Producer(生產者) ,或許會被直接丟棄掉 ,這里可以將RabbitMQ中的交換器看作一個簡單的物體,

RabbitMQ 的 Exchange(交換器) 有4種型別,不同的型別對應著不同的路由策略direct(默認)fanouttopic, 和 headers,不同型別的Exchange轉發訊息的策略有所區別,這個會在介紹 Exchange Types(交換器型別) 的時候介紹到,

Exchange(交換器) 示意圖如下:

Exchange(交換器) 示意圖

生產者將訊息發給交換器的時候,一般會指定一個 RoutingKey(路由鍵),用來指定這個訊息的路由規則,而這個 RoutingKey 需要與交換器型別和系結鍵(BindingKey)聯合使用才能最終生效

RabbitMQ 中通過 Binding(系結) 將 Exchange(交換器) 與 Queue(訊息佇列) 關聯起來,在系結的時候一般會指定一個 BindingKey(系結建) ,這樣 RabbitMQ 就知道如何正確將訊息路由到佇列了,如下圖所示,一個系結就是基于路由鍵將交換器和訊息佇列連接起來的路由規則,所以可以將交換器理解成一個由系結構成的路由表,Exchange 和 Queue 的系結可以是多對多的關系,

Binding(系結) 示意圖:

Binding(系結) 示意圖

生產者將訊息發送給交換器時,需要一個RoutingKey,當 BindingKey 和 RoutingKey 相匹配時,訊息會被路由到對應的佇列中,在系結多個佇列到同一個交換器的時候,這些系結允許使用相同的 BindingKey,BindingKey 并不是在所有的情況下都生效,它依賴于交換器型別,比如fanout型別的交換器就會無視,而是將訊息路由到所有系結到該交換器的佇列中,

1.2.3 Queue(訊息佇列)

Queue(訊息佇列) 用來保存訊息直到發送給消費者,它是訊息的容器,也是訊息的終點,一個訊息可投入一個或多個佇列,訊息一直在佇列里面,等待消費者連接到這個佇列將其取走,

RabbitMQ 中訊息只能存盤在 佇列 中,這一點和 Kafka 這種訊息中間件相反,Kafka 將訊息存盤在 topic(主題) 這個邏輯層面,而相對應的佇列邏輯只是topic實際存盤檔案中的位移標識, RabbitMQ 的生產者生產訊息并最終投遞到佇列中,消費者可以從佇列中獲取訊息并消費,

多個消費者可以訂閱同一個佇列,這時佇列中的訊息會被平均分攤(Round-Robin,即輪詢)給多個消費者進行處理,而不是每個消費者都收到所有的訊息并處理,這樣避免的訊息被重復消費,

RabbitMQ 不支持佇列層面的廣播消費,如果有廣播消費的需求,需要在其上進行二次開發,這樣會很麻煩,不建議這樣做,

1.2.4 Broker(訊息中間件的服務節點)

對于 RabbitMQ 來說,一個 RabbitMQ Broker 可以簡單地看作一個 RabbitMQ 服務節點,或者RabbitMQ服務實體,大多數情況下也可以將一個 RabbitMQ Broker 看作一臺 RabbitMQ 服務器,

下圖展示了生產者將訊息存入 RabbitMQ Broker,以及消費者從Broker中消費資料的整個流程,

訊息佇列的運轉程序

這樣圖1中的一些關于 RabbitMQ 的基本概念我們就介紹完畢了,下面再來介紹一下 Exchange Types(交換器型別) ,

1.2.5 Exchange Types(交換器型別)

RabbitMQ 常用的 Exchange Type 有 fanoutdirecttopicheaders 這四種(AMQP規范里還提到兩種 Exchange Type,分別為 system 與 自定義,這里不予以描述),

① fanout

fanout 型別的Exchange路由規則非常簡單,它會把所有發送到該Exchange的訊息路由到所有與它系結的Queue中,不需要做任何判斷操作,所以 fanout 型別是所有的交換機型別里面速度最快的,fanout 型別常用來廣播訊息,

② direct

direct 型別的Exchange路由規則也很簡單,它會把訊息路由到那些 Bindingkey 與 RoutingKey 完全匹配的 Queue 中,

direct 型別交換器

以上圖為例,如果發送訊息的時候設定路由鍵為“warning”,那么訊息會路由到 Queue1 和 Queue2,如果在發送訊息的時候設定路由鍵為"Info”或者"debug”,訊息只會路由到Queue2,如果以其他的路由鍵發送訊息,則訊息不會路由到這兩個佇列中,

direct 型別常用在處理有優先級的任務,根據任務的優先級把訊息發送到對應的佇列,這樣可以指派更多的資源去處理高優先級的佇列,

③ topic

前面講到direct型別的交換器路由規則是完全匹配 BindingKey 和 RoutingKey ,但是這種嚴格的匹配方式在很多情況下不能滿足實際業務的需求,topic型別的交換器在匹配規則上進行了擴展,它與 direct 型別的交換器相似,也是將訊息路由到 BindingKey 和 RoutingKey 相匹配的佇列中,但這里的匹配規則有些不同,它約定:

  • RoutingKey 為一個點號“.”分隔的字串(被點號“.”分隔開的每一段獨立的字串稱為一個單詞),如 “com.rabbitmq.client”、“java.util.concurrent”、“com.hidden.client”;
  • BindingKey 和 RoutingKey 一樣也是點號“.”分隔的字串;
  • BindingKey 中可以存在兩種特殊字串“”和“#”,用于做模糊匹配,其中“”用于匹配一個單詞,“#”用于匹配多個單詞(可以是零個),

topic 型別交換器

以上圖為例:

  • 路由鍵為 “com.rabbitmq.client” 的訊息會同時路由到 Queuel 和 Queue2;
  • 路由鍵為 “com.hidden.client” 的訊息只會路由到 Queue2 中;
  • 路由鍵為 “com.hidden.demo” 的訊息只會路由到 Queue2 中;
  • 路由鍵為 “java.rabbitmq.demo” 的訊息只會路由到Queuel中;
  • 路由鍵為 “java.util.concurrent” 的訊息將會被丟棄或者回傳給生產者(需要設定 mandatory 引數),因為它沒有匹配任何路由鍵,
④ headers(不推薦)

headers 型別的交換器不依賴于路由鍵的匹配規則來路由訊息,而是根據發送的訊息內容中的 headers 屬性進行匹配,在系結佇列和交換器時制定一組鍵值對,當發送訊息到交換器時,RabbitMQ會獲取到該訊息的 headers(也是一個鍵值對的形式)'對比其中的鍵值對是否完全匹配佇列和交換器系結時指定的鍵值對,如果完全匹配則訊息會路由到該佇列,否則不會路由到該佇列,headers 型別的交換器性能會很差,而且也不實用,基本上不會看到它的存在,

二 安裝 RabbitMq

通過 Docker 安裝非常方便,只需要幾條命令就好了,我這里是只說一下常規安裝方法,

前面提到了 RabbitMQ 是由 Erlang語言撰寫的,也正因如此,在安裝RabbitMQ 之前需要安裝 Erlang,

注意:在安裝 RabbitMQ 的時候需要注意 RabbitMQ 和 Erlang 的版本關系,如果不注意的話會導致出錯,兩者對應關系如下:

RabbitMQ 和 Erlang 的版本關系

2.1 安裝 erlang

1 下載 erlang 安裝包

在官網下載然后上傳到 Linux 上或者直接使用下面的命令下載對應的版本,

[root@SnailClimb local]#wget http://erlang.org/download/otp_src_19.3.tar.gz

erlang 官網下載:http://www.erlang.org/downloads

2 解壓 erlang 安裝包

[root@SnailClimb local]#tar -xvzf otp_src_19.3.tar.gz

3 洗掉 erlang 安裝包

[root@SnailClimb local]#rm -rf otp_src_19.3.tar.gz

4 安裝 erlang 的依賴工具

[root@SnailClimb local]#yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC-devel

5 進入erlang 安裝包解壓檔案對 erlang 進行安裝環境的配置

新建一個檔案夾

[root@SnailClimb local]# mkdir erlang

對 erlang 進行安裝環境的配置

[root@SnailClimb otp_src_19.3]# 
./configure --prefix=/usr/local/erlang --without-javac

6 編譯安裝

[root@SnailClimb otp_src_19.3]# 
make && make install

7 驗證一下 erlang 是否安裝成功了

[root@SnailClimb otp_src_19.3]# ./bin/erl

運行下面的陳述句輸出“hello world”

 io:format("hello world~n", []).

輸出“hello world”

大功告成,我們的 erlang 已經安裝完成,

8 配置 erlang 環境變數

[root@SnailClimb etc]# vim profile

追加下列環境變數到檔案末尾

#erlang
ERL_HOME=/usr/local/erlang
PATH=$ERL_HOME/bin:$PATH
export ERL_HOME PATH

運行下列命令使組態檔profile生效

[root@SnailClimb etc]# source /etc/profile

輸入 erl 查看 erlang 環境變數是否配置正確

[root@SnailClimb etc]# erl

輸入 erl 查看 erlang 環境變數是否配置正確

2.2 安裝 RabbitMQ

1. 下載rpm

wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.8/rabbitmq-server-3.6.8-1.el7.noarch.rpm

或者直接在官網下載

https://www.rabbitmq.com/install-rpm.html

2. 安裝rpm

rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc

緊接著執行:

yum install rabbitmq-server-3.6.8-1.el7.noarch.rpm

中途需要你輸入"y"才能繼續安裝,

3 開啟 web 管理插件

rabbitmq-plugins enable rabbitmq_management

4 設定開機啟動

chkconfig rabbitmq-server on

4. 啟動服務

service rabbitmq-server start

5. 查看服務狀態

service rabbitmq-server status

6. 訪問 RabbitMQ 控制臺

瀏覽器訪問:http://你的ip地址:15672/

默認用戶名和密碼: guest/guest;但是需要注意的是:guestuest用戶只是被容許從localhost訪問,官網檔案描述如下:

“guest” user can only connect via localhost

解決遠程訪問 RabbitMQ 遠程訪問密碼錯誤

新建用戶并授權

[root@SnailClimb rabbitmq]# rabbitmqctl add_user root root
Creating user "root" ...
[root@SnailClimb rabbitmq]# rabbitmqctl set_user_tags root administrator

Setting tags for user "root" to [administrator] ...
[root@SnailClimb rabbitmq]# 
[root@SnailClimb rabbitmq]# rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
Setting permissions for user "root" in vhost "/" ...

再次訪問:http://你的ip地址:15672/ ,輸入用戶名和密碼:root root

RabbitMQ控制臺

作者:Snailclimb
鏈接:RabbitMQ 入門
來源:gitee

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/235866.html

標籤:Java

上一篇:為了 SpringBoot 提交 Tomcat 執行,我總結了這么多

下一篇:前臺向后端傳送資料‘時分秒’丟失問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more