.Net Core 會逆襲成為最受歡迎開發平台嗎?

本文由葡萄城技術團隊於博客園原創並首發

轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。

.Net Core 是什麼?

最新.Net Core 熱詞霸佔了各個技術熱搜,看來微軟近年來發布的 .Net Core 還是成功了引起了大家的熱烈討論。如果您對微軟熟悉,肯定是很了解.Net 平台,但是隨着互聯網的興起,好像微軟這個霸主的地位有所撼動。

 

.NET Core 是.NET Framework的新一代版本,是微軟開發的第一個跨平台 (Windows、Mac OSX、Linux) 的應用程序開發框架(Application Framework),未來也將會支持 FreeBSD 與 Alpine 平台。.Net Core也是微軟在一開始發展時就開源的軟件平台[1],由於 .NET Core 的開發目標是跨平台的因此 .NET Core 會包含 .NET Framework 的類別庫,但與 .NET Framework 不同的是 .NET Core 採用包化 (Packages) 的管理方式,應用程序只需要獲取需要的組件即可,與 .NET Framework 大包式安裝的作法截然不同,同時各包亦有獨立的版本線 (Version line),不再硬性要求應用程序跟隨主線版本。

 

重點來啦:

  • 跨平台:可在 Windows、macOS 和 Linux 操作系統上運行
  • 跨體繫結構保持一致:在多個體繫結構(包括 x64、x86 和 ARM)上以相同的行為運行代碼
  • 命令行工具:包括可用於本地開發和持續集成方案中的易於使用的命令行工具。
  • 部署靈活:可以包含在應用或已安裝的并行(用戶或系統範圍安裝)中。 可搭配 Docker 容器使用
  • 兼容性: .NET Core 通過 .NET Standard 與 .NET Framework、Xamarin 和 Mono 兼容
  • 開放源代碼: .NET Core 平台是開放源代碼,使用 MIT 和 Apache 2 許可證。 .NET Core 是一個 .NET Foundation 項目
  • 強勁性能:超強的後台性能,超出.Net Framework
  • 支持命令行執行所有操作

 

.Net Core 當前的現狀是什麼

目前可以看到很多傳統行業的信息系統也在逐漸升級平台,而且很多大的互聯網公司也已經使用,畢竟一次開發即可實現跨平台的部署及應用,也是減少成本的重要體現。

 

可以確定.Net Core 是未來的發展趨勢。 .Net FrameWork也會延續使用,畢竟短期內遷移一些大型項目是很有難度的,而且也不太可能。.Net Core 和.Net FrameWork 的關係就如同是新能源汽車和傳統穩定的油耗汽車。油耗汽車已經經歷了多年的發展,技術非常成熟穩定,可以放心自由的使用。而新能源汽車是一個新興的技術,也是未來將要取待傳統技術的未來發展方向,所以使用.Net Core 開發項目必須越早越好。

 

.Net Core 與. Net FrameWork 對比:

.NET Core

.NET Framework

跨平台 (OS platform): 支持Windows, Linux, 及 macOS

僅支持在 Windows運行

安裝過程是獨立,端對端,可以在同一計算器中為應用程序指定獨立的.Net Core 版本。

一台計算機上的所有應用程序都在同一.NET Framework版本上運行

高性能:在集合,數學,正則表達式,字符串,文件等方面都有提升。.

高兼容性

開源: 基於.NET平台既可以根據 MIT或 Apache 2 授權

與最廣泛的NuGet軟件包,第三方庫和內部庫兼容

v2.0 實現了.NET Standard 2.0¹

v4.6.1+ 以上版本支持s .NET Standard 2.0

 

使用.Net Core 優勢:

1. 支持在任何平台部署,跨平台幾乎沒有任何成本

2. 龐大的.Net 標準庫支持

3. 面向高性能的服務器開發,基於 微軟 Azure雲的平台優勢,已提供高性能的服務。

4. 高性能和可移植性

5. 兼容多平台

 

如何平滑的遷移項目至.Net Core 平台

很多原有的項目是基於.Net FrameWork 開發的,可能是 Windows. WPF, ASP.NET MVC,那本身的局限是只能在Windows系統部署外,還涉及到一些核心功能的實現。傳統框架的種種不足,需要大的突破和改變。這意味着打破變化,但結果是值得期待的。

 

遷移原有項目到新的.Net Core 平台意味着你可以保留舊項目的所有核心業務功能,不需要重構整個項目,從0開始開發。以下是我們根據經驗給出了幾類的應用的遷移難度。

項目類型

遷移難易程度

Web 應用: ASP.NET MVC

簡單

WebForm 應用

不建議遷移,因為.Net Core 支持 WebForm

Windows 應用 (Universal Framework)

不需要遷移

Windows 應用(基於Sliverlight)

簡單

WPF 及WinForms 桌面應用

複雜

控制台應用

簡單

 

1. 遷移還是重構

如果針對前端項目,遷移是最佳選擇,畢竟前端代碼均可復用,唯一要改動的就是後端代碼。儘管.Net Core 和.Net Frame Work 項目都是基於C# 語言做開發的,然而兩者是不同的運行機制。所以如果是後端很重的項目,還是建議重寫,這樣也會利用一些新技術的優勢。

 

2. NuGet 包

在遷移之前,需要確認引用的.Net 標準庫是否在.Net Core中支持或丟棄,如果不支持的話,就需要考慮如何用新的包代替或者當前功能的重構。

.Net 標準包是在.Net 4.6.1 和.Net Core 中都可使用的,所以只需要可以使用該技術升級舊的PCL。如果你添加了.Net 標準庫的引用,同樣也可以在.Net Core 項目中使用。

 

3. Html / JavaScript / CSS 復用

可以將這些文件直接複製到.NET Core解決方案中。 但是,請確保更改代碼中的文件路徑,例如CSS中的圖像路徑。 因為經典的ASP.NET / MVC模板使用“ / Content /”目錄,而.NET Core使用“ / css /”,“ / js /”,“ / lib /”等。對此沒有任何限制,它們只是約定而已 。

 

如何選擇.Net Core 的開發工具

在開發項目時候,新的平台和技術總是帶給你項目的一些新的重大突破功能,比如性能,比如核心功能提升,所以不僅我們的項目要一直跟隨升級,我們所選擇的開發工具,也要緊跟技術前沿,甚至要領先於我們的項目升級進度,為我們開發項目始終提供最有力的技術支持。

 

.NET Core是多平台應用程序的未來。 如我們所見,.NET Core提供了傳統框架不支持的強大的本機新功能。 另一方面,.NET Core並不完全支持所有現有的應用程序類型進行遷移,尤其是那些與Windows OS緊密集成的應用程序類型,因此必須仔細考慮並計劃這些挑戰。

 

所以我們在選擇新平台的同時,也需要考慮一些輔助開發的工具。以及這些工具在該領域的技術背景,是否足夠穩定,是否有足夠明確的未來,甚至比我們更能預先跟蹤未來的技術棧,以始終在我們遷移新項目的時候提供輔助工具。

 

這裏推介一些支持.Net Core 平台的開發控件:

  • API Protability Tool。這是一款輔助.net開發者在不同的開發框架上遷移源代碼工程的靜態代碼審查工具。由於.net framework具有多個歷史版本,並且.net core以及Xamarin等開發框架在基礎類庫中實現API數量和類型有很多的不一致情況。.net開發者想把自身源代碼升級到更高的.net版本或者遷移到其他的.net開發框架上,會面臨很多API調用不兼容的問題。該工具就是幫助.net開發者審查.net項目的源代碼,並生成審查報告,快速幫助開發人員找到不兼容代碼行以及協助評估遷移工作量。
  • PostMan,Postman是一款支持跨平台的應用程序,用來幫助開發者快速構建和測試REST API 服務。Postman可以模擬HTTP請求的所有謂詞,用於REST API的測試。
  • Visual Studio Code , Visual Studio Code是跨操作系統平台的輕量級代碼編輯器。支持絕大多數主流語言編譯和調試的能力。
  • ActiveReports .Net 報表控件,專註報表領域20餘年,所以可見專業性以及對於.Net 技術的完善的集成技術,支持最新的ASP.Net Core MVC (.Net Core)項目的開發。可快速解決.Net Core 平台的報表設計,展示,打印/導出,數據鑽取等功能,與此也提供了最終用戶免費設計器(在線/桌面端)解決部署差異的難題。
  •  

     

  • Wyn Enterprise 嵌入式商業智能和報表軟件,基於.NET Core平台,可以以白標的方式嵌入到應用系統中,快速增強應用系統的自助式分析、移動BI、數據可視化、報表統計和數據填報等功能,最終用戶在業務系統中便能通過數據分析,為決策制定提供數據支撐。

  •  

     

     

 

