民工哥

民工哥 查看完整檔案

其它編輯  |  填寫畢業院校不知名互聯網企業  |  不知名程序員 編輯 github.com/mingongge 編輯
編輯

民工哥,10多年職場老司機的經驗分享,堅持自學一路從技術小白成長為互聯網企業信息技術部門的負責人。

我的新書:《Linux系統運維指南》

微信公眾號:民工哥技術之路

民工哥:知乎專欄

歡迎關注,我們一同交流,相互學習,共同成長??!

個人動態

民工哥 發布了文章 · 3月8日

手把手教你搭建 RocketMQ 高可用集群!

image.png

RocketMQ發展歷史

RocketMQ是一個由阿里巴巴開源的消息中間件, 2012年開源,2017年成為apache頂級項目。RocketMQ在阿里內部應用是非常廣泛的,阿里內部的幾千個應用都運行在RocketMQ之上,雙十一期間需要處理億萬級別的消息,TPS可以達到幾十萬。目前支持Java、C/C++,Python、Go四種語言訪問。

RocketMQ現在有兩個版本,一個是社區開源版,一個是商業的云服務版(AliwareMQ)。最新版本:4.8.0(本文演示版本)。

它的核心設計借鑒了Kafka,所以我們在學習RocketMQ的時候,會發現很多和kafka相同的特性,但是在某些功能上和kafka又有較大的差異,它有以下一些特性:

  • 支持集群模型、負載均衡、水平擴展能力
  • 億級別消息堆積能力
  • 采用零拷貝的原理,順序寫盤,隨機讀
  • 底層通信框架采用Netty NIO
  • NameServer代替Zookeeper,實現服務尋址和服務協調
  • 消息失敗重試機制、消息可查詢
  • 強調集群無單點,可擴展,任意一點高可用,水平可擴展
  • 經過多次雙十一的考驗

高可用架構

RocketMQ天生對集群的支持非常好,它有以下一些模式:

單Master

  • 優點:除了配置簡單沒什么優點
  • 缺點:不可靠,該機器重啟或者宕機,將要導致整個服務不可用

多Master

  • 優點:配置簡單,性能最高
  • 缺點:可能會有少量消息丟失(配置相關),單臺機器重啟或宕機期間,該機器下未被消費的消息在機器恢復前不可訂閱,影響消息實時性

多Master多Slave

每個Master配一個Slave,有多對Master-Slave,集群采用異步復制方式,主備有短暫消息延遲,毫秒級

  • 優點:性能同多Master幾乎一樣,實時性高,主備間切換對應用透明,不需人工干預
  • 缺點:Master宕機或磁盤損壞時會有少量消息丟失

多Master多Slave

每個Master配一個Slave,有多對Master-Slave,集群采用同步雙寫方式,主備都寫成功,向應用返回成功

  • 優點:服務可用性與數據可用性非常高
  • 缺點:性能比異步集群略低,當前版本主宕備不能自動切換為主

二主二從異步集群安裝

本文采用的是二主二從安裝模式,即第四種多Master多Slave

端口規劃

首先我買了兩臺云服務器,平時我會用來學習安裝一些中間件,比較方便,大家有條件的話也可以買下,當然也可以通過在本地安裝虛擬機的方式來操作。

圖片

接下來我要通過這兩臺服務器來實現二主二從的安裝,首先對它們的端口進行一下規劃

第一臺機器??42.192.77.73
#端口規劃:
9876?????NameServer1
10910????BrokerA-master
10921????BrokerB-slave
第二臺機器??39.103.144.86
#端口規劃:
9876?????NameServer2
10920????BrokerB-master
10911????BrokerA-slave

畫圖看上去更加清晰明了一些

圖片

下載

從官網rocketmq.apache.org/進去獲得最新的下載地址,紅框里標注出來的

圖片

這里的地址都可以,下載下來

cd?/jackxu
wget?https://mirror.bit.edu.cn/apache/rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip

下載好后解壓,改個名字

unzip?rocketmq-all-4.8.0-bin-release.zip
mv?unzip?rocketmq-all-4.8.0-bin-release.zip?rocketmq

配置第一臺機器

在兩臺機器上都下載、解壓好。在rocketmq/conf目錄下,有三種建議配置模式:

  • 2m-2s-async(2主2從異步) —— 本文采用這種
  • 2m-2s-sync (2主2從同步)
  • 2m-noslave (2主)

現在需要修改兩臺機器上2m-2s-async這個目錄中的文件。在42.192.77.73機器上修改broker-a.properties

cd?/jackxu/rocketmq/conf/2m-2s-async
vim??broker-a.properties

修改集群名字

brokerClusterName=jackxu-cluster

增加的內容

#Broker?對外服務的監聽端口
listenPort=10910
#是否允許?Broker?自動創建Topic,建議線下開啟,線上關閉
autoCreateTopicEnable=true
#是否允許?Broker?自動創建訂閱組,建議線下開啟,線上關閉
autoCreateSubscriptionGroup=true
#nameServer地址,分號分割
namesrvAddr=39.103.144.86:9876;42.192.77.73:9876
#存儲路徑
storePathRootDir=/jackxu/rocketmq/store/broker-a
#commitLog?存儲路徑
storePathCommitLog=/jackxu/rocketmq/store/broker-a/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/jackxu/rocketmq/store/broker-a/consumequeue
#消息索引存儲路徑
storePathIndex=/jackxu/rocketmq/store/broker-a/index
#checkpoint?文件存儲路徑
storeCheckpoint=/jackxu/rocketmq/store/checkpoint
#abort?文件存儲路徑
abortFile=/jackxu/rocketmq/store/abort

修改broker-b-s.properties

vim??broker-b-s.properties

修改集群名字

brokerClusterName=jackxu-cluster

增加的內容

#Broker?對外服務的監聽端口
listenPort=10921
#是否允許?Broker?自動創建Topic,建議線下開啟,線上關閉
autoCreateTopicEnable=true
#是否允許?Broker?自動創建訂閱組,建議線下開啟,線上關閉
autoCreateSubscriptionGroup=true
#nameServer地址,分號分割
namesrvAddr=39.103.144.86:9876;42.192.77.73:9876
#存儲路徑
storePathRootDir=/jackxu/rocketmq/store/broker-b-s
#commitLog?存儲路徑
storePathCommitLog=/jackxu/rocketmq/store/broker-b-s/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/jackxu/rocketmq/store/broker-b-s/consumequeue
#消息索引存儲路徑
storePathIndex=/jackxu/rocketmq/store/broker-b-s/index
#checkpoint?文件存儲路徑
storeCheckpoint=/jackxu/rocketmq/store/checkpoint
#abort?文件存儲路徑
abortFile=/jackxu/rocketmq/store/abort

配置第二臺機器

在39.103.144.86機器上修改broker-b.properties

cd?/jackxu/rocketmq/conf/2m-2s-async
vim??broker-b.properties

修改集群名字

brokerClusterName=jackxu-cluster

增加的內容

#Broker?對外服務的監聽端口
listenPort=10920
#是否允許?Broker?自動創建Topic,建議線下開啟,線上關閉
autoCreateTopicEnable=true
#是否允許?Broker?自動創建訂閱組,建議線下開啟,線上關閉
autoCreateSubscriptionGroup=true
#nameServer地址,分號分割
namesrvAddr=39.103.144.86:9876;42.192.77.73:9876
#存儲路徑
storePathRootDir=/jackxu/rocketmq/store/broker-b
#commitLog?存儲路徑
storePathCommitLog=/jackxu/rocketmq/store/broker-b/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/jackxu/rocketmq/store/broker-b/consumequeue
#消息索引存儲路徑
storePathIndex=/jackxu/rocketmq/store/broker-b/index
#checkpoint?文件存儲路徑
storeCheckpoint=/jackxu/rocketmq/store/checkpoint
#abort?文件存儲路徑
abortFile=/jackxu/rocketmq/store/abort

