39.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--擴展功能--調整發布腳本

這篇文章,我們要調整發布腳本。之所以要調整發布腳本,是因為現在我們的項目有三個環境:本地(Local)、開發(Development)、生產(Production)。

Tip:我們的項目雖然是實戰項目,但是對于測試部分并不會增加測試環境(Test),這是因為微服務的測試實戰內容很多,不是三四篇文章可以講完了,并且我們的實戰專欄核心是微服務應用的開發,所以我們不設置測試環境。

一、三個環境講解

設置三個環境的目的,是為了讓我們在不同的環境下,能夠有不同的配置文件。比如說,我們在本地開發的時候,可能會使用本地的數據庫,而在生產環境中,我們就需要使用生產環境的數據庫。在這一小節,我們來講解一下這三個環境的具體含義。

1.1 本地(Local)

本地環境是指我們在本地開發時使用的環境。在這個環境中,我們可以使用本地的數據庫、緩存等資源。通常情況下,本地環境的配置文件會包含詳細的調試信息,以便于我們在開發過程中進行調試,日志也會很詳細。

在本地環境下,開發者可以自由地修改代碼、重啟服務、調試功能,而不會影響到其他開發者或線上用戶。常見的做法是將數據庫連接指向本地的數據庫實例,緩存服務也可以部署在本地,甚至可以使用一些模擬服務來代替真實的第三方依賴。此外,本地環境通常會開啟詳細的日志記錄和錯誤提示,方便定位和解決問題。

本地環境的安全性和性能要求相對較低,主要關注開發效率和調試便利性。因此,某些生產環境下的安全策略和性能優化措施,在本地環境中可以不啟用。

1.2 開發(Development)

開發環境是指團隊在協作開發和聯調過程中使用的環境。在該環境下,項目會連接到專門的開發數據庫和緩存服務等,這些資源通常與生產環境隔離,便于多人協作和問題排查。開發環境的配置文件一般保留必要的調試信息,但日志級別和詳細程度會低于本地環境,以減少無關信息干擾。

在開發環境中,開發者可以進行前后端聯調、多模塊集成測試,以及服務端的自動化測試。該環境通常會盡量模擬生產環境的部署方式和依賴配置,以便提前發現集成和部署中的潛在問題。開發環境的數據庫和服務通常為團隊成員共享,便于協作開發,但訪問權限會受到一定限制,僅限開發人員使用。

開發環境對服務器性能和安全性的要求適中,主要關注功能完整性和調試便利性。與本地環境相比,開發環境更接近實際生產環境,但仍保留一定的靈活性,支持開發和測試工作。

1.3 生產(Production)

生產環境是最終用戶實際訪問和使用的環境。在該環境下,項目會連接到正式的生產數據庫、緩存等核心資源,這些資源經過嚴格的測試和驗證,確保數據安全和服務穩定。生產環境的配置文件會關閉調試信息,優化日志級別,以提升系統性能并保障敏感信息安全。

在生產環境中,服務的高可用性、性能和安全性是首要目標。所有代碼和配置的變更都必須經過完整的測試和審批流程,確保不會影響用戶體驗。日志記錄通常僅保留必要的信息,避免泄露敏感數據,同時減少對系統性能的影響。

生產環境的訪問權限嚴格受控,僅限授權人員操作。數據庫和服務實例與其他環境完全隔離,確保數據的完整性和安全。任何變更操作通常會選擇在業務低峰期進行,以最大程度降低對用戶的影響。

Tip:在我們的孢子記賬項目中,由于僅有一個臺服務器,因此開發環境和生產環境是共用的。我們會在發布腳本中根據不同的環境來選擇不同的配置文件。

二、調整發布腳本

在上一篇文章中,我們為每個微服務都創建Github Action工作流,但是這些工作流都是針對單一環境的。現在,我們要調整發布腳本,讓它能夠根據不同的環境來選擇不同的配置文件。我們以用戶配置服務(SP.ConfigService)為例,來講解如何調整發布腳本。