綜上所述,無論從其性能和生態上預測,.NET Core 都極有可能成為最受歡迎的開發平台,不過,當前國內僅有騰訊、阿里等廠家願意試水,葡萄城作為一家具備30多年開發經驗的軟件廠商,同樣也在持續對.NET控件進行更新迭代。

如果您有 .NET Core及其衍生技術和開發工具的需求,請訪問葡萄城官網了解詳情。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準

歷久彌新的慢時尚「萬秀的洗衣店」在 Today at Apple 分享穿搭美照創作心得

在崇尚「快時尚」的人眼裡,洗衣店可能是種不被需要的存在。因疫情而有更多時間與經營「萬秀的洗衣店」的阿公阿嬤相處的張瑞夫(Reef Chang),觀察到隨時間流逝,被遺忘的不僅是店中近十年未被領走的珍貴衣服,與一手拉拔自己長大親人的關係,乃至於阿公阿嬤對於自己專業職人的認同感,可能才是更被深埋的存在。

突然有了這樣感觸的 Reef,選擇將自己與阿公阿嬤加上老洗衣店所構築而成的慢時尚經典創作搬上社群平台。現在,他們希望將這種富含療癒生活溫度與惜物觀念的創作精神,傳遞給更多人一起尋找那被遺忘的美好。繼續閱讀歷久彌新的慢時尚「萬秀的洗衣店」在 Today at Apple 分享穿搭美照創作心得報導內文。

歷久彌新的慢時尚「萬秀的洗衣店」在 Today at Apple 分享穿搭美照創作心得

Reef 在今天「萬秀的洗衣店」於 Today at Apple 課程預覽中,分享了很多拍攝阿公阿嬤充滿「慢時尚感」的人像拍攝心得與教學 — 報名要快啊!推薦聽聽他的心得分享,跟作品一樣充滿療癒感與感動!

技巧的部分其實真的並不難 — 他會習慣以較為方正的構圖帶來更專業的感覺,所以會建議大家可以啟動 iPhone 拍攝設定內的「格線」功能,並適時啟動人像拍攝模式來營造更好的淺景深效果。

課程分享中,他常常利用 iPhone XR 開始提供的 1x 廣角人像模式來創作;新世代 iPhone 12 Pro 系列搭載的廣角人像「夜間」模式也讓 Reef 感到十分驚艷,即便是在洗衣店掛衣區的昏暗光線下,依然可以拍到運算式攝影加持後畫質足夠好的人像照片。

共感溝通,細膩觀察

Reef 分享的拍攝技巧真的不艱澀難懂,甚至來到 Pose 與穿搭的環節,他還認為很多時候根本要歸功於阿公阿嬤自己的發揮(是真的很可愛!)。但這中間的關鍵其實是在於與被攝者的溝通與引導,更與細膩的生活觀察脫離不了關係,才能拍攝出他心中追求「先感動自己,再讓別人感受生活中的溫暖」的「最基礎卻最真實」的影像。

▲圖:Reef 現場示範平常創作拍攝時的溝通與拍攝技巧。

之所以會在 Instagram 開始萬秀洗衣店的系列影像創作。是因為阿公阿嬤面對近在身邊卻有溝通隔閡的家人,淡淡說出的一句「我已經沒用了(台語)」。

這讓 Reef 驚覺養育自己長大、彼此之間曾經可以活潑共處的阿公阿嬤,好像隨著 70 多年歷史生意漸漸平淡的洗衣店一起失去活力。彷彿與掛在店深處近十年、洗得一塵不染卻沒人領回的衣物一樣,成了被遺忘的美好。

為了幫帶著自己長大的阿公阿嬤找回以往的活力,拾回身為職人的尊重感。Reef 認為自己應該嘗試扭轉以往兩個世代彼此間偏單向的溝通方式,改為嘗試向彼此解釋互相在意的事物,想要透過「共感」的方式為生活帶來改變。

以隨手可得的題材,像送洗近十年未取的老衣服,透過一起「玩」攝影的方式,讓萬秀洗衣店 WANT SHOW as young — 透過影像秀出八十多歲的萬吉與秀娥內心的那個時尚靈魂,不因為有年紀了就不做年輕時敢於實踐的事。

IG 上的「萬秀的洗衣店」的簡介,寫的是孫子不忍心看阿公阿嬤每天無聊發呆的產物。但從照片中看到的,其實更多是 Reef 對於阿公阿嬤與自己的生活溫暖瞬間的細膩觀察。Reef:「要做的,其實是用他們能懂得語言和他們對話,讓時代縮短距離。」

他會詢問像是「你以前是怎麼看小姐的?」這類有趣的問題,引導阿公與阿嬤擺出有趣的互動表情與姿勢。也懂得觀察他們平常的生活姿態,透過時尚的衣服穿搭、攝影構圖與適當的引導,拍攝出專業感十足但又充滿可愛細節的人像作品。更藉此有機會聽到更多以往沒有聽過,屬於他們倆的小故事。

▲圖右:翻出阿公 24 歲當兵時,兩人曬恩愛讓人閃瞎照片信物的阿嬤。

為了不無聊出發的「萬秀的洗衣店」,不僅成為連總統都 Feat. 的 IG 網紅。更大的重點在於,現在阿公阿嬤也更願意秀出彼此的愛,更樂於與家人分享過去的照片與穿搭,證明自己以前其實也是非常時尚的,甚至還會提早為 Reef 的拍攝構思企劃(!),提供接下來的創作靈感,這些都是很大的改變。

▲圖:現場示範衣服上的洗標,證明了他們的確曾經也是某些人的「故事」。不過 Reef 也強調,這些衣服真的是放了 8、9 年以上都未取(基本上把別人的店當衣櫃也不付錢了…XD),所以不用擔心洗衣店會沒事就拿客人送洗的衣服來拍照 — 倒是有人看到他們的新聞,才想到衣服放了一年還沒拿(咦)。

這些當初啟動「萬秀的洗衣店」創作拍攝時從沒想過的收穫。也讓 Reef 認為既然受到了這麼大的關注,似乎也應該藉此傳達更多理念。他們在嘖嘖上發起的「重新定衣計畫,建立洗衣店「被遺忘衣服」的循環平台」就是一個源自於更惜物、有慈善意義、更永續環保的計畫。

人類對於速度的追求永無止盡,暖心溫度的凝聚卻是永遠快不起來也勉強不來的存在。透過「萬秀的洗衣店」對於時尚詮釋引起的更多共感,也許可以成為你我利用手邊的創作工具,與親友有更深溝通交流的契機。

如果你喜歡他們的作品的話,可以報名 Today at Apple 課程學習如何利用手上的 iPhone,拍出充滿「萬秀的洗衣店」風格的溫暖照片。

          在 Instagram 查看這則貼文                      

萬秀的洗衣店|WANT SHOW as young(@wantshowasyoung)分享的貼文

          在 Instagram 查看這則貼文                      

萬秀的洗衣店|WANT SHOW as young(@wantshowasyoung)分享的貼文

          在 Instagram 查看這則貼文                      

萬秀的洗衣店|WANT SHOW as young(@wantshowasyoung)分享的貼文

          在 Instagram 查看這則貼文                      

萬秀的洗衣店|WANT SHOW as young(@wantshowasyoung)分享的貼文