修改broker-a-s.properties

vim??broker-a-s.properties

修改集群名字

brokerClusterName=jackxu-cluster

增加的內容

#Broker?對外服務的監聽端口
listenPort=10911
#是否允許?Broker?自動創建Topic,建議線下開啟,線上關閉
autoCreateTopicEnable=true
#是否允許?Broker?自動創建訂閱組,建議線下開啟,線上關閉
autoCreateSubscriptionGroup=true
#nameServer地址,分號分割
namesrvAddr=39.103.144.86:9876;42.192.77.73:9876
#存儲路徑
storePathRootDir=/jackxu/rocketmq/store/broker-a-s
#commitLog?存儲路徑
storePathCommitLog=/jackxu/rocketmq/store/broker-a-s/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/jackxu/rocketmq/store/broker-a-s/consumequeue
#消息索引存儲路徑
storePathIndex=/jackxu/rocketmq/store/broker-a-s/index
#checkpoint?文件存儲路徑
storeCheckpoint=/jackxu/rocketmq/store/checkpoint
#abort?文件存儲路徑
abortFile=/jackxu/rocketmq/store/abort

創建數據目錄

第一臺機器42.192.77.73執行,只需要執行一次

mkdir?-p?/jackxu/rocketmq/store/broker-a?/jackxu/rocketmq/store/broker-a/consumequeue?/jackxu/rocketmq/store/broker-a/commitlog?/jackxu/rocketmq/store/broker-a/index?/jackxu/rocketmq/logs?/jackxu/rocketmq/store/broker-b-s?/jackxu/rocketmq/store/broker-b-s/consumequeue?/jackxu/rocketmq/store/broker-b-s/commitlog?/jackxu/rocketmq/store/broker-b-s/index

第二臺機器39.103.144.86執行,只需要執行一次

mkdir?-p?/jackxu/rocketmq/store/broker-a-s?/jackxu/rocketmq/store/broker-a-s/consumequeue?/jackxu/rocketmq/store/broker-a-s/commitlog?/jackxu/rocketmq/store/broker-a-s/index?/jackxu/rocketmq/logs?/jackxu/rocketmq/store/broker-b?/jackxu/rocketmq/store/broker-b/consumequeue?/jackxu/rocketmq/store/broker-b/commitlog?/jackxu/rocketmq/store/broker-b/index

啟動兩個NameServer

在兩臺機器分別執行,& 表示在后臺運行,默認情況下,nameserver監聽的是9876端口

nohup?sh?/jackxu/rocketmq/bin/mqnamesrv?>/jackxu/rocketmq/logs/mqnamesrv.log?2>&1?&

查看日志

tail?-f?/jackxu/rocketmq/logs/mqnamesrv.log

啟動Broker

啟動的時候按照下面的順序來,-c 是指定broker的配置文件

1、啟動73的A主

nohup?sh?/jackxu/rocketmq/bin/mqbroker?-c?/jackxu/rocketmq/conf/2m-2s-async/broker-a.properties?>?/jackxu/rocketmq/logs/broker-a.log?2>&1?&

2、啟動86的A從

nohup?sh?/jackxu/rocketmq/bin/mqbroker?-c?/jackxu/rocketmq/conf/2m-2s-async/broker-a-s.properties?>?/jackxu/rocketmq/logs/broker-a-s.log?2>&1?&

3、啟動86的B主

nohup?sh?/jackxu/rocketmq/bin/mqbroker?-c?/jackxu/rocketmq/conf/2m-2s-async/broker-b.properties?>?/jackxu/rocketmq/logs/broker-b.log?2>&1?&

4、啟動73的B從

nohup?sh?/jackxu/rocketmq/bin/mqbroker?-c?/jackxu/rocketmq/conf/2m-2s-async/broker-b-s.properties?>?/jackxu/rocketmq/logs/broker-b-s.log?2>&1?&

查看日志

tail?-f?/jackxu/rocketmq/conf/2m-2s-async/broker-a.properties
tail?-f?/jackxu/rocketmq/conf/2m-2s-async/broker-a-s.properties
tail?-f?/jackxu/rocketmq/conf/2m-2s-async/broker-b.properties
tail?-f?/jackxu/rocketmq/conf/2m-2s-async/broker-b-s.properties

檢查是否啟動成功

輸入jps命令,一共四個進程沒問題

圖片

但是大多數情況下不會這么順利,我在安裝中有一些坑點:

  • 1、沒有安裝jdk,因為這是我新的服務器,上面是沒有jdk環境的,大家知道rocketmq是用java寫的,所以需要有java環境才能運行,包括jps命令就是查看java進程

圖片

  • 2、內存不足,因為默認的配置文件設置了很大的內存,但是我的機器只有1核2G,肯定是不夠的,所以在啟動的時候會報內存不足

圖片

解決辦法就是修改配置文件

vim?/jackxu/rocketmq/bin/runserver.sh
vim?/jackxu/rocketmq/bin/runbroker.sh

把NameServer和Broker的內存大小都改小一點,然后重新啟動即可

圖片

關閉命令

停止服務的時候需要注意,要先停止broker,其次停止nameserver。

cd?/jackxu/rocketmq/bin
sh?mqshutdown?namesrv
sh?mqshutdown?broker

web控制臺安裝

與kafka不同的是,rocket官方提供了一個可視化控制臺,大家可以在這里下載

https://github.com/apache/rocketmq-externals

這個是rocketmq的擴展,里面不僅包含控制臺的擴展,也包含對大數據flume、hbase等組件的對接和擴展。

下載

下載源碼,一般下載速度會比較慢,等不及的話可以去網盤下載鏈接:

cd?/jackxu
wget?https://github.com/apache/rocketmq-externals/archive/master.zip

解壓

unzip?master.zip

修改配置文件

cd?/jackxu/rocketmq-externals-master/rocketmq-console/src/main/resources
vim?application.properties
#這是一個spring?boot項目,我們需要修改里面的參數
#修改端口號:
server.port=7298
#修改name?server地址(多個地址用英文分號隔開)
rocketmq.config.namesrvAddr=39.103.144.86:9876;42.192.77.73:9876

打包

打成一個jar包, 這里需要先安裝maven,編譯慢的話可以替換成淘寶的鏡像

cd?/jackxu/rocketmq-externals-master/rocketmq-console
mvn?clean?package?-Dmaven.test.skip=true

啟動jar包

cd?target
java?-jar?rocketmq-console-ng-2.0.0.jar

訪問

訪問一下 ?http://42.192.77.73:7298/ ?,可以看到都已經啟動成功了

圖片

踩坑點

這里有兩個踩坑點,在啟動的時候會報錯

  • (1)spring boot啟動的時候報連接不上39.103.144.86:9876;42.192.77.73:9876,這里我的第一反應是防火墻的原因,關閉一下
systemctl?disable?firewalld.service 

再次啟動還是不行,然后我的第二個反應是端口沒有開放,telnet一下

telnet?42.192.77.73?9876

果然telnet不通,原因是這樣的,我安裝在云服務器上,默認端口是不開放的,需要到控制臺打開,這也算是一個經驗吧。

