主頁 >  其他 > 初識kafka,環境部署與(Springboot+SpringCloud+Eurka)應用(Linux)

初識kafka,環境部署與(Springboot+SpringCloud+Eurka)應用(Linux)

2021-12-13 07:52:10 其他

Kafka介紹和部署應用

kafka介紹

kafka是一個高吞吐量的分布式訂閱訊息系統,可以處理消費者在網站中的所有動作流資料,像hadoop一樣的日志資料和離線分析系統,但是又要求實時處理的限制,kafka的目的是通過Hadoop的并行加載機制來統一線上和離線的訊息處理,也是為了通過集群來提供實時的訊息,

kafka的特性

  • 通過O(1)的磁盤資料提供訊息的持久化,這種結構對于即使資料量為TB級的訊息存盤也能夠保持長時間的穩定性能,

  • 高吞吐量:即使是非常普通的硬體Kafka也能支持每秒數百萬計的訊息,

  • 支持通過Kafka服務器和消費機集群來區分訊息,

  • 這次Hadoop并行資料加載,

流媒體平臺三個關鍵功能

  • 發布和訂閱記錄流,類似于訊息佇列或企業訊息傳遞系統

  • 以容錯的持久方式存盤記錄流

  • 記錄發生時處理流

kafka的應用場景

  1. 構建可在系統或應用程式之間可靠獲取的實時流資料管道
  2. 構建轉換回應資料的實時流應用程式

例如:

  • 日志收集:可以用kafka收集各種服務的log,通過kafka以統一介面服務的方式開放給各種consumer(消費者)

  • 訊息系統:解耦生產者和消費者、快取訊息等

  • 用戶活動跟蹤:kafka經常被用來記錄web用戶或者app用戶的各種活動,如瀏覽網頁、搜索、點擊等活動,這些活動訊息可以被各個服務器發布到kafka的topic中,然后消費者通過訂閱這些topic來做實時的監控分析,亦可保存到資料庫,

  • 運營指標:kafka也經常用來記錄運營監控資料,包括收集各種分布式應用的資料,生產各種操作的集中反饋,比如報警和報告

  • 流式處理:比如spark streaming和storm,

kafka的應用原理

1、Kafka作為一個集群運行在一個或者多個可跨多個資料中心的服務器上

2、Kafka集群以稱為** topics主題**的類別存盤記錄流

3、每條記錄都包含一個鍵,一個值和一個時間戳

kafka的核心

  1. Producer API(生產者API)允許應用程式發布記錄流至一個或多個kafka的topics(主題),

  2. Consumer API(消費者API)允許應用程式訂閱一個或多個topics(主題),并處理所產生的對他們記錄的資料流,

  3. Streams API(流API)允許應用程式充當流處理器,從一個或多個topics(主題)消耗的輸入流,并產生一個輸出流至一個或多個輸出的topics(主題),有效的變換所述的輸入流,以輸出流,

  4. Connector API(連接器API)允許構建和運行kafka topics(主題)連接到現有的應用程式或資料系統中重用生產者或消費者,例如,關系型資料庫的連接器可能捕獲對表的每個更改,

在Kafka中,客戶端和服務器之間的通信是通過簡單,高性能,語言無關的TCP協議完成的,Kafka提供Java客戶端,但是客戶端提供多語言版本,

Kafka的消費模式

kafka的消費模式主要有兩種,一種是一對一的消費,也就是點對點的通信,即一個發送一個接收,第二種為一對多消費,即一個訊息發送到訊息佇列,消費者根據訊息佇列的訂閱拉取訊息消費,

  • 一對一消費:訊息生產者發布訊息到佇列中,通知消費者從佇列中拉取訊息進行消費,`訊息被消費之后則洗掉`,Queue支持多個消費者,但對于一條訊息而言,只有一個消費者可以消費,即一條訊息只能被一個消費者消費,

  • 一對多消費:這種模式稱為發布/訂閱模式,即利用Topic存盤訊息,訊息生產者將訊息發布到Topic中,同時有多個消費者訂閱此Topic,消費者可以從中消費訊息,注意發布到Topic中的訊息會被多個消費者消費,`消費者消費資料之后,資料不會被清除`,Kafka會默認保存一段時間,然后再洗掉,

Kafka基礎結構

Kafka像其他MQ一樣,也有自己的基礎架構,主要存在生產者Producer、Kafka集群的Broker、消費者Consumer,注冊訊息Zookeeper等,