更多「萬秀的洗衣店」作品,請至 Instagram 觀看。或動手開始自己拍出更時尚的親友吧!

延伸閱讀:

iPhone 12 Pro Max 深度實拍體驗:ProRAW 讓 iPhone 踏入專業

M1 MacBook Air 開箱體驗:最驚喜的不變

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準

RocketMQ系列(二)環境搭建

RocketMQ的基本概念在上一篇中給大家介紹了,這一節將給大家介紹環境搭建。RocketMQ中最基礎的就是NameServer,我們先來看看它是怎麼搭建的。

NameServer

RocketMQ要求的環境是JDK8以上,我們先檢查一下環境,

[root@centOS-1 ~]# java -version
openjdk version "11.0.3" 2019-04-16 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.3+7-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.3+7-LTS, mixed mode, sharing)

我的這個機器並沒有刻意的安裝JDK,而是系統自帶的OpenJDK 11,這應該也是沒有問題的。然後我們從RocketMQ官網下載最新的安裝包,並且上傳到/opt目錄下,

[root@centOS-1 opt]# ll
-rw-r--r--.  1 root  root 13838456 6月   3 08:49 rocketmq-all-4.7.0-bin-release.zip

然後我們解壓這個zip包,

[root@centOS-1 opt]# unzip rocketmq-all-4.7.0-bin-release.zip

這裏使用的是unzip命令,如果你的機器里沒有這個命令,可以使用yum install安裝一個。解壓以後,進入到RocketMQ的主目錄,並且啟動一下NameServer。

[root@centOS-1 opt]# cd rocketmq-all-4.7.0-bin-release
[root@centOS-1 rocketmq-all-4.7.0-bin-release]# ./bin/mqnamesrv
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
Unrecognized VM option 'UseCMSCompactAtFullCollection'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

這裏出了一個錯誤Error: Could not create the Java Virtual Machine,這是由於RocketMQ的啟動文件都是按照JDK8配置的,而我們這裏使用的是OpenJDK11,有很多命令參數不支持導致的,如果小夥伴們使用的是JDK8,正常啟動是沒有問題的。

在這裏我們改一下RocketMQ的啟動文件,