圖片

  • (2)再次啟動的時候又報了另一個錯誤,連接不上172.26.182.88:9876,當時我就奇怪了,我寫的地址里沒有這個地址啊,怎么在連接它,而且這個IP看上去又像是內網地址,后來我打開阿里云控制臺一看,果真是這臺機器的內網地址,然后我又百度了一番,大概原因就是RocketMQ是阿里開源的,而那臺機器又是阿里云的機器,它的源碼里應該是優先連接到阿里云的內網地址,網上的做法是在配置文件里面顯式的加上公網地址即可解決。
#新增公網IP
brokerIP1=39.103.144.86

控制臺介紹

  • 運維:主要是設置nameserver和配置vipchannel。
  • 駕駛艙:控制臺的dashboard,可以分別按broker和主題來查看消息的數量和趨勢。
  • 集群:整個RocketMQ的集群情況,包括分片,編號,地址,版本,消息生產和消息消費的TPS等,這個在做性能測試的時候可以作為數據指標。
  • 主題:即topic,可以新增/更新topic,也可以查看topic的信息,如狀態,路由,消費者管理和發送消息等。
  • 消費者:可以在當前broker中查看/新建消費者group,包括消費者信息和消費進度。
  • 生產者:可以在當前broker中查看生產組下的生產者group,包括生產者信息和生產者狀態。
  • 消息:可以按照topic,messageID,messageKey分別查詢具體的消息。
  • 用戶中心:切換語言和登錄相關(登錄需要在console的配置中打開對應配置,默認不需要登錄)。

其中最常用的是集群,主題,消費者和消息這四部分。

配置文件說明

下面介紹一下安裝RocketMQ配置文件里面的屬性首先是集群名字相同,上面四臺機器的集群名字都叫 brokerClusterName=jackxu-cluster,其次是連接到相同的NameServer,namesrvAddr=39.103.144.86:9876;42.192.77.73:9876。在配置文件中brokerId=0代表master,brokerId=1代表slave。

在配置文件中還有這兩個屬性

圖片

brokerRole在master broker可以配置成SYNC_MASTER或者ASYNC_MASTER,在slave broker統一配置成SLAVE

圖片

圖片

流程圖

圖片

我們推薦的配置是異步刷盤+同步復制。

HA與故障轉移

在之前的版本中,RocketMQ只有master/slave一種部署方式,一組broker中有一個master,有0到多個slave,這種模式下提供了一定的高可用性。

master在掛了的情況下,slave仍然可以提供讀服務。默認情況下,讀寫都在master上,如果開啟了slaveReadEnable=true,slave也可以參與讀負載,但是是在master積壓的消息超過了物理內存的40%,才會默認轉向brokerId為1的從服務器讀取,具體轉向哪臺機器由whichBrokerWhenConsumeSlowly參數控制。

org.apache.rocketmq.common.subscription.SubscriptionGroupConfig
private?long?whichBrokerWhenConsumeSlowly=1;

由于是多主的存在,當一個master掛了以后,可以寫到其他的master上。

RocketMQ 2019年3月發布的4.5.0版本中,利用Dledger技術解決了自動選主的問題。Dledger就是一個基于raft協議的commitlog存儲庫,也是RocketMQ實現新的高可用多副本架構的關鍵。它的優點是不需要引入外部組件,自動選主邏輯集成到各個節點的進程中,節點之間通過通信就可以完成選主。

架構圖

圖片

在這種情況下,commitlog是Dledger管理的,具有選主的功能。默認是不開啟,如果需要開啟,需要在配置文件里面添加以下配置:

 #?是否啟用DLedger
????enableDLegerCommitLog=true
????#?DLedger?Raft?Group的名字
????dLegerGroup=broker-a
????#?DLedger?Group內各節點的地址和端口,至少需要3個節點
????dLegerPeers=n0-192.168.44.163:10911;n1-192.168.44.164:10911;n2-192.168.44.165:10911
????#?本節點id
????dLegerSelfId=n0

結語

小伙伴在學習一個中間件的時候一定要動手實踐安裝,首先是體驗一下安裝的過程氛圍,了解一些參數配置,雖然我們平時可能接觸不到,但是學習還是需要的,不一定需要精,至少是要會。

來源:jack_xu | https://juejin.cn/post/692950...

image

查看原文

贊 1 收藏 1 評論 0

民工哥 發布了文章 · 3月8日

每天學一個 Linux 命令(56):su/sudo

圖片

昨日推薦:每天學一個 Linux 命令(55):id

命令簡介

su 命令用于切換當前用戶身份到其他用戶身份。

sudo 命令用于切換用戶執行權限,這個命令可使其它非 root 用戶具有 root 權限。默認情況下,sudo 要求用戶使用密碼進行身份驗證,這是用戶密碼,不是 root 密碼。

語法格式

su?[?options?]?[?username?]
sudo?[?options?]?[?command?]

選項說明

su 命令選項

-c<指令>??#執行完指定的指令后,即恢復原來的身份
-f??#使shell不用去讀取啟動文件
-l??#切換身份時,同時變更工作目錄
-m??#切換身份時,不變更環境變量
-s??#指定要執行的shell
--help?????#打印幫助信息
--version??#打印版本信息

sudo 命令選項

-b??#在后臺執行指令
-h??#打印幫助信息
-H??#將HOME環境變量設為新身份的HOME環境變量
-k??#結束密碼的有效期限,也就是下次再執行sudo時便需要輸入密碼
-l??#列出目前用戶可執行與無法執行的指令
-s<shell>??#執行指定的shell
-u<用戶>???#以指定的用戶作為新的身份
-v??#延長密碼有效期限5分鐘
-V??#打印版本信息

應用舉例

#切換用戶到?mingongge
[root@centos7?~]#?su?-?mingongge
Last?login:?Sun?Jan?17?08:08:46?EST?2021?on?pts/0
#切換到root用戶后執行pwd命令后再切換至原用戶
[mingongge@centos7?~]$?su?-c?pwd?root
Password:?
/home/mingongge
[mingongge@centos7?~]$?sudo?-i
[sudo]?password?for?mingongge:?
mingongge?is?not?in?the?sudoers?file.??This?incident?will?be?reported.
#普通用戶如果沒有在/etc/sudoers文件里配置相關的信息,則無法執行sudo這個命令
[mingongge@centos7?~]$?sudo?-l
[sudo]?password?for?mingongge:?
Sorry,?user?mingongge?may?not?run?sudo?on?centos7.

用戶需要執行 sudo 命令時就需要在/etc/sudoers配置文件中配置,然后直接使用sudo + 需要執行的命令 這種組合來讓自己具有管理員權限。

每天學一個 Linux 命令(53):who

每天學一個 Linux 命令(54):w

查看原文

贊 0 收藏 0 評論 2

民工哥 發布了文章 · 3月7日

Linux 系統安裝 AutoFs 掛載服務

圖片

無論是Samba服務還是NFS服務,都要把掛載信息寫入到/etc/fstab中,這樣遠程共享資源就會自動隨服務器開機而進行掛載。雖然這很方便,但是如果掛載的遠程資源太多,則會給網絡帶寬和服務器的硬件資源帶來很大負載。如果在資源掛載后長期不使用,也會造成服務器硬件資源的浪費。

可能會有讀者說,可以在每次使用之前執行mount命令進行手動掛載。這是一個不錯的選擇,但是每次都需要先掛載再使用,您不覺得麻煩嗎?