2.1 配置launchSettings.json

要配置本地環境,我們需要修改 launchSettings.json 文件。launchSettings.json 文件位于 ASP.NET Core 項目的 Properties 文件夾下,主要用于配置項目的啟動和調試參數。它允許為不同的啟動方式(如 IIS Express、本地運行、Docker 等)定義多個啟動配置(profile),并在每個配置中設置環境變量(如 ASPNETCORE_ENVIRONMENT)、端口號、命令行參數以及是否自動打開瀏覽器等選項。通過合理配置 launchSettings.json,可以方便地在本地開發環境下切換不同的運行模式,實現針對本地、開發或生產環境的調試和測試需求。Visual Studio 和 dotnet run 命令都會讀取該文件,從而為開發者提供靈活的本地啟動體驗。

由于我們在開發功能時是在各自的本地電腦上開發的,因此我們需要將 ASPNETCORE_ENVIRONMENT 環境變量設置為 Local。我們打開 SP.ConfigService 項目的 Properties/launchSettings.json 文件,找到 profiles 節點下的 SP.ConfigService 節點,然后將 ASPNETCORE_ENVIRONMENT 的值修改為 Local,修改后的內容如下所示:

{"$schema": "http://json.schemastore.org/launchsettings.json","iisSettings": {"windowsAuthentication": false,"anonymousAuthentication": true,"iisExpress": {"applicationUrl": "http://localhost:45810","sslPort": 44303}},"profiles": {"http": {"commandName": "Project","dotnetRunMessages": true,"launchBrowser": true,"launchUrl": "swagger","applicationUrl": "http://localhost:5116","environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Local"}},"https": {"commandName": "Project","dotnetRunMessages": true,"launchBrowser": true,"launchUrl": "swagger","applicationUrl": "https://localhost:7108;http://localhost:5116","environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Local"}}}
}

在上面的配置中,我們將 ASPNETCORE_ENVIRONMENT 的值修改為 Local,這樣我們在本地運行項目時,就會使用 appsettings.Local.json 配置文件。

2.2 創建appsettings.Local.json

接下來,我們創建 appsettings.Local.json 文件,并添加本地環境的配置內容,配置如下:

{"nacos": {"ServerAddresses": [ "http://14.103.224.141:8848" ],"Namespace": "a8f01c53-b0b2-4046-b0f8-850e24738b23","ServiceName": "SPConfigService","GroupName": "DEFAULT_GROUP","ClusterName": "DEFAULT","Username": "SP_ADMIN","Password": "123*asdasd","Weight": 100,"ConfigUseRpc": true,"NamingUseRpc": true,"RegisterEnabled": true,"InstanceEnabled": true,"Ephemeral": true,"GrpcReconnectInterval": 5000,"ConnectionTimeOut": 10000,"Listeners": [{"Optional": false,"DataId":"SP.ConfigService","Group":"DEFAULT_GROUP"},{"Optional": false,"DataId":"Common","Group":"DEFAULT_GROUP"}]}
}

在這個配置文件中,我們配置了 Nacos 的相關信息,這些信息是我們在本地開發時使用的,其中Namespace是我們在Nacos中創建的本地命名空間的ID。

Tip:同樣,我們也可以為開發環境創建 appsettings.Development.json 文件,為生產環境創建 appsettings.Production.json 文件,配置內容和上面的類似,只是 Namespace 的值不同,分別對應我們在Nacos中創建的開發命名空間和生產命名空間的ID。

2.2 修改Dockerfile配置

接著我們需要修改 Dockerfile 文件,使其能夠支持多環境部署。我們打開 SP.ConfigService 項目的 Dockerfile 文件,刪除原有的環境變量設置命令 ENV ASPNETCORE_ENVIRONMENT=Production,讓環境變量的設置交由外部傳遞。這樣做的好處是,ASPNETCORE_ENVIRONMENT 環境變量可以在容器啟動時通過命令行參數或 CI/CD 發布腳本動態指定。例如,在使用 docker run 啟動容器時,可以通過 -e 參數傳遞環境變量:

docker run -e ASPNETCORE_ENVIRONMENT=Development your-image-name

或者在 GitHub Actions、Jenkins 等自動化部署腳本中,根據不同的環境傳遞不同的環境變量值,實現靈活的多環境部署。最終,Dockerfile 文件無需硬編碼環境變量,環境的切換完全交由外部控制,便于后續擴展和維護。

Tip:不建議為每個環境單獨維護一份 Dockerfile,這樣會增加維護成本且容易出錯。通過外部傳遞環境變量的方式,可以讓同一個鏡像適配不同的環境配置,既簡化了鏡像管理,也提升了部署的靈活性。

2.3 修改Github Action 工作流

最后,我們需要修改 SP.ConfigService 項目的 GitHub Action 工作流文件,使其能夠根據不同的環境來選擇不同的配置文件。我們打開 deploy-config-service.yml 文件,我們需要新增workflow_dispatchSet deployment environment步驟,以及修改Deploy to Server步驟的docker 運行命令。以下是修改后的內容:

name: Deploy Config Serviceon:push:branches: [ Microservices ]paths:- 'SP.ConfigService/**'workflow_dispatch:jobs:deploy:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: Set up Docker Buildxuses: docker/setup-buildx-action@v2- name: Login to Docker Hubuses: docker/login-action@v2with:username: ${{ secrets.DOCKER_USERNAME }}password: ${{ secrets.DOCKER_PASSWORD }}- name: Build and push Docker imageuses: docker/build-push-action@v4with:context: .file: ./SP.ConfigService/Dockerfilepush: truetags: ${{ secrets.DOCKER_USERNAME }}/sp-config-service:latest- name: Set deployment environmentrun: |if [ "${{ github.event_name }}" == "push" ]; thenecho "ENVIRONMENT=Development" >> $GITHUB_ENVelseecho "ENVIRONMENT=Production" >> $GITHUB_ENVfi- name: Deploy to Serveruses: appleboy/ssh-action@masterwith:host: ${{ secrets.SERVER_HOST }}username: ${{ secrets.SERVER_USERNAME }}key: ${{ secrets.SERVER_SSH_KEY }}script: |docker pull ${{ secrets.DOCKER_USERNAME }}/sp-config-service:latestdocker stop sp-config-service || truedocker rm sp-config-service || truedocker run -d --name sp-config-service -p 5101:80 -e ASPNETCORE_ENVIRONMENT=${{ env.ENVIRONMENT }} ${{ secrets.DOCKER_USERNAME }}/sp-config-service:latest 

在上面的代碼中,我們新增了 workflow_dispatch 事件,這樣我們就可以手動觸發工作流,并選擇要部署的環境。同時,我們新增了 Set deployment environment 步驟,根據觸發事件來設置環境變量 ENVIRONMENT 的值。最后,在 Deploy to Server 步驟中,我們將 ASPNETCORE_ENVIRONMENT 環境變量的值設置為 ${{ env.ENVIRONMENT }},這樣就可以根據不同的環境來選擇不同的配置文件。

三、總結

通過以上的調整,我們實現了在不同環境下使用不同的配置文件。現在,當我們在本地開發時,使用的是 appsettings.Local.json 配置文件;當我們在開發環境部署時,使用的是 appsettings.Development.json 配置文件;當我們在生產環境部署時,使用的是 appsettings.Production.json 配置文件。這樣做的好處是,我們可以在不同的環境下使用不同的配置,避免了在同一個配置文件中混合不同環境的配置,從而減少了出錯的可能性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92680.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92680.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92680.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

商品、股指及ETF期權五檔盤口Tick級與分鐘級歷史行情數據多維解析