[root@centOS-1 rocketmq-all-4.7.0-bin-release]# vim bin/runserver.sh 
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
#在CLASSPATH中添加RocketMQ的lib目錄
#export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
export CLASSPATH=.:${BASE_DIR}/lib/*:${BASE_DIR}/conf:${CLASSPATH}

修改的地方我們增加了註釋,在ClassPath里添加了lib目錄,然後在這個文件的末尾,註釋掉升級JDK后不支持的幾個參數,

JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
#JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8  -XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log -XX:+PrintGCDetails"
#JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
#JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"

好了,修改完以後,我們保存退出,再次啟動,這次我們在後台啟動NameServer,

[root@centOS-1 rocketmq-all-4.7.0-bin-release]# nohup ./bin/mqnamesrv &

[root@centOS-1 rocketmq-all-4.7.0-bin-release]# tail -500f ~/logs/rocketmqlogs/namesrv.log 

然後查看一下日誌,在日誌中看到main - The Name Server boot success. serializeType=JSON,說明NameServer啟動成功了。

單點的NameServer肯定是不能滿足我們的要求的,怎麼也要做個集群吧。NameServer是一個無狀態的服務,節點之間沒有任何數據往來,所以NameServer的集群搭建不需要任何的配置,只需要啟動多個NameServer服務就可以了,它不像Zookeeper集群搭建那樣,需要配置各個節點。在這裏我們就啟動3個NameServer節點吧,對應我們的3台機器,192.168.73.130,192.168.73.131,192.168.73.132。

Broker

NameServer集群搭建完成,下面就搭建Broker了,Broker呢,我們要搭建一個兩主兩從結構的,主從之間異步備份,保存磁盤也是使用異步的方式。如果你對主從同步和保存磁盤的方式還不了解,看看上一節的內容吧。異步兩主兩從這種結構的配置,在RocketMQ中已經有例子了,我們先一下配置文件。

[root@centOS-1 rocketmq-all-4.7.0-bin-release]# vim conf/2m-2s-async/broker-a.properties 

這個配置文件是broker-a“主”的配置文件,

brokerClusterName=RocketMQ-Cluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

其中,

  • brokerClusterName是MQ集群的名稱,我們改為RocketMQ-Cluster。
  • brokerName是隊列的名字,配置為broker-a。
  • brokerId是隊列的id,0代表是“主”,其他正整數代表着“從”。
  • deleteWhen=04 代表着commitLog過期了,就會被刪除。
  • fileReservedTime是commitLog的過期時間,單位是小時,這裏配置的是48小時。
  • brokerRole,隊列的角色,ASYNC_MASTER是異步主。
  • flushDiskType,保存磁盤的方式,異步保存。

再看看broker-a的從配置,

brokerClusterName=RocketMQ-Cluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

其中,集群的名字一樣,隊列的名字一樣,只是brokerId和brokerRole不一樣,這裏的配置代表着它是隊列broker-a的“從”。broker-b的配置和broker-a是一樣的,只是brokerName不一樣而已,在這裏就不貼出來了。

兩主兩從的配置文件都已經配置好了,我們來規劃一下,我們的NameServer是3台192.168.73.130,192.168.73.131,192.168.73.132,broker按照如下部署:

  • broker-a(主):192.168.73.130
  • broker-a(從):192.168.73.131
  • broker-b(主):192.168.73.131
  • broker-b(從):192.168.73.130

接下來,我們啟動broker,在192.168.73.130上啟動 broker-a(主)和broker-b(從)。和NameServer一樣,我們需要修改一下啟動的腳本,否則也會報錯誤。我們修改的是runbroker.sh這個文件,修改的內容和前面是一樣的,這裏就不贅述了。在啟動文件中,內存大小配置的是8g,如果機器的內存不夠,可以適當減少一下內存。

這裏還要做個說明,由於我們在一台機器上啟動了兩個broker實例,監聽端口和日誌存儲的路徑都會有衝突。那麼我們在192.168.73.130的broker-b(從)的配置文件中,增加配置,如下:

brokerClusterName=RocketMQ-Cluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

listenPort=11911
storePathRootDir=~/store-b                       

broker-b(從)的端口改為11911,區別默認的10911;storePathRootDir改為~/store-b,區分默認的~/store。

同樣在192.168.73.131的broker-a(從)也要做修改,如下:

brokerClusterName=RocketMQ-Cluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

listenPort=11911
storePathRootDir=~/store-a

然後,我們在192.168.73.130上啟動,如下,

nohup ./bin/mqbroker -c conf/2m-2s-async/broker-a.properties -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' &

nohup ./bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' &

  • -c 指定的是配置文件,分別指定的是broker-a(主)和broker-b(從)。
  • -n 指定的是NameServer的地址,指定了3個,用,隔開。

再在192.168.73.131上啟動,如下,

nohup ./bin/mqbroker -c conf/2m-2s-async/broker-b.properties -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' &

nohup ./bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' &

好,如果沒有出現錯誤,到這裏,集群就搭建成功了。這裏邊有個小坑,大家一定要注意,就是-n後面的地址一定要用”括起來,並且地址之間要用;,否則,我們在查看集群列表時,是看不到的。

mqadmin

集群已經搭建好了,我們可以查看一下集群的狀態,查看集群的狀態,我們可以使用mqadmin,命令如下:

./bin/mqadmin clusterlist -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876'
  • clusterlist 是查看集群的命令
  • -n 後面是NameServer的地址,注意這裏也要用”括起來,並且地址之間要用;隔開

執行結果如下:

#Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
RocketMQ-Cluster  broker-a                0     192.168.73.130:10911   V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 442039.47 -1.0000
RocketMQ-Cluster  broker-a                1     192.168.73.131:11911   V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 442039.47 0.2956
RocketMQ-Cluster  broker-b                0     192.168.73.131:10911   V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 442039.47 0.2956
RocketMQ-Cluster  broker-b                1     192.168.73.130:11911   V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 442039.47 -1.0000

我們可以看到在這個NameServer中心中,只有一個broker集群RocketMQ-Cluster,有兩個broker,broker-a和broker-b,而且每一個broker都有主從,broker的ip我們也可以看到。

好了~ 到這裏RocketMQ的集群就搭建好了,有問題評論區留言哦~~

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準

重量不到一公斤!結合高效能與超輕薄全新筆電 ASUS ZenBook 14 Ultralight (UX435EGL) 開箱

為大家介紹結合高效能與超輕薄全新筆電 ASUS ZenBook 14 Ultralight (UX435EGL) 開箱。輕薄筆電,相信這對於很多人來說是又愛又恨,之前也是有許多人在問小編給予筆電推薦時,都會提出想要能夠有高效能,但又想要是輕薄好攜帶的需求,尤其是女生的首選,幾乎都是要求輕薄筆電為優先的情況下(也比較好看才是真的),那麼就很難去好好推薦,要有效能的輕薄筆電幾乎都是要到高階商務人士用的,但通常到了那種階級的筆電,幾乎都是超出預算,但即使超出預算了,效能還是沒辦法達標,因此輕薄筆電的選擇一直都是一個難題。

不過在今年配合著Intel第11代移動處理器的發布,似乎這個難題有了許多的解法,而華碩在今年年初推出的ZenBook 14 Ultralight (UX435EGL),讓小編對於高效輕薄筆電的推薦選項更為集中了,除了擁有低於1公斤的超輕便重量外,同時擁有了非常實用的運算能力,以及能夠滿足繪圖或輕度影片剪輯的效能,搭配最高17小時的超長續航力、完整的I/O配置等等,可以說是非常值得推薦的一台輕薄筆電,就讓我們一起來看看這台全新的 ASUS ZenBook 14 Ultralight (UX435EGL) 吧。

ASUS ZenBook 14 Ultralight (UX435EGL) 開箱!!

ZenBook 14 Ultralight 的上蓋採用了金屬磨砂材質,唯一配色的綠松灰設計,在時尚中又帶點了年輕的元素。

掀開螢幕後,映入眼簾的是四面NanoEdge極窄邊框的14吋Full HD廣視角螢幕,螢幕佔比高達了92%,讓螢幕看起來更大了,幾乎沒有存在感的黑邊,有著絕佳的沉浸體驗。

而且即使是在NanoEdge極窄邊框的上邊,還是保有紅外線攝影機,因此可以非常輕鬆的使用Windows Hello人臉辨識進行登入。此外,在現今全球疫情尚未趨緩的時期,對於遠端工作者或是有線上會議需求,有紅外線攝影機可進行遠距的視訊會議也非常便利!

在螢幕的底部,也精心打造了ErgoLift 螢幕軸承設計,在掀開螢幕的同時會自動將鍵盤傾斜至最舒適的位置。

鍵盤的部分採用全尺寸設計,並且在最右邊與最上邊還設有許多功能鍵方便使用。

1.4mm的鍵程,搭配非常滑順的鍵帽,在打字上也可以非常舒服。

上方的功能鍵,預設就是調整功能,不用另外搭配Fn鍵才能使用,但如果需要切換回傳統的組合方式,可以透過Fn+Esc做切換,在傳統模式下Fn按鍵會做發光提示。

觸控板部分,除了支援四指智慧手勢外,點擊右上角icon就可以開啟NumberPad虛擬數字鍵盤,讓輕薄的14吋筆電也有完整的數字鍵可以使用,且開啟的同時仍可控制游標。

在I/O配置部分,即使在超輕薄的設計下,還是保有了許多方便的接口,左側留有HDMI 2.0、兩個Thunderbolt™ 4 USB-C®以及電源指示燈。

在右側的部份,則是3.5mm 耳麥組合接口以及一個USB 3.2 Type A (Gen 1),保留一個Type A的接口讓使用起來更加的便利,另外還有一個micro SD讀卡機,讓繪圖、剪輯可以更方便的讀取和儲存檔案。

翻到背面,首先可以看到配合著ErgoLift 螢幕軸承的墊高,讓散熱效能更為強悍的開孔。

在背面的左右兩側,則是兩個針對喇叭的開孔,ZenBook 14 Ultralight 的音訊裝置通過了專業音響大廠Harman Kardon的認證,因此可以有著絕佳的聽覺體驗。

接著我們準備進行拆機,不過要特別注意的是ZenBook 14 Ultralight有兩顆螺絲藏在了止滑墊的下方,因此要特別注意。

開蓋後,可以看到在非常輕巧的配置下,內部的空間確實也盡量的緊縮,因此包含了記憶體、無線網卡都是直接集成在了主機板上。

ZenBook 14 Ultralight出廠已經內建1TB的PCIe® NVMe™ 3.0 x4 M.2 SSD,相信是非常夠用的。

散熱部分則是使用了單風扇設計,透過石磨片串聯了GPU與CPU,將兩者產生的廢熱透過特殊散熱鰭片排出,讓筆電能夠發揮出高效能。

電池部分則是採用了63Wh,最高續航力官方給出了最高17小時*,可以說是非常的長效。*官方數據續航測試特定條件請參考官網說明:http://bit.ly/2JLh4ea實際電池續航力依據產品組態、使用情形、操作條件及電源管理設定而有有所不同。

而充電器的部分,採用65W的Type C充電器,支援PD快充,可以在50分鐘內就充滿了60%的電力。

最後,ZenBook 14 Ultralight 的名稱由來,就是由於其不到1公斤的重量(官方數據為995克),在如此輕薄的重量,機身最薄僅有14.9mm的機身下,我們一起來看看到底可以發揮出多大的效能吧!

了解更多 ASUS ZenBook 14 Ultralight (請點我)

 

ASUS ZenBook 14 Ultralight 效能測試

本次測試機台是搭載了全新第11代 Intel® Core™ i7-1165G7 處理器與NVIDIA® GeForce® MX450獨立顯示卡的ZenBook 14 Ultralight (UX435EGL)。

透過裝置管理員,可以看到 Intel® Core™ i7-1165G7 4C/8T的配置。

同樣透過裝置管理員,也可以看到ZenBook 14 Ultralight (UX435EGL) 另外搭載的NVIDIA® GeForce® MX450獨立顯卡。

ZenBook 14 Ultralight 出廠就搭配了16GB的記憶體。

首先我們以CPU-Z進行核心效能測試,單核的分數為571.4,而在全核心的分數則是跑到2627.7。

接著透過Cinebench R15同樣進行CPU測試,在CPU單核的分數為219 cb,而全核心的表現則為822 cb。

另外透過了CineBench R20進行CPU測試,在CPU單核的分數為557 cb,而全核心的表現則為2158 cb。

接著透過x264 FHD BENCHMARK進行轉檔測試,i7-1165G7的表現為28 fps。

接著透過x265 FHD BENCHMARK進行轉檔測試,i7-1165G7則是18.7 fps。

在儲存的部分,首先使用DiskInfo查看硬碟資訊,本次測試機台預設是搭載Intel的1TB PCIe® NVMe™ 3.0 x4 M.2 SSD。

透過CrystalDiskMark進行測試,其讀寫速度為1900.9 MB/s與1754.5 MB/s。

接著使用TxBench進行讀寫測試,最高讀寫速度為1868.1 MB/s與1800.9 MB/s。

而對於顯示晶片的測試部分,由於ZenBook 14 Ultralight (UX435EGL) 同時具有全新的Intel® Iris® Xe 顯示晶片以及NVIDIA® GeForce® MX450獨立顯卡,因此針對顯卡測試的3DMARK,使用Time Spy測試,將NVIDIA® GeForce® MX450設為主要測試對象,分數則為1854。

而針對大部分遊戲,使用DirectX 11為核心架構的Fire Strike測試,ZenBook 14 Ultralight的分數為4174。

接著是跨平台的Wild Life測試,ZenBook 14 Ultralight 的分數為11123。

最後則是採用Direct X 12的Night Raid測試,ZenBook 14 Ultralight的分數為17419,由以上幾個測試來看,ZenBook 14 Ultralight即使是在不到1公斤的重量下,還是可以有著還不錯的遊戲效能,實在非常強悍。

整機部分則使用PCMark 10進行測試,在針對辦公室PC的基準測試當中跑分為5137。

而針對完整的辦公室PC基準測試PCMark 10 Express中,跑分為4665。

了解更多 ASUS ZenBook 14 Ultralight (請點我)

 

ASUS ZenBook 14 Ultralight 軟體介紹

在軟體的部分,ZenBook 14 Ultralight主要的功能設定都可以在MyASUS裡面進行,點開軟體即可看到筆電的專屬資訊。

在第二頁則是客戶服務部分,如果電腦有任何問題都可以透過這裡進行與官方的聯繫。

如果是已經知道問題的所在,也可以透過MyASUS直接進行系統診斷,透過軟體分析直接發現電腦問題所在。

無論是軟體、驅動、韌體等等的更新部分,也可以直接透過MyASUS進行設定。

而在硬體設定的部分,可以調整的部分就非常多樣,首先是電池的模式,可以是長效使用、平衡使用或是最佳使用,都可以依照個人習慣做調整。

接著是對於風扇的模式進行調整,這裡主要是針對效能設定的部分,如果要電腦高效能運算的話,直接開啟高效能模式就對了,只有這樣才能發揮出ZenBook 14 Ultralight 的最高效能。

在螢幕色彩的調整部分,則是可以透過Splendid進行螢幕的微調,調整到自己喜歡的顏色。

而開啟Tru2Life則是可以直接透過智慧演算法,讓螢幕呈現出一個最佳的狀態。

而功能鍵鎖定的部分,則是可以自訂最上方的功能鍵預設是要使用原本的功能還是ZenBook 14 Ultralight特定的功能按鍵。

WiFi SmartConnect顧名思義即是自動連線到訊號最好的無線網路。

而麥克風的部分,由於疫情的關係,使得遠端居家辦公的模式越來越盛行,因此針對收音ZenBook 14 Ultralight 搭配了絕佳的ASUS AI降噪技術,可以直接透過AI智慧進行背景音降噪,因此在多人會議當中,即使是在吵雜的環境下也可以保有非常清晰的線上會議體驗。

而在ClearVoice同樣也是透過了AI智慧運算,可以將筆電喇叭中,減少人聲外的所有聲音。

影體設定的最後一項則是TaskFirst優先網路分配,可以針對不同的使用情境去做網路頻寬使用的優化。

硬體設定完畢後,最後則是可以透過MyASUS與智慧型手機做連接,可以透過Link to MyASUS直接用電腦撥打電話、回覆訊息、同步畫面、螢幕延伸等等,非常的方便。

無論是iOS還是Android的用戶,都可以使用喔!

了解更多 ASUS ZenBook 14 Ultralight (請點我)

總結

ZenBook 14 Ultralight (UX435EGL) 可以說是一台要效能有效能、要輕便有輕便的一台高效能筆電,從Intel發表了第11代移動處理器開始,輕薄筆電的效能整個大躍進,而ZenBook 14 Ultralight (UX435EGL) 在此基礎上,更上一層樓,另外搭載了NVIDIA® GeForce® MX450獨立顯卡,讓輕薄筆電也有了更優異的運算能力,在不到一公斤的機身內你會發現令你想不到的效能爆發,並且還有非常完整的I/O配置以及非常長效的續航力,因此無論是在商務運用、設計運算等等,同時兼具了高效能、高續航、高便攜,在這之前是非常難想像一台筆電就能勝任大部分的工作,但在ZenBook 14 Ultralight (UX435EGL) 隔空出世之後,真的是刷新了小編對於輕薄筆電的印象,非常推薦給大家。

 

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準

ROG Phone 5 完整外觀提前被 DXOMARK 曝光! 3.5mm 耳機孔回歸,將於 3/10 晚間全球發表

日前華碩官方正式發佈邀請函,確認新一代旗艦電競手機 ROG Phone 5 將於台灣時間 3 月 10 日 19:00 全球線上發表。除了確認搭載高通 Snapdragon 888 旗艦行動平台,過去在網路上包括中國工信部資料庫也早已揭露新機的外觀設計,不過距離發表時間還有約三週的現在,評測網站 DXOMARK 提前公佈 ROG Phone 5 的音效評測內容,同時也直接曝光 ROG Phone 5 的機身外觀設計,原先在前代取消的 3.5mm 耳機孔也確認在 ROG Phone 5 回歸。

▲圖片來源:華碩

ROG Phone 5 完整外觀提前被 DXOMARK 曝光! 3.5mm 耳機孔回歸,將於 3/10 晚間全球發表

前段時間,我們曾報導過關於新一代華碩電競遊戲手機 ROG Phone 5 的外觀設計、規格等爆料資訊。日前隨著華碩正式發佈邀請函確認發表會時間也同時確認這次將從前一代的 ROG Phone 3 直接「跳號」到 ROG Phone 5 。

▲圖片來源:中國工信部(TENAA)

知名評測網站 DXOMARK 除了針對智慧型手機、相機、鏡頭、藍牙喇叭提出專業評測報告,也提前取得市售版 ROG Phone 5 並進行音效評測,而稍早 ROG Phone 5 以音效評測總分 75 分暫居第一位:

根據 DXOMARK 音效評測的結果, ROG Phone 5 在播放測試獲得 78 分的成績,其低音、空間感和音損的測試項目中取得優異成績,可準確呈現大多數空間感的特色。錄音方面, ROG Phone 5 也具有出色的性能、獲得 79 分,錄音具有出色的音色寶真度、逼真的空間感、擁有良好的最大錄製音量以及極少的明顯音損。不過在吵雜的環境中,仍可感受到中高頻的失真和略減少的低音。
更多關於 DXOMARK 的 ROG Phone 5 音效評測報告,可參考 DXOMARK :點我前往

▲圖片來源:DXOMARK

不過目前 DXOMARK 智慧型手機的音效評測樣本數並不多,例如搭載 Harman/Kardon 揚聲器的小米11 從發表至今也尚未公佈評測結果:

▲圖片來源:DXOMARK

綜合過去的傳聞資訊, ROG Phone 5 將搭載 Qualcomm Snapdragon 888 旗艦行動平台、配備 8GB/12GB RAM、 6.78 吋 FHD+ 解析度 AMOLED 螢幕、6400 萬像素三鏡頭主相機,內建等效 6000mAh 大容量電池並升級為 65W 快速充電。
另外,從 DXOMARK 音效評測的報告中也提到, ROG Phone 5 配備對稱式雙前置立體聲揚聲器、 3.5mm 耳機插孔(支持 ESS DAC)。
在機身背面, ROG Phone 5 除了加入副螢幕可顯示遊戲、來電以及訊息通知等資訊,在「敗家之眼」則由 RGB 燈效改為搭載類似自家 ROG Zephyrus G14 電競筆電的 ROG 動態編程 LED 顯示器(AniMe Matrix),玩家將可自訂更多樣的燈效顯示:

▲圖片來源:DXOMARK

日前 ROG 的官方 Twitter 預告也透露這次 ROG Phone 5 機身背面的特色:

The wait is over.
Witness the evolution of ROG Phone, on March 10th.
More info coming soon
▶️ https://t.co/n3wT6Kds2E#ROGPhone5 #ForThoseWhoDare pic.twitter.com/DnutNJDA4g

— ROG Global (@ASUS_ROG) February 19, 2021

消息來源:DXOMARK|ROG Global (Twitter/ @ASUS_ROG)|中國工信部(TENAA)

延伸閱讀:
廣受好評的第一人稱射擊遊戲《RAGE 2 狂怒煉獄2》, EPIC Games 推出限免活動,終身免費遊玩!

Redmi K40 系列「雙旗艦」官方文宣釋出:確認搭載三鏡頭主相機, 2/25 晚間登場

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準

新一代華為 MateBook 14 輕薄筆電在台推出,美感、效能一步到位

華為旗下的筆電產品以及精緻、便利與高 CP 在台灣有一定的愛用者,今日(2/24)更宣布最新 MateBook 14 在台灣推出,延續過去兼顧精工雕琢的外表與效能平衡兩大方面,讓生產力與娛樂齊頭並進,為消費者開啟全新的 2K 輕薄螢幕新視野,多工處理體驗一次到位。

新一代華為 MateBook 14 輕薄筆電在台推出,美感、效能一步到位

MateBook 14 擁有鋁合金搭配 CNC 鑽切工藝,加上精密噴砂與鑽石倒腳切割,打造出手感細膩的高質感輕薄金屬機身,重量僅 1.49kg 恰到好處,低調簡約卻有耐看百搭。

搭配 3:2 顯示比例的 2K 超高解析度全螢幕,螢幕佔比達到 90%,並且覆蓋 100% sRGB 寬廣色域,通過德國萊茵低藍光護眼測試,視野清晰一覽無遺。

搭載 7nm 製程的 AMD Ryzen 4000H 系列行動處理器,與 AMD Radeon 系列顯示晶片,16GB 雙通道記憶體搭配 512GB PCIe NVMe SSD,小小的身軀裡面卻蘊含能涵蓋足以支援生產力、視訊短片與娛樂遊戲各方面的高效能。改良的全新鯊魚鰭熱系統,將葉片厚度減少 40%,葉片數量提升 49%,以增加 39% 風量、低噪音的雙風扇、雙導管來維持整體系統穩定性。

在鍵盤右上方則是電源搭配指紋辨識器:這款新機同樣地將視訊鏡頭隱藏於鍵盤之中,不用時就收起來,確保個人隱私無虞。華為筆電的另一個招牌功能「一碰傳」在這款同樣基因的產品上當然也沒有省略,加大觸控板碰傳區域,隨手傳超便利。內建 56Wh 大容量電池,配合華為自家的智慧省電技術,只需充電 15 分鐘就能使用 2.5 小時,隨附的 65W 口袋充電器重量輕巧僅 160g,隨時補充電量不給你負擔。

華為 MateBook 14 售價定為 30,990 元,上市期間購機就送 Office 365 個人版與羅技 M235 無線滑鼠,數量有限送完為止。另外,即日起至 2/28 止,只要在燦坤指定店點(請見下圖)、線上賣場與華為品牌店完成預購,就送市價 6,988 元的 ViewSonic 27 吋 2K 薄型顯示器一部。

整體算下來這台搭載 AMD 4600H處理器、16GB RAM、512GB SSD、全金屬機身、長效續航的筆電只賣30990已經相當高性價比了,如果扣掉價值近7000元的27吋螢幕、OFFICE365與滑鼠,等於這樣規格的筆電不到23000!相當划算,有興趣的朋友可以到華為品牌店庾燦坤門市購買(請點我):

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準

基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(四)

系列文章

  1. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用 abp cli 搭建項目
  2. 基於 abp vNext 和 .NET Core 開發博客項目 – 給項目瘦身,讓它跑起來
  3. 基於 abp vNext 和 .NET Core 開發博客項目 – 完善與美化,Swagger登場
  4. 基於 abp vNext 和 .NET Core 開發博客項目 – 數據訪問和代碼優先
  5. 基於 abp vNext 和 .NET Core 開發博客項目 – 自定義倉儲之增刪改查
  6. 基於 abp vNext 和 .NET Core 開發博客項目 – 統一規範API,包裝返回模型
  7. 基於 abp vNext 和 .NET Core 開發博客項目 – 再說Swagger,分組、描述、小綠鎖
  8. 基於 abp vNext 和 .NET Core 開發博客項目 – 接入GitHub,用JWT保護你的API
  9. 基於 abp vNext 和 .NET Core 開發博客項目 – 異常處理和日誌記錄
  10. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用Redis緩存數據
  11. 基於 abp vNext 和 .NET Core 開發博客項目 – 集成Hangfire實現定時任務處理
  12. 基於 abp vNext 和 .NET Core 開發博客項目 – 用AutoMapper搞定對象映射
  13. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(一)
  14. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(二)
  15. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(三)
  16. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(一)
  17. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(二)
  18. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(三)

上篇文章完成了文章增刪改的接口和友情鏈接列表的接口,本篇繼續。

善於思考的同學肯定發現,在執行增刪改操作后,Redis緩存中的數據還是存在的,也就意味着查詢接口返回的數據還是舊的,所以在寫接口之前,先完成一下清緩存的操作。

移除緩存

移除緩存我這裏找了一個新的包:Caching.CSRedis,選他是因為微軟的包Microsoft.Extensions.Caching.StackExchangeRedis沒有給我們實現批量刪除的功能。

Caching.CSRedis開源地址,https://github.com/2881099/csredis 在這不做過多介紹,感興趣的自己去看。

在.Application.Caching層添加包Caching.CSRedis,Install-Package Caching.CSRedis,然後在模塊類MeowvBlogApplicationCachingModule中進行配置。

//MeowvBlogApplicationCachingModule.cs
...
public override void ConfigureServices(ServiceConfigurationContext context)
{
    ...

    var csredis = new CSRedis.CSRedisClient(AppSettings.Caching.RedisConnectionString);
    RedisHelper.Initialization(csredis);

    context.Services.AddSingleton<IDistributedCache>(new CSRedisCache(RedisHelper.Instance));
}
...

直接新建一個移除緩存的接口:ICacheRemoveService,添加移除緩存的方法RemoveAsync()。代碼較少,可以直接寫在緩存基類CachingServiceBase中。

public interface ICacheRemoveService
{
    /// <summary>
    /// 移除緩存
    /// </summary>
    /// <param name="key"></param>
    /// <param name="cursor"></param>
    /// <returns></returns>
    Task RemoveAsync(string key, int cursor = 0);
}

然後可以在基類中實現這個接口。

public async Task RemoveAsync(string key, int cursor = 0)
{
    var scan = await RedisHelper.ScanAsync(cursor);
    var keys = scan.Items;

    if (keys.Any() && key.IsNotNullOrEmpty())
    {
        keys = keys.Where(x => x.StartsWith(key)).ToArray();

        await RedisHelper.DelAsync(keys);
    }
}

簡單說一下這個操作過程,使用ScanAsync()獲取到所有的Redis key值,返回的是一個string數組,然後根據參數找到符合此前綴的所有key,最後調用DelAsync(keys)刪除緩存。

在需要有移除緩存功能的接口上繼承ICacheRemoveService,這裏就是IBlogCacheService。

//IBlogCacheService.cs
namespace Meowv.Blog.Application.Caching.Blog
{
    public partial interface IBlogCacheService : ICacheRemoveService
    {
    }
}

在基類中已經實現了這個接口,所以現在所有繼承基類的緩存實現類都可以調用移除緩存方法了。

在MeowvBlogConsts中添加緩存前綴的常量。

//MeowvBlogConsts.cs
/// <summary>
/// 緩存前綴
/// </summary>
public static class CachePrefix
{
    public const string Authorize = "Authorize";

    public const string Blog = "Blog";

    public const string Blog_Post = Blog + ":Post";

    public const string Blog_Tag = Blog + ":Tag";

    public const string Blog_Category = Blog + ":Category";

    public const string Blog_FriendLink = Blog + ":FriendLink";
}

然後在BlogService.Admin.cs服務執行增刪改后調用移除緩存的方法。

//BlogService.Admin.cs

// 執行清除緩存操作
await _blogCacheService.RemoveAsync(CachePrefix.Blog_Post);

因為是小項目,採用這種策略直接刪除緩存,這樣就搞定了當在執行增刪改操作后,前台接口可以實時查詢出最後的結果。

文章詳情

當我們修改文章數據的時候,是需要把當前數據庫中的數據帶出來显示在界面上的,因為有可能只是個別地方需要修改,所以這還需要一個查詢文章詳情的接口,當然這裏的詳情和前端的是不一樣的,這裡是需要根據Id主鍵去查詢。

添加模型類PostForAdminDto.cs,直接繼承PostDto,然後添加一個Tags列表就行,==,好像和上一篇文章中的EditPostInput字段是一模一樣的。順手將EditPostInput改一下吧,具體代碼如下:

//PostForAdminDto.cs
using System.Collections.Generic;

namespace Meowv.Blog.Application.Contracts.Blog
{
    public class PostForAdminDto : PostDto
    {
        /// <summary>
        /// 標籤列表
        /// </summary>
        public IEnumerable<string> Tags { get; set; }
    }
}

//EditPostInput.cs
namespace Meowv.Blog.Application.Contracts.Blog.Params
{
    public class EditPostInput : PostForAdminDto
    {
    }
}

在IBlogService.Admin.cs中添加接口。

/// <summary>
/// 獲取文章詳情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync(int id);

實現這個接口。

/// <summary>
/// 獲取文章詳情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync(int id)
{
    var result = new ServiceResult<PostForAdminDto>();

    var post = await _postRepository.GetAsync(id);

    var tags = from post_tags in await _postTagRepository.GetListAsync()
               join tag in await _tagRepository.GetListAsync()
               on post_tags.TagId equals tag.Id
               where post_tags.PostId.Equals(post.Id)
               select tag.TagName;

    var detail = ObjectMapper.Map<Post, PostForAdminDto>(post);
    detail.Tags = tags;
    detail.Url = post.Url.Split("/").Where(x => !string.IsNullOrEmpty(x)).Last();

    result.IsSuccess(detail);
    return result;
}

先根據Id查出文章數據,再通過聯合查詢找出標籤數據。

CreateMap<Post, PostForAdminDto>().ForMember(x => x.Tags, opt => opt.Ignore());

新建一條AutoMapper配置,將Post轉換成PostForAdminDto,忽略Tags。

然後將查出來的標籤、Url賦值給DTO,輸出即可。在BlogController.Admin中添加API。

/// <summary>
/// 獲取文章詳情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
[Authorize]
[Route("admin/post")]
[ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
public async Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync([Required] int id)
{
    return await _blogService.GetPostForAdminAsync(id);
}

至此,完成了關於文章的所有接口。

接下來按照以上方式依次完成分類、標籤、友鏈的增刪改查接口,我覺得如果你有跟着我一起做,剩下的可以自己完成。

開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial

搭配下方課程學習更佳 ↓ ↓ ↓

http://gk.link/a/10iQ7

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準

軟件設計模式學習(二十四)狀態模式

狀態模式用於解決系統中複雜對象的狀態轉換以及不同狀態下行為的封裝問題

模式動機

很多情況下,一個對象的行為取決於一個或多個動態變化的屬性,這樣的屬性叫做狀態。一個對象可以擁有多個狀態,這些狀態可以相互轉換,當對象狀態不同時,其行為也有所差異。

假設一個人就是對象,人根據心情不同會有很多狀態,比如開心和傷心,這兩種狀態可以相互轉換。開心的人可能會突然接到女朋友的分手電話,然後哭得稀里嘩啦(醒醒!你哪來的女朋友?),過了一段時間后,又可能因為中了一百萬彩票而歡呼雀躍。而且不同狀態下人的行為也不同,有些人傷心時會通過運動、旅行、聽音樂來緩解心情,而開心時則可能會唱歌、跳舞、請客吃飯等等。

再來考慮軟件系統中的情況,如某酒店訂房系統,可以將房間設計為一個類,房間對象有已預訂、空閑、已入住等情況,這些狀態之間可以相互轉換,並且不同狀態的對象可能具有不同的行為,如已預訂或已入住的房間不能再接收其他顧客的預訂,而空閑的房間可以接受預訂。

在過去我們遇到這種情況,可以使用複雜的條件判斷來進行狀態判斷和轉換操作,這會導致代碼的可維護性和靈活性下降,當出現新的狀態時必須修改源代碼,違反了開閉原則。在狀態模式中,可以將對象狀態從包含該狀態的類中分離出來,做成一個個單獨的狀態類,如人的兩種情緒可以設計成兩個狀態類:

將開心與傷心兩種情緒從“人”中分離出來,從而避免在“人”中進行狀態轉換和判斷,將擁有狀態的對象和狀態對應的行為分離,這就是狀態模式的動機。

模式定義

允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。其別名為狀態對象(Objects for States),狀態模式是一種對象行為型模式。

Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.

模式結構與分析

我們把擁有狀態的對象稱為環境類,也叫上下文類。再引入一個抽象狀態類來專門表示對象的狀態,對象的每一種具體狀態類都繼承該抽象類,不同具體狀態類實現不同狀態的行為,包括各種狀態之間的轉換。在環境類中維護一個抽象狀態類 State 的實例,用來定義當前狀態。

得到狀態模式結構類圖如下:

環境類中的 request() 方法處理業務邏輯,根據狀態去調用對應的 handle() 方法,如果需要切換狀態,還提供了 setState() 用於設置當前房間狀態。如果我們希望執行操作后狀態自動發生改變,那麼我們還需要在 State 中定義一個 Context 對象,實現一個雙向依賴關係。

考慮前面提到的訂房系統,如果不使用狀態模式,可能就會存在如下代碼:

if (state == "空閑") {
	if (預訂房間) {
        預訂操作;
        state = "已預訂";
	} else if (住進房間) {
    	入住操作;
        state = "已入住";
    }
} else if(state == "已預訂") {
	if (住進房間) {
        入住操作;
        state = "已入住";
	} else if (取消預訂) {
    	取消操作;
        state = "空閑";
    }
}

上述代碼需要做頻繁且複雜的判斷操作,可維護性很差。因此考慮使用狀態模式將房間類的狀態分離出來,將與每種狀態有關的操作封裝在獨立的狀態類中。

我們來寫一個完整的示例

環境類(Room)

public class Room {
	
    // 維護一個狀態對象
    private State state;

    public Room() {
        // 默認為空閑狀態
        this.state = new IdleState(this);
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void reserve() {
        state.reserve();
    }

    public void checkIn() {
        state.checkIn();
    }

    public void cancelReserve() {
        state.cancelReserve();
    }

    public void checkOut() {
        state.checkOut();
    }
}

抽象狀態類(State)

public abstract class State {
	
    // 用於狀態轉換
    protected Room room;

    public State(Room room) {
        this.room = room;
    }

    public abstract void reserve();

    public abstract void checkIn();

    public abstract void cancelReserve();

    public abstract void checkOut();
}

具體狀態類(IdleState)

public class IdleState extends State {

    public IdleState(Room room) {
        super(room);
    }

    @Override
    public void reserve() {
        System.out.println("房間預訂成功");
        // 	切換狀態
        room.setState(new ReservedState(room));
    }

    @Override
    public void checkIn() {
        System.out.println("房間入住成功");
        room.setState(new InhabitedState(room));
    }

    @Override
    public void cancelReserve() {
        System.out.println("無法取消預訂,房間處於空閑狀態");
    }

    @Override
    public void checkOut() {
        System.out.println("無法退房,房間處於空閑狀態");
    }

}

具體狀態類(ReservedState)

public class ReservedState extends State {

    public ReservedState(Room room) {
        super(room);
    }

    @Override
    public void reserve() {
        System.out.println("無法預訂,房間處於已預訂狀態");
    }

    @Override
    public void checkIn() {
        System.out.println("房間入住成功");
        room.setState(new InhabitedState(room));
    }

    @Override
    public void cancelReserve() {
        System.out.println("取消預訂成功");
        room.setState(new IdleState(room));
    }

    @Override
    public void checkOut() {
        System.out.println("無法退房,房間處於已預訂狀態");
    }
}

具體狀態類(InhabitedState)

public class InhabitedState extends State {

    public InhabitedState(Room room) {
        super(room);
    }

    @Override
    public void reserve() {
        System.out.println("無法預訂,房間處於入住狀態");
    }

    @Override
    public void checkIn() {
        System.out.println("無法入住,房間處於入住狀態");
    }

    @Override
    public void cancelReserve() {
        System.out.println("無法取消預訂,房間處於入住狀態");
    }

    @Override
    public void checkOut() {
        System.out.println("退房成功");
        room.setState(new IdleState(room));
    }
}

客戶端測試類(Client)

public class Client {

    public static void main(String[] args) {

        Room room = new Room();
        room.cancelReserve();
        room.checkOut();
        room.reserve();
        System.out.println("--------------------------");
        room.reserve();
        room.checkOut();
        room.checkIn();
        System.out.println("--------------------------");
        room.reserve();
        room.checkIn();
        room.cancelReserve();
        room.checkOut();
    }
}

運行結果

模式優缺點

狀態模式的優點:

  • 封裝了轉換規則,將不同狀態之間的轉換狀態封裝在狀態類中,避免了冗長的條件判斷,提高了代碼的可維護性
  • 將所有與某個規則有關的行為放到一個類,可以很方便地增加新的狀態
  • 可以讓多個環境對象共享一個狀態對象,從而減少系統中對象的個數

狀態模式的缺點:

  • 增加了系統類和對象的個數
  • 結構較為複雜,使用不當將導致代碼混亂
  • 對於可以切換狀態的狀態模式,增加新的狀態類需要修改負責狀態轉換的代碼

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準

因應疫情 日本富士山四條登山步道將全封

摘錄自2020年5月18日新頭殼報導

富士山有四條攻頂登山步道,受到武漢肺炎(COVID-19)影響,管理步道的山梨縣及靜岡縣政府已決定或大致決定封閉步道,也讓今年夏季開山的富士山形同「封山」。

日本讀賣新聞報導,靜岡縣政府已大致決定從7月10日到9月10日止,封閉縣內三條攻頂富士山的登山步道,主要是受到疫情擴大,無法確保登山者安全才會決定封閉步道。山梨縣政府15日也決定封閉縣內登山步道,因此,今年攻頂富士山的四條登山步道將全數封閉。

今年不光是登山步道上的登山小屋無法使用,連登山步道上的醫療設施也無法使用,讓山友登頂變得非常危險。靜岡縣政府將在登山口採取設置路障等措施,縣府負責人員說,希望山友本季先別入山。

生活環境
生態旅遊
國際新聞
日本
封山
武漢肺炎
疫情下的食衣住行
公共衛生

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※回頭車貨運收費標準

※台中搬家公司費用怎麼算?

要便宜還要檔次?8萬元白菜價的合資三廂車隨便挑

38-12。08萬元曾經的“老三樣”,是一代人的汽車情結。但如今,“老三樣”的輝煌成就已是茶餘飯後的談資。“老三樣”除了捷達和桑塔納繼續保持強大的產品號召力,接替富康的全新愛麗舍就顯得有點舉步維艱,銷量和影響力遠遠不及前面兩位老朋友的一半。

8萬元的預算買輛合資轎車,看似是一件非常不可思議的事情。但實際上,8-10萬這一細分市場早已不是合資車的天下,而是被日益強大的自主品牌所瓜分,競爭的壓力導致了入門級合資車售價區間不斷下探。8萬元,不僅能買到更有面子的合資品牌,關鍵它們還是一些實力不錯的三廂轎車。

新捷達

指導價:7.99-13.49萬元

不管大家信不信,反正的第一台車就是捷達,嗯!沒錯,就是隨處可見的捷達教練車,幾乎每一位有駕照的朋友都是被捷達車一路虐過來的。從最開始上市至今,捷達的累計銷量已經突破360萬台車。足以可見,捷達的實力派口碑可真不是蓋得的。即然如此,那就來推薦這款近期上新市的新捷達。作為中期改款后的新捷達,形象氣質完全煥然一新,相比以往刻板沉穩的印象更加年輕且運動化,但造型還是離不開你最熟悉的大眾風格。

隨之改變的還有新捷達的內飾,無論做工質感,還是時尚感均讓你懷疑這還是捷達嗎?與此同時,新捷達總算是良心發現了,配置水準大大高於現款捷達,中控台也不再是簡陋的不成樣,而是換裝了更有逼格的大尺寸显示屏,部分車型還增加了胎壓監測,ESp,倒車雷達等實用配置,空間還一如既往的出色。總體來說,新款捷達的性價比表現進步神速。真是厲害了,我的捷達哥!

科沃茲

指導價:7.99-10.99萬元

科沃茲和科魯茲,傻傻分不清。不僅取名方式非常雷同,設計方面也找到一些共同點。雖然科沃茲長得沒有科魯茲那麼有個性,但至少在很多年輕人看來,科沃茲的外觀設計還是比較成功的,以致於甚至你可能猜不到它的起步價只要7.99萬,頂配也不超過11萬,試問這樣有吸引力的價格,又能照顧你面子的合資轎車,國產轎車還怎麼活?

值得一提的是,儘管科沃茲是台中國特供車,但你別否認,其實打着特供車的名義殺入家用車市場,銷量真的差不到哪去,10月份科沃茲的銷量已經反超大哥科魯茲了,也說明科沃茲這款新車方方面面都有不俗的實力。其中,檔次感和配置是它最大的產品亮點,時尚有質感內飾可以輕易俘虜年輕人的心。配置方面,除了最低配感覺讓人稍微不值之外,其它款車型給出的配置已經非常厚道了,好嗎?綜合對比同級競品來說,科沃茲是少有的全能选手,不失為年輕人的入門家用車的首選。

愛麗舍

指導價:8.38-12.08萬元

曾經的“老三樣”,是一代人的汽車情結。但如今,“老三樣”的輝煌成就已是茶餘飯後的談資。“老三樣”除了捷達和桑塔納繼續保持強大的產品號召力,接替富康的全新愛麗舍就顯得有點舉步維艱,銷量和影響力遠遠不及前面兩位老朋友的一半。而從今天的審美觀來看,愛麗舍雖然不是走那種很驚艷的設計路線,在同級別中屬於很夠看的,辨識度也不錯。不過,讓人不爽的是,與時尚外觀形成巨大落差的內飾感實在太low了。

但總的來說,憑藉日積月累的口碑效應,過硬的可靠性,以及同級中一流的動力性和底盤調校,尤其是遭人詬病的4AT變速箱換成6AT變速箱之後,全新愛麗舍產品力得到進一步提升。同時,再結合一個不高不低的售價區間,愛麗舍還是一款非常靠譜的合資轎車。但也有一些不得不提的槽點,比如令人抓狂的風噪胎噪,以及不夠人性化的設計。當然,相比同級的德系車型,愛麗舍的性價比優勢更突出。

鋒范

指導價:7.98-11.98萬元

在8萬元的價位上,可能更多的人會考慮飛度。但如果介意飛度是台兩廂車的話,那麼退而求其次,購買三廂車鋒范無疑是最折中的選擇。當然,鋒范的銷量也並不差,精緻動感的車身造型,迎合了年輕人的審美觀念。但真正讓人佩服的是本田的地球夢發動機技術!無論是動力性還是燃油性,“黑科技”傍手的鋒范都有可圈可點的表現,其可靠性和經濟性足夠省心省力。

此外,要論空間的話,鋒范同樣不甘落後。繼承了本田MM理念的鋒范,軸距2600mm的車內空間,卻有十足的越級表現,即使滿載5位成年人,鋒范也是應付得游刃有餘。最後,再說說人家的性價比,一般是不建議入手本田車型的最低配版,怎麼說?簡直寒酸到不忍直視,鋒范也毫不例外,不僅外觀內飾有區別對待,居然連一些很基礎的配置如收音機、遙控鑰匙都沒有。拋開鋒范在最低配車的不厚道,其次低配、中配版都能讓人心滿意足。所以,鋒范作為不追求配置年輕人的代步車,也是完全稱職的。

手裡有8萬元的購車預算,還是會陷入比較尷尬的兩難,往往是高不成低不就。心裏想着買好點的合資車,但錢包不給力。退一步買性價比更高的國產車,又有些心不甘情不願。如果有類似這樣疑慮的朋友,不妨考慮推薦的這四款入門合資轎車。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準