autofs自動掛載服務可以幫我們解決這一問題。與mount命令不同,autofs服務程序是一種Linux系統守護進程,當檢測到用戶試圖訪問一個尚未掛載的文件系統時,將自動掛載該文件系統。

換句話說,我們將掛載信息填入/etc/fstab文件后,系統在每次開機時都自動將其掛載,而autofs服務程序則是在用戶需要使用該文件系統時才去動態掛載,從而節約了網絡資源和服務器的硬件資源。

[root@localhost?~]#?yum?install?autofs
Loaded?plugins:?langpacks,?product-id,?subscription-manager
......
Running?transaction
Installing?:?hesiod-3.2.1-3.el7.x86_64?1/2
Installing?:?1:autofs-5.0.7-40.el7.x86_64?2/2
Verifying?:?hesiod-3.2.1-3.el7.x86_64?1/2
Verifying?:?1:autofs-5.0.7-40.el7.x86_64?2/2
Installed:
autofs.x86_64?1:5.0.7-40.el7
Dependency?Installed:
hesiod.x86_64?0:3.2.1-3.el7
Complete!

處于生產環境中的Linux服務器,一般會同時管理許多設備的掛載操作。如果把這些設備掛載信息都寫入到autofs服務的主配置文件中,無疑會讓主配置文件臃腫不堪,不利于服務執行效率,也不利于日后修改里面的配置內容,因此在 autofs 服務程序的主配置文件中需要按照“掛載目錄 子配置文件”的格式進行填寫。掛載目錄是設備掛載位置的上一級目錄。

例如,光盤設備一般掛載到/media/cdrom目錄中,那么掛載目錄寫成/media即可。對應的子配置文件則是對這個掛載目錄內的掛載設備信息作進一步的說明。子配置文件需要用戶自行定義,文件名字沒有嚴格要求,但后綴必須以.misc結束。具體的配置參數如第7行的加粗字所示。

[root@localhost?~]#?vim?/etc/auto.master
#
#?Sample?auto.master?file
#?This?is?an?automounter?map?and?it?has?the?following?format
#?key?[?-mount-options-separated-by-comma?]?location
#?For?details?of?the?format?look?at?autofs(5).
/media?/etc/iso.misc
/misc?/etc/auto.misc
#
#?NOTE:?mounts?done?from?a?hosts?map?will?be?mounted?with?the
#?"nosuid"?and?"nodev"?options?unless?the?"suid"?and?"dev"
#?options?are?explicitly?given.
/net?-hosts
#
#?Include?/etc/auto.master.d/*.autofs
+dir:/etc/auto.master.d
#
#?Include?central?master?map?if?it?can?be?found?using
#?nsswitch?sources.
#
#?Note?that?if?there?are?entries?for?/net?or?/misc?(as
#?above)?in?the?included?master?map?any?keys?that?are?the
#?same?will?not?be?seen?as?the?first?read?key?seen?takes
#?precedence.
+auto.master

在子配置文件中,應按照“掛載目錄 掛載文件類型及權限 :設備名稱”的格式進行填寫。例如,要把光盤設備掛載到/media/iso目錄中,可將掛載目錄寫為iso,而-fstype為文件系統格式參數,iso9660為光盤設備格式,ro、nosuid及nodev為光盤設備具體的權限參數,/dev/cdrom則是定義要掛載的設備名稱。配置完成后再順手將autofs服務程序啟動并加入到系統啟動項中:

[root@localhost?~]#?vim?/etc/iso.misc
iso???-fstype=iso9660,ro,nosuid,nodev?:/dev/cdrom
[root@localhost?~]#?systemctl?start?autofs
[root@localhost?~]#?systemctl?enable?autofs
ln?-s?'/usr/lib/systemd/system/autofs.service'?'/etc/systemd/system/multi-user.target.wants/autofs.service'

接下來將發生一件非常有趣的事情。我們先查看當前的光盤設備掛載情況,確認光盤設備沒有被掛載上,而且/media目錄中根本就沒有iso子目錄。但是,我們卻可以使用cd命令切換到這個iso子目錄中,而且光盤設備會被立即自動掛載上。我們也就能順利查看光盤內的內容了。

[root@localhost?~]#?df?-h
Filesystem?Size?Used?Avail?Use%?Mounted?on
/dev/mapper/rhel-root?18G?3.0G?15G?17%?/
devtmpfs?905M?0?905M?0%?/dev
tmpfs?914M?140K?914M?1%?/dev/shm
tmpfs?914M?8.9M?905M?1%?/run
tmpfs?914M?0?914M?0%?/sys/fs/cgroup
/dev/sda1?497M?119M?379M?24%?/boot
[root@linuxprobe?~]#?cd?/media
[root@localhost?media]#?ls
[root@localhost?media]#?cd?iso
[root@localhost?iso]#?ls?-l
total?812
dr-xr-xr-x.?4?root?root?2048?May?7?2017?addons
dr-xr-xr-x.?3?root?root?2048?May?7?2017?EFI
-r--r--r--.?1?root?root?8266?Apr?4?2017?EULA
-r--r--r--.?1?root?root?18092?Mar?6?2012?GPL
dr-xr-xr-x.?3?root?root?2048?May?7?2017?images
dr-xr-xr-x.?2?root?root?2048?May?7?2017?isolinux
dr-xr-xr-x.?2?root?root?2048?May?7?2017?LiveOS
-r--r--r--.?1?root?root?108?May?7?2017?media.repo
dr-xr-xr-x.?2?root?root?774144?May?7?2017?Packages
dr-xr-xr-x.?24?root?root?6144?May?7?2017?release-notes
dr-xr-xr-x.?2?root?root?4096?May?7?2017?repodata
-r--r--r--.?1?root?root?3375?Apr?1?2017?RPM-GPG-KEY-redhat-beta
-r--r--r--.?1?root?root?3211?Apr?1?2017?RPM-GPG-KEY-redhat-release
-r--r--r--.?1?root?root?1568?May?7?2017?TRANS.TBL
[root@localhost?~]#?df?-h
Filesystem?Size?Used?Avail?Use%?Mounted?on
/dev/mapper/rhel-root?18G?3.0G?15G?17%?/
devtmpfs?905M?0?905M?0%?/dev
tmpfs?914M?140K?914M?1%?/dev/shm
tmpfs?914M?8.9M?905M?1%?/run
tmpfs?914M?0?914M?0%?/sys/fs/cgroup
/dev/cdrom?3.5G?3.5G?0?100%?/media/iso
/dev/sda1?497M?119M?379M?24%?/boot
作者: Escape 鏈接: https://escapelife.github.io/...

image

查看原文

贊 1 收藏 1 評論 0

民工哥 發布了文章 · 3月7日

每天學一個 Linux 命令(55):id

圖片

昨日推薦:每天學一個 Linux 命令(54):w

命令簡介

id 命令用于查看用戶的 UIDGID 及所屬的用戶組等信息。

需要注意的就是:UID在系統中是唯一的,也是用戶的身份標識,但GID可以對應多個UID(簡單理解就是一個用戶可以加入多個用戶組)。

語法格式

id?[OPTIONS][用戶名稱]

選項說明

-g??#顯示用戶所屬群組的ID
-G???#顯示用戶所屬附加群組的ID
-n??#顯示用戶,所屬群組或附加群組的名稱
-r??#顯示實際ID
-u??#顯示用戶ID
-Z???#僅打印當前用戶的安全上下文
-help???#打印幫助信息
-version??????#打印版本信息

應用舉例