zookeeper(Linux)部署與應用

  1. Producer:訊息生產者,向kafka發送訊息的角色,

  2. Consumer:訊息消費者,即從Kafka中拉取訊息消費的客戶端,

  3. Consumer Group:消費者組,消費者組則是一組中存在多個消費者,消費者消費Broker中當前Topic的不同磁區中的訊息,消費者組之間互不影響,所有的消費者都屬于某個消費者組,即消費者組是邏輯上的一個訂閱者,某一個磁區中的訊息只能夠一個消費者組中的一個消費者所消費,

  4. Broker:代理,經紀人,一臺kafka服務器就是一個Broker,一個集群由多個Broker組成,一個Broker可以容納多個Topic,

  5. Topic:主題,可以理解成一個佇列,生產者和消費者都是面向一個Topic,

  6. Partition:磁區,為了實作拓展性,一個非常大的Topic可以分布到多個Broker上,一個Topic可以分為多個Partition,每個Partition是一個有序的佇列(磁區內部有序,但不能保證全域有序)

  7. Replica:副本Replication,為保證集群中某個節點發生故障,節點上的Partition資料不丟失,Kafka可以正常作業,Kafka提供了副本機制,一個Topic的每個磁區有若干個副本,一個Leader和多個Follwer,

  8. Leader:每個磁區多個副本的主角色,生產者發送資料物件,以及消費者消費資料的物件都是Leader,

  9. Follower:每個磁區多個副本的從角色,實時的從Leader中同步資料,保持和Leader資料的同步,Leader發生故障的時候,某個Follwer會成為新的Leader,

上述一個Topic會產生多個磁區Partition,磁區中區分為Leader和Follwer,訊息一般發送到Lerder,Follwer通過資料的同步與Leader保持同步,消費的話也是再Leader中發生消費,如果多個消費者,則分別消費Leader和各個Follwer中的訊息,當Leader發生故障的時候,某個Follwer會成為主節點,此時會對齊訊息的偏移量,

訊息佇列的特性

耦合的狀態表示當你實作某個功能的時候,是直接接入當前介面,而利用訊息佇列,可以將相應的訊息發送到訊息佇列,這樣的話,如果介面出了問題,也不會影響到當前的功能,

傳統呼叫方式:A -呼叫-> B

中間件:A-發送->kafka->訂閱->B

異步處理,代替了之前的同步處理,異步處理不需要讓流程走完就回傳結果,可以將訊息發送到訊息佇列中,然后回傳結果,剩下的讓其他業務處理介面從訊息佇列中拉取消費處理即可,

流量削峰,高流量的時候,使用訊息佇列作為中間件可以將流量的高峰保存在訊息佇列中,從而防止了系統的高請求,減輕服務器的請求處理壓力,

kafka的部署應用(單機環境安裝,基于Linux)

kafka需要依賴java環境運行,kafka的安裝包可以在這里下載:

kafka和zookeeper的安裝包(Liunx)

版本是:kafka_2.13-3.0.0

將包下載到相關的目錄,這里新建了一個kafka的檔案夾,然后解壓到指定目錄中;

cd /kafka
tar -zxvf kafka_2.13-3.0.0.tgz` 重命名為:`mv kafka_2.13-3.0.0 kafka_2.13

配置日志:進入到kafka/kafka_2.13中,創建日志目錄logs;

cd /kafka/kafka_2.13
mkdir logs

修改kafka組態檔;