在金融數據分析領域,本地CSV文件是存儲高頻與低頻數據的常用載體。本文以期權市場數據為例,探討如何基于CSV格式處理分鐘級行情、高頻Tick數據、日頻數據、逐筆委托記錄、五檔訂單簿及歷史行情數據,并提供專業的技術實現方案。以下將從數據預…

云端軟件工程智能代理:任務委托與自動化實踐全解

云端軟件工程智能代理:任務委托與自動化實踐全解 背景與未來趨勢 隨著軟件工程復雜度不斷提升,開發者對自動化工具的依賴也日益增強。我們正進入一個“人機協作”的新時代,開發者可以專注于核心創新,將重復性、繁瑣的任務委托給智…

making stb style lib(1): do color print in console

col.h: see origin repo // origin repo: https://github.com/resyfer/libcol #ifndef _COL_HOL_H_ #define _COL_HOL_H_#include <stdlib.h> #include <stdio.h> #include <stdbool.h> #include <string.h> #include <math.h> // 新增&#xf…

llm本地部署+web訪問+交互

要實現基于llm的web訪問和交互&#xff0c;需支持對llm的訪問和對網絡搜索的調用。 這里使用ollama llm兼容openai sdk訪問&#xff1b;使用proxyless-llm-websearch模擬網絡搜索。 1 ollama本地部署 假設ollama已經部署&#xff0c;具體過程參考 在mac m1基于ollama運行dee…

自動駕駛數據閉環

自動駕駛的數據閉環是支撐算法持續迭代的核心機制&#xff0c;其本質是通過“數據采集-處理-訓練-部署-反饋”的循環&#xff0c;不斷優化模型對復雜場景的適應性。由于自動駕駛數據量極大&#xff08;單車日均TB級&#xff09;、場景多樣&#xff08;從常規道路到極端邊緣場景…

二十、MySQL-DQL-條件查詢

DQL-條件查詢代碼&#xff1a; DQL-條件查詢 -- 1.查詢 姓名 為 楊逍 的員工 select * from tb_emp where name 楊逍; -- 2.查詢 id小于等于5 的員工信息 select * from tb_emp where id < 5; -- 3.查詢 沒有分配職位 的員工信息 select * from tb_emp where job is null; …

Mac下安裝Conda虛擬環境管理器

Conda 是一個開源的包、環境管理器&#xff0c;可以用于在同一個機器上創建不同的虛擬環境&#xff0c;安裝不同Python 版本的軟件包及其依賴&#xff0c;并能夠在不同的虛擬環境之間切換 Conda常通過安裝Anaconda/Miniconda來進行使用。一般使用Miniconda就夠了。Miniconda 是…

Android 中解決 Button 按鈕背景色設置無效的問題

1、問題描述 在布局文件中有兩個 Button 按鈕&#xff0c;為每個按鈕設置不同的背景色&#xff0c;但是顯示出來的效果都是紫色的&#xff0c;跟設置的顏色不同&#xff0c;布局文件如下所示&#xff1a;<Buttonandroid:id"id/button_cancel"android:layout_width…

云服務器--阿里云OSS(2)【Springboot使用阿里云OSS】

&#x1f4d2; 阿里云 OSS Spring Boot 異步任務&#xff08;直接存 OSS&#xff09; 1. 項目結構 src/main/java/com/example/demo├── controller│ └── UploadController.java // 接收上傳請求├── service│ ├── AsyncUploadService.java // 異步上傳…

get請求中文字符參數亂碼問題

第一種方法 服務器默認的傳參編碼格式是ISO8859-1,所以前端直接原樣字符串請求&#xff0c;到后端解析一下就得到正確字符 String fileName request.getParameter("fileName"); fileName new String(fileName.getBytes("ISO8859-1"),"UTF-8");…

C語言(10)——結構體、聯合體、枚舉