[root@centos7?~]#?id
uid=0(root)?gid=0(root)?groups=0(root)
#root?的?UID?=?0,GID?=?0
[root@centos7?~]#?id?-a
uid=0(root)?gid=0(root)?groups=0(root)
[root@centos7?~]#?id?-g
0
[root@centos7?~]#?id?-G
0
[root@centos7?~]#?id?mingongge
uid=1000(mingongge)?gid=1000(mingongge)?groups=1000(mingongge)

每天學一個 Linux 命令(51):which

每天學一個 Linux 命令(52):whereis

每天學一個 Linux 命令(53):who

查看原文

贊 1 收藏 1 評論 0

民工哥 發布了文章 · 3月6日

互聯網公司理想的技術架構!看完我收藏了

圖片

本文探討了互聯網公司的技術架構,涉及 DNS、負載均衡、長連接、API 網關、PUSH 推送、微服務、分布式事務以及相關支撐的基礎服務。主要是為了學習,希望可以給大家一個參考。

整體架構

圖片

APP、PC以及第三方等調用方通過傳統的域名解析服務LocalDNS獲取負載均衡器的IP,APP可以通過HttpDNS的方式來實現更實時和靈活精準的域名解析服務。

通過負載均衡器到達統一接入層,統一接入層維護長連接 。

API網關作為微服務的入口,負責協議轉換、請求路由、認證鑒權、流量控制、數據緩存等。業務Server通過PUSH推送系統來實現對端的實時推送,如IM、通知等功能。

業務Server之間通過專有的RPC協議實現相互調用,并通過NAT網關調用外部第三方服務。

圖片

域名解析

傳統 DNS

DNS(Domain Name System)域名系統,一種分布式網絡目錄服務,用于域名與 IP 地址的相互轉換,能夠使人更方便的訪問互聯網,而不用去記住機器的 IP 地址。

DNS 的解析過程如下:

圖片

  • 客戶端遞歸查詢 LocalDNS(一般是 ISP 互聯網服務提供商提供的邊緣 DNS 服務器)獲取 IP。
  • LocalDNS 迭代查詢獲取 IP,即不斷的獲取域名服務器的地址進行查詢。

HttpDNS

移動解析(HttpDNS)基于 Http 協議向 DNS 服務器發送域名解析請求,替代了基于 DNS 協議向運營商 LocalDNS 發起解析請求的傳統方式。

它可以避免 LocalDNS 造成的域名劫持和跨網訪問問題,解決移動互聯網服務中域名解析異常帶來的困擾。

以騰訊云 HttpDNS 為參考,相較于傳統 LocalDNS 的優勢對比:

圖片

負載均衡

為了解決單臺機器的性能問題以及單點問題,需要通過負載均衡將多臺機器進行水平擴展,將請求流量分發到不同的服務器上面。

客戶端的流量首先會到達負載均衡服務器,由負載均衡服務器通過一定的調度算法將流量分發到不同的應用服務器上面。

同時負載均衡服務器也會對應用服務器做周期性的健康檢查,當發現故障節點時便動態的將節點從應用服務器集群中剔除,以此來保證應用的高可用。

網絡負載均衡主要有硬件與軟件兩種實現方式,主流負載均衡解決方案中,硬件廠商以 F5 為代表,軟件主要為 LVS、NGINX、HAProxy。

技術原理上分為 L4 四層負載均衡和 L7 七層負載均衡。

L4 vs L7

圖片

L4 四層負載均衡工作于處于 OSI 模型的傳輸層,主要工作是轉發。它在接收到客戶端報文后,需要了解傳輸層的協議內容,根據預設的轉發模式和調度算法將報文轉發到應用服務器。

以 TCP 為例,當一個 TCP 連接的初始 SYN 報文到達時,調度器就選擇一臺服務器,將報文轉發給它。

此后通過查發報文的 IP 和 TCP 報文頭地址,保證此連接的后繼報文被轉發到該服務器。

L7 七層負載均衡工作在 OSI 模型的應用層,主要工作就是代理。七層負載均衡會與客戶端建立一條完整的連接并將應用層的請求解析出來,再按照調度算法選擇一個應用服務器,并與應用服務器建立另外一條連接將請求發送過去。

LVS 轉發模式

LVS(IP 負載均衡技術)工作在 L4 四層以下,轉發模式有:

  • DR 模式
  • NAT 模式
  • TUNNEL 模式
  • FULL NAT 模式

圖片

DR 模式(直接路由)

圖片

改寫請求報文的 MAC 地址,將請求發送到真實服務器,而真實服務器將響應直接返回給客戶。

要求調度器與真實服務器都有一塊網卡連在同一物理網段上,并且真實服務器需要配置 VIP。

②NAT 模式 (網絡地址轉換)

圖片

調度器重寫請求報文的目標地址,根據預設的調度算法,將請求分派給后端的真實服務器;真實服務器的響應報文通過調度器時,報文的源地址被重寫,再返回給客戶,完成整個負載調度過程。要求負載均衡需要以網關的形式存在于網絡中。

③TUNNEL 模式

圖片

調度器把請求報文通過 IP 隧道轉發至真實服務器,而真實服務器將響應直接返回給客戶,所以調度器只處理請求報文。要求真實服務器支持隧道協議和配置 VIP。

④FULL NAT 模式

圖片

在 NAT 模式的基礎上做一次源地址轉換(即 SNAT),做 SNAT 的好處是可以讓應答流量經過正常的三層路由回到負載均衡上,這樣負載均衡就不需要以網關的形式存在于網絡中了。

性能要遜色于 NAT 模式,真實服務器會丟失客戶端的真實 IP 地址。

調度算法

①輪詢

將外部請求按順序輪流分配到集群中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載。

②加權輪詢

權值越大分配到的訪問概率越高,主要用于后端每臺服務器性能不均衡的情況下,達到合理有效的地利用主機資源。

③最少連接

將網絡請求調度到已建立的鏈接數最少的服務器上。如果集群系統的真實服務器具有相近的系統性能,采用"最小連接"調度算法可以較好地均衡負載。

④哈希

將指定的 Key 的哈希值與服務器數目進行取模運算,獲取要求的服務器的序號 一致性哈希。

考慮到分布式系統每個節點都有可能失效,并且新的節點很可能動態的增加進來,一致性哈??梢员WC當系統的節點數目發生變化時盡可能減少訪問節點的移動。

API 網關

API 網關(API Gateway)是一個服務器集群,對外的唯一入口。從面向對象設計的角度看,它與外觀模式類似。

API 網關封裝了系統內部架構,對外提供 REST/HTTP 的訪問 API。同時還具有其他非業務相關的職責,如身份驗證、監控、負載均衡、緩存、流量控制等。

API 管理

API 網關核心功能是 API 管理。提供 API 的完整生命周期管理,包括創建、維護、發布、運行、下線等基礎功能;提供測試,預發布,發布等多種環境;提供版本管理,版本回滾。

API 配置包括前端配置和后端配置:

  • 前端配置指的是 Http 相關的配置,如 HTTP 方法、URL 路徑,請求參數等。
  • 后端配置指的是微服務的相關配置,如服務名稱、服務參數等。這樣通過 API 配置,就完成了前端 Http 到后端微服務的轉換。

全異步

由于 API 網關主要處理的是網絡 I/O,那么通過非阻塞 I/O 以及 I/O 多路復用,就可以達到使用少量線程承載海量并發處理,避免線程上下文切換,大大增加系統吞吐量,減少機器成本。

常用解決方案有 Tomcat/Jetty+NIO+Servlet3.1 和 Netty+NIO,這里推薦Netty+NIO,能實現更高的吞吐量。