進入到目錄
/kafka/kafka_2.13/config
修改server.properties檔案
編輯相應的引數vim server.properties 
broker.id=0
port=9092
host.name=127.0.0.1 # 服務器ip地址,修改為自己的服務器ip
log.dirs=/kafka/kafka_2.13/logs # 日志存放路徑,上面創建的目錄  
zookeeper.connect=localhost:2181 #zookeeper地址和埠,單機配置部署,localhost:2181
然后保存退出
kafka需要基于Zookeeper服務使用,因此需要安裝zookeeper環境先`;(詳見zookeeper部署與應用)
注釋去掉,`listeners=PLAINTEXT://:9092
注釋去掉,把`advertised.listeners`值改為`PLAINTEXT://host_ip:9092(改成服務器ip)

啟動kafka

Kafka支持內置的Zookeeper和參考外部的Zookeeper,這里使用遠程服務器的Zookeeper,

先啟動zookeeper

進入bin目錄,啟動:

./kafka-server-start.sh /config/server.properties &

應用整合及使用(基于SpringBoot、SpringCloud、Eruka)

Springboot中使用kafka

pom檔案依賴

        <!--kafka依賴-->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>

配置yml資訊

spring:
    # kafka配置資訊
    kafka:
        bootstrap-servers: 192.168.115.79:9092 # 指定kafka服務地址 集群用逗號隔開
        producer:
        retries: 1 # 發生錯誤后,訊息重發次數,
        #當有多個訊息需要被發送到同一個磁區時,生產者會把它們放在同一個批次里,該引數指定了一個批次可以使用的記憶體大小,按照位元組數計算,
        batch-size: 16384
        buffer-memory: 33554432 # 設定生產者記憶體緩沖區的大小,
        key-serializer: org.apache.kafka.common.serialization.StringSerializer # 鍵的序列化方式
        value-serializer: org.apache.kafka.common.serialization.StringSerializer # 值的序列化方式
        # =0:生產者在成功寫入訊息之前不會等待任何來自服務器的回應,
        # =1:只要集群的首領節點收到訊息,生產者就會收到一個來自服務器成功回應,
        # =all:只有當所有參與復制的節點全部收到訊息時,生產者才會收到一個來自服務器的成功回應,
        acks: 1
        consumer:
        # 自動提交的時間間隔 在spring boot 2.X 版本中這里采用的是值的型別為Duration 需要符合特定的格式,如1S,1M,2H,5D
        auto-commit-interval: 1s
        # 該屬性指定了消費者在讀取一個沒有偏移量的磁區或者偏移量無效的情況下該作何處理:
        # latest(默認值)在偏移量無效的情況下,消費者將從最新的記錄開始讀取資料(在消費者啟動之后生成的記錄)
        # earliest :在偏移量無效的情況下,消費者將從起始位置讀取磁區的記錄
        auto-offset-reset: earliest
        # 是否自動提交偏移量,默認值是true,為了避免出現重復資料和資料丟失,可以把它設定為false,然后手動提交偏移量
        enable-auto-commit: false
        # 鍵的反序列化方式
        key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        # 值的反序列化方式
        value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        listener:
        # 在偵聽器容器中運行的執行緒數,
        concurrency: 5
        #listner負責ack,每呼叫一次,就立即commit
        ack-mode: manual_immediate
        missing-topics-fatal: false

封裝生產者_KafkaProducer

/**
    * kafka生產者_配置
    */
    @Component
    @Slf4j
    public class KafkaProducer {

        /**
        * kafka使用模板
        */
        @Autowired
        private KafkaTemplate<String,Object> kafkaTemplate;

        /**
        * 自定義topic
        */
        public static final String TOPIC_TEST1 = "topic_test1";

        public static final String TOPIC_TEST2 = "topic_test2";

        /**
        * 自定義組
        */
        public static final String TOPIC_GROUP1 = "topic_group1";

        public static final String TOPIC_GROUP2 = "topic_group2";

        /**
        * 生產訊息_發送
        */
        public void send(Object obj) {
            String obj2String = JSONObject.toJSONString(obj);

            log.info("準備發送訊息為:{}",obj2String);

            // 發送訊息
            ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(TOPIC_TEST1,obj);

            // 監聽訊息加入佇列結果回傳
            future.addCallback(new ListenableFutureCallback<SendResult<String, Object>>() {
                /**
                * 發送失敗處理
                * @param throwable
                */
                @Override
                public void onFailure(Throwable throwable) {
                    log.info(TOPIC_TEST1 + " - 生產者 發送訊息失敗:" + throwable.getMessage());
                }

                /**
                * 發送成功處理
                * @param stringObjectSendResult
                */
                @Override
                public void onSuccess(SendResult<String, Object> stringObjectSendResult) {
                    // 發送成功處理
                    log.info(TOPIC_TEST1 + " - 生產者 發送訊息成功:" + stringObjectSendResult.toString());
                }
            });
        }
    }

封裝消費者_KafkaConsumer

/**
    * kafka消費者_配置_topic
    * 實作topic監聽
    */
    @Component
    @Slf4j
    public class KafkaConsumer {
        @KafkaListener(topics = KafkaProducer.TOPIC_TEST1,groupId = KafkaProducer.TOPIC_GROUP1)
        public void topic_test1(ConsumerRecord<?,?> record, Acknowledgment ack,
                                @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
            Optional message = Optional.ofNullable(record.value());
            if (message.isPresent()) {
                Object msg = message.get();
                log.info("topic_test1 消費了:Topic:" + topic + ",Message" + msg);
                ack.acknowledge();
            }
        }

        @KafkaListener(topics = KafkaProducer.TOPIC_TEST2,groupId = KafkaProducer.TOPIC_GROUP2)
        public void topic_test2(ConsumerRecord<?,?> record, Acknowledgment ack,
                                @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
            Optional message = Optional.ofNullable(record.value());
            if (message.isPresent()) {
                Object msg = message.get();
                log.info("topic_test2 消費了:Topic:" + topic + ",Message" + msg);
                ack.acknowledge();
            }
        }
    }

測驗使用_KafkaController

/**
    * kafka介面測驗
    */
    @RestController
    @Slf4j
    @RequestMapping("kafka")
    @Api(value = "測驗kafka介面",tags = "測驗kafka介面實作")
    public class KafkaController {

        /**
        * 注入生產者
        */
        @Autowired
        private KafkaProducer kafkaProducer;

        @GetMapping("send")
        @Transactional(rollbackFor = Exception.class)
        public void send() {
            kafkaProducer.send("這是 kafka 的測驗 topic 資料");
        }
    }

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

標籤:其他

上一篇:Flink之watermark 處理延遲資料 詳解

下一篇:DDD領域驅動篇——第一章(一文帶你領略DDD、微服務和中臺設計)

標籤雲
其他(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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more