關于C語言零基礎學習知識&#xff0c;小編有話說&#xff0c;各位看官敬請入下面的專欄世界&#xff1a;打怪升級之路——C語言之路_ankleless的博客-CSDN博客 Hi&#xff01;冒險者&#x1f60e;&#xff0c;歡迎闖入 C 語言的奇幻異世界&#x1f30c;&#xff01; 我是 Ankle…

海康威視攝像頭實時推流到阿里云公網服務器(Windows + FFmpeg + nginx-rtmp)

海康威視攝像頭實時推流到阿里云公網服務器&#xff08;Windows FFmpeg nginx-rtmp1. 步驟總覽2. 阿里云 ECS&#xff08;Linux&#xff09;配置2.1 開放端口2.2 安裝 nginx-rtmp3. Windows 電腦端配置3.1 安裝 FFmpeg3.1.1 官網/鏡像下載&#xff1a;3.1.2 解壓后將 bin 目錄…

基礎網絡網路層——IPV4地址

在IP網絡上&#xff0c;如果用戶要將一臺計算機連接到Internet上&#xff0c;就需要向因特網服務提供方ISP&#xff08;Internet Service Provider&#xff09;申請一個IP地址。IP地址是在計算機網絡中被用來唯一標識一臺設備的一組數字。IPv4地址由32位二進制數值組成&#xf…

技術速遞|GPT-5 正式上線 Azure AI Foundry

AI 應用正在經歷一場深刻變革——對企業來說&#xff0c;僅僅“能聊天”早已不夠&#xff0c;生成內容、邏輯推理、落地生產&#xff0c;這些才是新時代對 AI 能力的真正考驗。 今天&#xff0c;我們非常激動地宣布&#xff0c;OpenAI 最新旗艦大模型 GPT-5 正式上線 Azure AI …

Logistic Regression|邏輯回歸

----------------------------------------------------------------------------------------------- 這是我在我的網站中截取的文章&#xff0c;有更多的文章歡迎來訪問我自己的博客網站rn.berlinlian.cn&#xff0c;這里還有很多有關計算機的知識&#xff0c;歡迎進行留言或…

三極管在電路中的應用

1、信號放大&#xff08;電壓放大&#xff09; 應用場景 &#xff1a;麥克風聲音放大、耳機驅動、廣播信號接收等音頻設備 原理解析 &#xff1a; 想象三極管如同一個精準的水龍頭&#xff1a; 基極&#xff08;B&#xff09;電流如同擰動閥門的微弱力量&#xff08;輸入信號&a…

Redis 事務機制

文章目錄一、什么是事務&#xff1f;二、事務相關操作總體認識基本操作流程watch 操作演示watch 原理一、什么是事務&#xff1f; Redis 的事務和 MySQL 的事務概念上是類似的. 都是把?系列操作綁定成?組. 讓這?組能夠批量執?. Redis 的事務和 MySQL 事務的區別&#xff1…

Mybatis學習之自定義映射resultMap(七)

這里寫目錄標題一、準備工作1、新建maven工程2、準備兩張表3、建立mapper、pojo、映射文件mapper接口pojoxxxMapper.xml二、resultMap處理字段和屬性的映射關系1、用起別名的方式保證字段名與屬性名一致2、逐一設置resultMap映射關系3、配置mapUnderscoreToCamelCase三、多對一…

數學學習 | 高數、線代、概率論及數理統計薦書

注&#xff1a;本文為 “數學學習書目推薦” 相關合輯。 略作重排&#xff0c;如有內容異常&#xff0c;請看原文。 高等數學、線性代數及概率論與數理統計領域推薦書目 西湖邊的卡夫卡 編輯于 2023-09-19 13:26 7495 人贊同了該回答 數學具有內在的美學屬性&#xff0c;但并非…

【LLM實戰|langgraph】langgrpah基礎

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 langgraph 基礎 1. Chatbot實現 # !pip install langchain # !pip install langgraphfrom typing import Annotatedfrom typing_extensions import Typ…