Spring 5.0 推出的 WebFlux 反應式編程模型,特點是異步的、事件驅動的、非阻塞,內部就是基于 Netty+NIO 或者 Servlet 3.1 Non-Blocking IO 容器實現的。

鏈式處理

鏈式處理即通過責任鏈模式,基于 Filter 鏈的方式提供了網關基本的功能,例如:路由、協議轉換、緩存、限流、監控、日志。也可以根據實際的業務需要進行擴展,但注意不要做耗時操作。

圖片

Spring Cloud Gateway (基于 Spring WebFlux)的工作機制大體如下:

  • Gateway 接收客戶端請求。
  • 客戶端請求與路由信息進行匹配,匹配成功的才能夠被發往相應的下游服務。
  • 請求經過 Filter 過濾器鏈,執行 pre 處理邏輯,如修改請求頭信息等。
  • 請求被轉發至下游服務并返回響應。
  • 響應經過 Filter 過濾器鏈,執行 post 處理邏輯。
  • 向客戶端響應應答。

請求限流

請求限流是在面對未知流量的情況下,防止系統被沖垮的最后一道有效的防線??梢葬槍?、業務系統和具體 API 維度進行限流。

具體實現可以分為集群版和單機版,區別就是集群版是使用后端統一緩存如 Redis 存儲數據,但有一定的性能損耗;單機版則在本機內存中進行存儲(推薦)。

常用的限流算法:

  • 計數器
  • 漏桶
  • 令牌桶(推薦)

熔斷降級

①服務熔斷

當下游的服務因為某種原因突然變得不可用或響應過慢,上游服務為了保證自己整體服務的可用性,不再繼續調用目標服務,直接返回,快速釋放資源。如果目標服務情況好轉則恢復調用。

熔斷是為了解決服務雪崩,特別是在微服務體系下,通常在框架層面進行處理。

內部機制采用的是斷路器模式,其內部狀態轉換圖如下:

圖片

②服務降級

當負荷超出系統整體負載承受能力時,為了保證核心服務的可用,通??梢詫Ψ呛诵姆者M行降級。

如果返回緩存內容或者直接返回,服務降級的粒度可以是 API 維度、功能維度、甚至是系統維度,但是都需要事前進行服務級別的梳理和定義。

真實場景下,通常是在服務器負載超出閾值報警之后,管理員決定是擴容還是降級。

業務隔離

API 網關統一了非業務層面的處理,但如果有業務處理的邏輯,不同業務之間就可能會相互影響。

要進行業務系統的隔離,通??梢圆捎镁€程池隔離和集群隔離,但對于 Java 而言,線程是比較重的資源,推薦使用集群隔離。

PUSH 推送

消息推送系統針對不同的場景推出多種推送類型,滿足用戶的個性化推送需求,并集成了蘋果、華為、小米、FCM 等廠商渠道的推送功能,在提供控制臺快速推送能力的同時,也提供了服務端接入方案,方便用戶快速集成移動終端推送功能,與用戶保持互動,從而有效地提高用戶留存率,提升用戶體驗。

圖片

①設備建連、注冊、綁定用戶流程

圖片

②消息推送過程

圖片

在非常多的業務場景中,當業務發生時用戶未必在線,也未必有網絡。因此,在 MPS 中所有消息均會被持久化。業務發生時,MPS 會嘗試做一次推送(第三方渠道推送或自建的 TCP 連接推送)。

自建渠道中,會通過查詢緩存來判斷用戶的終端是否有 TCP 連接,如果存在則推送,客戶端收到推送消息后,會給服務端回執,服務端即可更新消息狀態。

如果推送失敗,或者回執丟失,用戶在下一次建立連接時,會重新接受消息通知,同時客戶端會進行邏輯去重。

微服務體系

圖片

作者:VectorJin
鏈接:https://juejin.cn/post/684490...

image

查看原文

贊 16 收藏 12 評論 0

民工哥 發布了文章 · 3月6日

每天學一個 Linux 命令(54):w

圖片

昨日推薦:每天學一個 Linux 命令(53):who

命令簡介

w 命令是一個非常常用的命令,用來查看登錄者的信息及他們的行為動作、系統負載等信息。

語法格式

w?[OPTIONS][用戶名稱]

選項說明

-f??#開啟或關閉顯示用戶從何處登錄到系統
-h??#不顯示各欄位的標題信息列
-l??#使用詳細格式列表(默認)
-s??#使用簡潔格式列表
-u??#忽略執行程序的名稱,以及該程序耗費CPU時間的信息
-V??#打印版本信息

應用舉例

#顯示當前用戶及系統負載信息
[root@centos7?~]#?w
?08:48:55?up?1?day,?10:02,??2?users,??load?average:?0.09,?0.04,?0.05
USER?????TTY??????FROM?????????????LOGIN@???IDLE???JCPU???PCPU?WHAT
root?????pts/0????192.168.1.93?????08:26???20:15???0.04s??0.04s?-bash
root?????pts/1????192.168.1.93?????08:32????7.00s??0.25s??0.18s?w
#不顯示用戶登錄位置信息
[root@centos7?~]#?w?-f
?08:48:58?up?1?day,?10:02,??2?users,??load?average:?0.08,?0.04,?0.05
USER?????TTY????????LOGIN@???IDLE???JCPU???PCPU?WHAT
root?????pts/0?????08:26???20:18???0.04s??0.04s?-bash
root?????pts/1?????08:32????2.00s??0.08s??0.01s?w?-f
#以精簡格式顯示
[root@centos7?~]#?w?-s
?08:49:12?up?1?day,?10:03,??2?users,??load?average:?0.06,?0.04,?0.05
USER?????TTY??????FROM??????????????IDLE?WHAT
root?????pts/0????192.168.1.93?????20:32??-bash
root?????pts/1????192.168.1.93??????0.00s?w?-s
#不顯示列的標題信息
[root@centos7?~]#?w?-h
root?????pts/0????192.168.1.93?????08:26???20:36???0.04s??0.04s?-bash
root?????pts/1????192.168.1.93?????08:32????4.00s??0.07s??0.00s?w?-h

image

查看原文

贊 2 收藏 1 評論 0

民工哥 發布了文章 · 3月5日

Docker 服務終端 UI 管理工具

圖片

這是一個簡單的基于終端的 UI 管理工具,主要適用于對 dockerdocker-compose 容器以及服務的管理和便捷使用,靈感來自于 gocui 并使用 Go 語音改寫。

圖片

1.功能特性

輕度用戶使用尚可,可不要把它當做是一個專業的管理工具,哈哈哈

  • 查看dockerdocker-compose容器環境的狀態一目了然
  • 查看container/service的日志
  • 查看容器指標的ascii圖表,如CPU/內存等
  • 自定義這些圖表以測量您想要的幾乎任何指標
  • 直接進入到container/service上
  • 重新啟動/刪除/重建containers/services
  • 查看給定圖像的祖先圖層
  • 修剪占用磁盤空間的容器/映像或卷

圖片

2.安裝方式

安裝也很方便

Homebrew

#?Homebrew
brew?tap?jesseduffield/lazydocker
brew?install?lazydocker

Linux/OSX

#?Binary?Release?(Linux/OSX)
curl?https://raw.githubusercontent.com/jesseduffield/?
????lazydocker/master/scripts/install_update_linux.sh?|?bash

Go

#?Go
#?Required?Go?version?>=?1.8
go?get?github.com/jesseduffield/lazydocker

Zsh

#?zsh?config
echo?"alias?lzd='lazydocker'"?>>?~/.zshrc

