本地同時啟停多個中間件的優雅方案

来源:https://www.cnblogs.com/mylibs/archive/2022/12/14/local-fake-docker.html
-Advertisement-
Play Games

"I don’t care if it works on your machine! We are not shipping your machine!" - Vidiu Platon “我才不管它能不能在你的機器上運行捏!我們又不會給你提供機器!” —— 韋都·柏拉圖 0x00 大綱 0x01 前 ...


"I don’t care if it works on your machine! We are not shipping your machine!" - Vidiu Platon

“我才不管它能不能在你的機器上運行捏!我們又不會給你提供機器!” —— 韋都·柏拉圖

0x00 大綱

目錄

0x01 前言

隨著微服務架構風格的推廣應用,開發人員的本地開發和調試成本大大提高,甚至不堪重負。動不動就要依賴一攬子東西,註冊中心、Redis、MQ、基礎服務ABC……等等。

開發人員如果手工在本地啟停多個基礎服務和中間件,將會浪費大量時間,降低開發效率。

0x02 大公司的解決方案

DockerKubernetes,不缺錢也不缺人的首選。什麼雙活、負載均衡統統來個四五套,把寒氣也傳給運維人員。

0x03 小作坊的解決方案

為了節約成本,當然是要在本地啟動一整套系統節點啦,畢竟記憶體成本比人力成本低得多。但是手工啟停太浪費時間了,這樣會導致本來就不多的摸魚時間所剩無幾。人生苦短,我用腳本。

確定了方案,我就開始著手編排了,以一個Zookeeper + Redis(一主二從三哨兵)的啟停腳本為目標,配置過程就略過了,著重解決啟停的問題。

試作一號

啟動腳本

@echo off
color 5f
title fake-docker
echo ^>^>^>^>^>^>^>^>bootstrapping redis...
start "redis-master" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.master-1.conf"
start "redis-slaver-1" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.slaver-1.conf"
start "redis-slaver-2" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.slaver-2.conf"
start "redis-sentinel-1" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.sentinel-1.conf" --sentinel
start "redis-sentinel-2" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.sentinel-2.conf" --sentinel
start "redis-sentinel-3" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.sentinel-3.conf" --sentinel
echo ^>^>^>^>^>^>^>^>done!
echo ^>^>^>^>^>^>^>^>bootstrapping zookeeper...
start "zookeeper-dev" "c:\dev\apache-zookeeper-3.6.3-bin\bin\zkServer.cmd"
echo ^>^>^>^>^>^>^>^>system is hot!

停止腳本

@echo off
color 5f
echo ^>^>^>^>^>^>^>^>shutdowning...
taskkill /t /f /fi "imagename eq redis-server.exe" >nul
taskkill /t /f /fi "windowtitle eq zookeeper-dev" >nul
echo ^>^>^>^>^>^>^>^>system is down!
pause>nul

第一個版本,解決了啟動和停止的問題,但是是手動檔的,重啟中間件的話要執行兩個腳本。待改進的問題有兩個:

  • 重啟不方便,儘量做到一鍵啟停
  • 彈出視窗太多,體驗不佳

第一個問題容易解決,先停後起,先執行停止指令,再把應用拉起來。

第二個問題有點麻煩,一開始想嘗試無視窗啟動,反覆嘗試未果,後來採用了折中方案,在CMDstart命令幫助中有如下描述:

C:\Users\Master>help start

啟動一個單獨的視窗以運行指定的程式或命令。

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/NODE ] [/AFFINITY ] [/WAIT] [/B]
[command/program] [parameters]

"title"     在視窗標題欄中顯示的標題。
path        啟動目錄。
B           啟動應用程式,但不創建新視窗。
            應用程式已忽略 ^C 處理。除非應用程式
            啟用 ^C 處理,否則 ^Break 是唯一可以中斷
            該應用程式的方式。
I           新的環境將是傳遞
            給 cmd.exe 的原始環境,而不是當前環境。
MIN         以最小化方式啟動視窗。
MAX         以最大化方式啟動視窗。
SEPARATE    在單獨的記憶體空間中啟動 16 位 Windows 程式。
SHARED      在共用記憶體空間中啟動 16 位 Windows 程式。
LOW         在 IDLE 優先順序類中啟動應用程式。
NORMAL      在 NORMAL 優先順序類中啟動應用程式。
HIGH        在 HIGH 優先順序類中啟動應用程式。
REALTIME    在 REALTIME 優先順序類中啟動應用程式。
ABOVENORMAL 在 ABOVENORMAL 優先順序類中啟動應用程式。
BELOWNORMAL 在 BELOWNORMAL 優先順序類中啟動應用程式。
NODE        將首選非一致性記憶體結構(NUMA)節點指定為
            十進位整數。
AFFINITY    將處理器關聯掩碼指定為十六進位數字。

根據描述,如果start時帶上/b參數,就能讓多個程式在一個視窗中寄宿。修改後得到最終版本:

最終版本

@echo off
color 5f
title %date%
echo ^>^>^>^>^>^>^>^>cleaning up context...
echo ^>^>^>^>^>^>^>^>killing previous runner...
taskkill /t /f /fi "imagename eq redis-server.exe" >nul
taskkill /t /f /fi "windowtitle eq fake-docker*" >nul
timeout /t 3 /nobreak >nul
rd /s /q "c:\tmp\zookeeper">nul
echo ^>^>^>^>^>^>^>^>clean up context done!
title fake-docker
echo ^>^>^>^>^>^>^>^>bootstrapping redis...
start /b "redis-master" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.master-1.conf"
start /b "redis-slaver-1" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.slaver-1.conf"
start /b "redis-slaver-2" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.slaver-2.conf"
start /b "redis-sentinel-1" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.sentinel-1.conf" --sentinel
start /b "redis-sentinel-2" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.sentinel-2.conf" --sentinel
start /b "redis-sentinel-3" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.sentinel-3.conf" --sentinel
echo ^>^>^>^>^>^>^>^>done!
echo ^>^>^>^>^>^>^>^>bootstrapping zookeeper...
start /b "zookeeper-dev" "c:\dev\apache-zookeeper-3.6.3-bin\bin\zkServer.cmd"
echo ^>^>^>^>^>^>^>^>system is hot!

最終版本,實現了一鍵啟停,只會產生一個命令行視窗,屬於能用的範疇了。在此基礎上,可以根據項目情況,自行添加其他中間件或基礎服務的啟停命令。

0x04 小結

分散式應用調試和部署不可避免會面臨幾個問題:

應用啟停困難

通常由於架構的原因,為了調試某個中間節點或上游應用的功能,需要把相關的應用都啟動起來,如果手工啟停,無疑是痛苦的。

外部系統不穩定

如果不能把整個系統都在本地啟動起來,那麼本地就會有一部分服務依賴於外部公共環境,它們通常不止一個人甚至不止一個團隊在用。 一旦外部服務不可用,就會影響到本地的開發和測試。

因此準備一個微型本地開發環境是有必要的,至少在開發和調試階段。況且如果最困難的啟停問題被解決了,何樂不為呢?


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在編寫程式的時候,如果想要**改變(重新賦值)**函數外部的變數,並且這個變數會作用於許多函數中,就需要告訴 Python 程式這個變數的作用域是全局變數,global 語句可以實現定義全局變數的作用。 ...
  • 什麼是shell? 目前的電腦操作系統都採用了某型形式的用戶界面,藉此指定系統需要操作系統的命令。但是在很多操作系統中,命令行界面是內嵌的,是人與電腦交互的唯一方式。操作系統的命令行頁面就是為了執行您的命令。 shell是一個程式,它的工作就是為了用戶執行其他程式,即系統中允許用戶輸入命令的部分 ...
  • 該篇的IO模型主要針對的是網路IO的,其他IO不在本篇考慮範圍之內! IO模型簡介 Stevens在文章中一共比較了五種IO Model,分別為: * blocking IO 阻塞IO * nonblocking IO 非阻塞IO * IO multiplexing IO多路復用 * signal ...
  • 底層數據結構:動態開闢的數組,每次以原始空間2倍擴容 vector vec; 增加 vec.push_back(100);容器末尾加元素 時間負責度O(1) 可能導致容器擴容 容器中的,對象的構造析構,記憶體的開闢釋放,通過什麼來實現? 容器的空間配置器allocator allocate deall ...
  • 1、什麼是進程、線程、併發、並行 一、進程線程 1、進程 程式由指令和數據組成,但這些指令要運行,數據要讀寫,就必須將指令載入至CPU,數據載入至記憶體。在指令運行過程中還需要用到磁碟、網路等設備。進程就是用來載入指令、管理記憶體、管理IO的當一個程式被運行,從磁碟載入這個程式的代碼至記憶體,這時就開啟了 ...
  • 前言 本文給大家分享的是如何通過利用Python製作藝術簽名生成器,廢話不多直接開整~ 開發工具 Python版本: 3.6 相關模塊: requests模塊 PIL模塊 PyQt5模塊 環境搭建 安裝Python並添加到環境變數,pip安裝需要的相關模塊即可。 文中實戰教程,評論留言獲取。 思路分 ...
  • unique_lock condition_variable 1:lock_guard 和 unique_lock 2:condition_variable wait 和 notify_all 方式1 std::mutex mtx; mtx.lock(); .. ... mtx.unlock();/ ...
  • 2022.12.12 記錄問題方便以後查看。 一、準備工作 1、本次使用jar包啟動後端,故而準備打包後的jar文件。註意修改配置文件中的路徑,根據需要部署的操作系統進行更改。 2、提前寫bat文件用來啟動jar包。 @echo off start "cmd標題名" java -Dfile.enco ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...