Docker

#?docker?build?-t?lazydocker?.
#?docker?run?-it?lazydocker:latest?/bin/sh?-l
FROM?golang:alpine
WORKDIR /go/src/github.com/jesseduffield/lazydocker/
COPY ./?.
RUN CGO_ENABLED=0?GOOS=linux?go?build
FROM?alpine:latest
RUN apk?add?-U?git?xdg-utils
WORKDIR /go/src/github.com/jesseduffield/lazydocker/
COPY --from=0?/go/src/github.com/jesseduffield/lazydocker?/go/src/github.com/jesseduffield/lazydocker
COPY --from=0?/go/src/github.com/jesseduffield/lazydocker/lazydocker?/bin/
RUN echo?"alias?gg=lazydocker"?>>?~/.profile
  1. 鍵盤綁定

快捷鍵使用起來更方便

Project

 e:?edit?lazydocker?config
??o:?open?lazydocker?config
??[:?previous?tab
??]:?next?tab
??m:?view?logs
??enter:?focus?main?panel

Containers

 [:?previous?tab
??]:?next?tab
??d:?remove
??e:?Hide/Show?stopped?containers
??s:?stop
??r:?restart
??a:?attach
??D:?prune?exited?containers
??m:?view?logs
??c:?run?predefined?custom?command
??enter:?focus?main?panel

Services

 d:?remove?containers
??s:?stop
??r:?restart
??a:?attach
??m:?view?logs
??[:?previous?tab
??]:?next?tab
??R:?view?restart?options
??c:?run?predefined?custom?command
??enter:?focus?main?panel

Images

 [:?previous?tab
??]:?next?tab
??d:?remove?image
??D:?prune?unused?images
??enter:?focus?main?panel

Volumes

 [:?previous?tab
??]:?next?tab
??d:?remove?volume
??D:?prune?unused?volumes
??enter:?focus?main?panel

Main

 esc:?return

作者: Escape 鏈接: https://escapelife.github.io/...

image

查看原文

贊 1 收藏 0 評論 0

民工哥 發布了文章 · 3月5日

每天學一個 Linux 命令(53):who

圖片

昨日推薦:[](http://mp.weixin.qq.com/s?__b...每天學一個 Linux 命令(52):whereis

命令簡介

who 命令用于顯示目前登錄系統的用戶信息。

who 命令用于顯示當前系統登錄的所有用戶的信息,可以查看目前有那些用戶登錄到系統等信息。單獨執行 who 命令時可以打印出登錄的帳號,用戶所使用的終端,登錄時間以及從何處登錄或正在使用哪些顯示器等信息。

語法格式

who?[?OPTION?]...?[?FILE?]?[?am?i?]

選項說明

-a??#與使用選項-b -d --login -p -r -t -T -u相同。
-b??#顯示上次系統引導的時間
-d??#顯示無效進程
-H??#顯示各欄位的標題信息列
-i??#顯示閑置時間
-m??#此參數和指定"am?i"字符串相同
-q??#只顯示登入系統的帳號名稱和總人數
-w??#顯示用戶的信息狀態欄
--help??#打印在線幫助
--version??#顯示版本信息

應用舉例

[root@centos7?~]#?who
root?????pts/0????????2021-01-17?08:26?(192.168.1.93)
root?????pts/1????????2021-01-17?08:32?(192.168.1.93)
[root@centos7?~]#?who?-b
?????????system?boot??2021-01-14?05:41
[root@centos7?~]#?who?-d
[root@centos7?~]#?who?-m
root?????pts/1????????2021-01-17?08:32?(192.168.1.93)
[root@centos7?~]#?who?-q
root?root
#?users=2
[root@centos7?~]#?who?-aH
NAME???????LINE?????????TIME?????????????IDLE??????????PID?COMMENT??EXIT
???????????system?boot??2021-01-14?05:41
LOGIN??????tty1?????????2021-01-14?05:42???????????????630?id=tty1
???????????run-level?3??2021-01-14?05:42
root?????+?pts/0????????2021-01-17?08:26?00:06???????28432?(192.168.1.93)
root?????+?pts/1????????2021-01-17?08:32???.?????????28737?(192.168.1.93)

每天學一個 Linux 命令(50):date

每天學一個 Linux 命令(51):which

查看原文

贊 3 收藏 1 評論 0

民工哥 發布了文章 · 3月4日

分享一套基于SpringBoot和Vue的企業級中后臺開源項目,代碼很規范!

簡介

SmartAdmin由河南·洛陽 1024創新實驗室團隊研發的一套互聯網企業級的通用型中后臺解決方案!使用最前沿的前后臺技術棧SpringBoot和Vue,前后端分離,我們開源一套漂亮的代碼和一套整潔的代碼規范,讓大家在這浮躁的代碼世界里感受到一股把代碼寫好的清流!同時又讓開發者節省大量的時間,減少加班,快樂工作,熱愛生活。SmartAdmin 讓你從認識到忘不了,絕對是你最想要的!

理念與思想

  • 我們分享的不是代碼,不是徒勞無功的堆砌功能,而是你必須的基礎功能,比如Vue前端權限、心跳、動態Reload、Keepalived標簽頁等等,可能還有一些正是你當前項目中缺失的功能。
  • 我們分享的不僅有代碼,還有一套經過幾十人驗證過的前、后端代碼。細節決定成敗,好的規范能讓我們敲下的每行代碼更鏗鏘有力!
  • 我們推崇高質量的代碼,身為開發,代碼即利劍,鍵盤上一套行云流水,宛如俠客,事了拂衣去,深藏身與名。
  • 我們推崇團隊的高度配合默契、互相幫助,從不加班,而不是一看到別人的代碼就頭皮發麻,留其996.ICU
  • 我們熱愛編程,熱愛代碼,保持謙遜,不斷學習,快樂工作,熱愛生活。
  • 請相信并認真閱讀下面的每一個點,讓你感受不一樣的編碼體驗

演示圖(點擊可放大)

圖片

圖片

圖片

圖片

圖片

圖片

圖片

圖片

圖片

圖片

圖片

圖片

圖片
源碼地址獲?。?/strong>在民工哥技術之路公眾號回復中后臺項目
image

技術體系

  • 前端:Vue + Vue-Router + Vuex + ViewUI + vue-enum
  • 后端:SpringBoot2 + Mybatis-plus + jwt + druid + mysql
  • 前端代碼規范smart-front-standard -guide(大力推薦)
  • 基于阿里規范之上的后端規范smart-backend-standard-guide(大力推薦)

前端特點

  • 高質量的代碼、代碼結構、和代碼注釋
  • 漂亮的UI,菜單欄、標簽頁,體驗、交互更好用的員工、部門、角色、菜單管理等等
  • 優化基于Keepalive的標簽頁,做到標簽頁該緩存的時候緩存,比如左右切換等,不該緩存的時候不緩存,比如新建,表單提交結束等
  • 前端常量維護: vue-enum,拒絕出現魔法數字,代碼不可維護的現象
  • 全新的基于前端的權限設計(忘掉傳統的權限設計吧,已經不適合這個前端時代)
  • 基于websocket的在線人數
  • 支持一級、二級、三級菜單,四級菜單以及搜索功能
  • 其他功能:郵件、富文本、消息、系統配置等等
  • 寫不完了,太多好的細節需要你的發現......

后端特點

  • 高質量的Java代碼、分包結構、和代碼注釋
  • 業內獨創的請求返回碼維護,非常值得一看
  • 基于一個注解和controller的權限設計放棄更復雜的shiro,以及一套數據權限支持
  • 四層架構(controller, service, manager, dao)
  • 代碼閱讀性強、擴展性極高的員工、部門、角色、菜單管理
  • 基于LRU策略的內存級權限緩存
  • 配合前端vue-enum的swagger文檔注解
  • 心跳服務,讓你發現有哪些機器再跑,哪些人在偷偷的跑你的Job
  • 自定義的quartz job添加和修改,方便測試人員測試
  • smart-reload,為系統預留鉤子,動態加載,在不重啟程序前提下執行一些代碼,你懂的
  • 以上只是一些舉例,更多燦若繁星的驚喜和細節,等待著你的發現!

前端代碼規范

  • 文件、文件夾、目錄結構、組建、變量等等怎么命名
  • html、css、less等如何規范
  • vue項目目錄結構如何劃分
  • router和store該怎么劃分擴展性更好
  • vue組件規范該選擇哪些
  • 以及更多,數不勝數讓你覺得實用,同時身心愉悅的規范

后端代碼規范

  • 四層架構(controller, service, manager, dao) 是什么,為什么要有四層
  • 各個層的代碼該怎么寫才能讓團隊配合默契,高度一致
  • vo, bo, dto, entity ,各種javabean 怎么區分和使用
  • spring的 @Transactional 你用對了嗎
  • 方法參數個數、注釋、todo這些也要有規范,你遵守過嗎
  • 以上舉例,只是滄海一粟,更多的細節等待你的發現!
查看原文

贊 15 收藏 11 評論 0

民工哥 發布了文章 · 3月4日

強大,10k+點贊的 SpringBoot 后臺管理系統竟然出了詳細教程!

其實項目網上有很多了,但是教程比較詳細的沒多少,今天分享的項目從安裝部署到代碼具體功能都有很詳細都說明

圖片

eladmin 是一款基于 Spring Boot 2.1.0 、 Jpa、 Spring Security、redis、Vue 的前后端分離的后臺管理系統,項目采用分模塊開發方式, 權限控制采用 RBAC,支持數據字典與數據權限管理,支持一鍵生成前后端代碼,支持動態路由。

這個開源項目基本穩定,并且后續作者還會繼續優化。完全開源!這個真的要為原作者點個贊,如果大家覺得這個項目有用的話,建議可以稍微捐贈一下原作者支持一下。后端整理代碼質量、表設計等各個方面來說都是很不錯的。前后端分離,前端使用的是國內常用的 vue 框架,也比較容易上手。

系統功能

  • 用戶管理:提供用戶的相關配置,新增用戶后,默認密碼為123456
  • 角色管理:對權限與菜單進行分配,可根據部門設置角色的數據權限
  • 菜單管理:已實現菜單動態路由,后端可配置化,支持多級菜單
  • 部門管理:可配置系統組織架構,樹形表格展示
  • 崗位管理:配置各個部門的職位
  • 字典管理:可維護常用一些固定的數據,如:狀態,性別等
  • 系統日志:記錄用戶操作日志與異常日志,方便開發人員定位拍錯
  • SQL監控:采用druid 監控數據庫訪問性能,默認用戶名admin,密碼123456
  • 定時任務:整合Quartz做定時任務,加入任務日志,任務運行情況一目了然
  • 代碼生成:高靈活度生成前后端代碼,減少大量重復的工作任務
  • 郵件工具:配合富文本,發送html格式的郵件
  • 七牛云存儲:可同步七牛云存儲的數據到系統,無需登錄七牛云直接操作云數據
  • 支付寶支付:整合了支付寶支付并且提供了測試賬號,可自行測試
  • 服務監控:監控服務器的負載情況
  • 運維管理:一鍵部署你的應用

項目結構

項目采用按功能分模塊的開發方式,結構如下

  • eladmin-common 為系統的公共模塊,各種工具類,公共配置存在該模塊
  • eladmin-system 為系統核心模塊也是項目入口模塊,也是最終需要打包部署的模塊
  • eladmin-logging 為系統的日志模塊,其他模塊如果需要記錄日志需要引入該模塊
  • eladmin-tools 為第三方工具模塊,包含:圖床、郵件、云存儲、本地存儲、支付寶
  • eladmin-generator 為系統的代碼生成模塊,代碼生成的模板在 system 模塊中

詳細結構

`- eladmin-common 公共模塊

- annotation 為系統自定義注解
- aspect 自定義注解的切面
- base 提供了Entity、DTO基類和mapstruct的通用mapper
- config 自定義權限實現、redis配置、swagger配置、Rsa配置等
- exception 項目統一異常的處理
- utils 系統通用工具類
  • eladmin-system 系統核心模塊(系統啟動入口)

    • config 配置跨域與靜態資源,與數據權限

      • thread 線程池相關
    • modules 系統相關模塊(登錄授權、系統監控、定時任務、運維管理等)
  • eladmin-logging 系統日志模塊
  • eladmin-tools 系統第三方工具模塊
  • eladmin-generator 系統代碼生成模塊`

我發現的亮點

  • 統一異常處理設計
  • 注解權限的設計
  • 接口級別的限流設計
  • 比較完善的工具,如支付寶,郵件,定時任務,各種監控的實現
  • 緩存redis

圖片

圖片

后臺首頁

另外,作者最近還提供了一份詳細的文檔幫助小伙伴們學習這個項目。文檔從環境搭建到后端每一塊的詳細設計都有涵蓋,非常適合拿來學習!

圖片

該系統源碼獲取方式:在民工哥技術之路后臺回復「后臺管理系統」,獲取資料。

image

查看原文

贊 3 收藏 3 評論 0

認證與成就

  • 獲得 6103 次點贊
  • 獲得 11 枚徽章 獲得 2 枚金徽章, 獲得 3 枚銀徽章, 獲得 6 枚銅徽章

擅長技能
編輯

開源項目 & 著作
編輯

  • 《Linux系統運維指南》

    本書系統全面、由淺入深地介紹了Linux系統運維的知識,以及在企業實際環境中用到的各類服務、架構和運維管理。本書分基礎篇、LAMP/LNMP架構篇、應用服務篇和架構運用篇?;A篇詳細介紹Linux系統的基礎知識,LAMP/LNMP架構篇介紹時下企業中最常見的兩種架構的部署與配置,應用服務篇以企業實際運維環境為出發點詳細介紹當下企業用到的各類開源軟件服務,架構運用篇對前三篇的知識進行總結,并結合企業的實際場景加以實踐。

  • 運維工程師打怪升級進階之路

    內容由淺入深,從最基礎的網絡基礎開始,逐漸深入系統的學習Linux系統運維知識。然后引入企業項目實戰內容,從而讓更多學習Linux系統運維的讀者朋友們「無論前端、后端、測試還是運維,底層系統是必備技術點」,都能夠快速入門、并且在一程度上掌握當下企業所需要的技術儲備。再穿插企業面試題、面試經驗等,同時也能幫助運維工程師們在求職的路上能更加順暢,少踩坑。

  • 《每天學一個 Linux 命令》

    為了方便大家更好的學習Linux命令,民工哥技術之路公眾號自2020年12月21日起,推出 《每天一個Linux命令》系列文章。 民工哥將所有文章統一整理成這個集合,方便大家后續的查找與學習。

注冊于 2019-02-21
個人主頁被 82.6k 人瀏覽

一本到在线是免费观看_亚洲2020天天堂在线观看_国产欧美亚洲精品第一页_最好看的2018中文字幕 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>