作者:JadePeng
連結:http://www.cnblogs.com/xiaoqi/p/donet-core-docker-microservice.html
.NET Core釋出很久了,因為近幾年主要使用java,所以還沒使用過.NET Core,今天正好有一個C#寫的demo,需要做成服務,不想再轉成java來實現,考慮使用.NET Core來嘗下鮮,標的是開發一個微服務,然後部署到Docker swarm叢集,供其他應用呼叫。
環境準備
下載.NET core的最新版本2.1.3,安裝後開啟命令列驗證:
出現下麵的輸出,就代表安裝成功了
dotnet
Usage: dotnet [options]
Usage: dotnet [path-to-application]
Options:
-h|--help Display help.
--info Display .NET Core information.
--list-sdks Display the installed SDKs.
--list-runtimes Display the installed runtimes.
path-to-application:
The path to an application .dll file to execute.
然後是VS CODE安裝c#外掛,
以及安裝nuget外掛,方便管理擴充套件。
建立工程
使用dotnet new name建立專案,其中name是專案型別,具體如下:
C:Usersjqpeng>dotnet new --help
使用情況: new [選項]
選項:
-h, --help 顯示有關此命令的幫助。
-l, --list 列出包含指定名稱的模板。如果未指定名稱,請列出所有模板。
-n, --name 正在建立輸出的名稱。如果未指定任何名稱,將使用當前目錄的名稱。
-o, --output 要放置生成的輸出的位置。
-i, --install 安裝源或模板包。
-u, --uninstall 解除安裝一個源或模板包。
--nuget-source 指定在安裝期間要使用的 NuGet 源。
--type 基於可用的型別篩選模板。預定義的值為 "project"、"item" 或 "other"。
--force 強制生成內容,即使該內容會更改現有檔案。
-lang, --language 根據語言篩選模板,並指定要建立的模板的語言。
模板 短名稱 語言 標記
----------------------------------------------------------------------------------------------------------------------------
Console Application console [C#], F#, VB Common/Console
Class library classlib [C#], F#, VB Common/Library
Unit Test Project mstest [C#], F#, VB Test/MSTest
NUnit 3 Test Project nunit [C#], F#, VB Test/NUnit
NUnit 3 Test Item nunit-test [C#], F#, VB Test/NUnit
xUnit Test Project xunit [C#], F#, VB Test/xUnit
Razor Page page [C#] Web/ASP.NET
MVC ViewImports viewimports [C#] Web/ASP.NET
MVC ViewStart viewstart [C#] Web/ASP.NET
ASP.NET Core Empty web [C#], F# Web/Empty
ASP.NET Core Web App (Model-View-Controller) mvc [C#], F# Web/MVC
ASP.NET Core Web App razor [C#] Web/MVC/Razor Pages
ASP.NET Core with Angular angular [C#] Web/MVC/SPA
ASP.NET Core with React.js react [C#] Web/MVC/SPA
ASP.NET Core with React.js and Redux reactredux [C#] Web/MVC/SPA
Razor Class Library razorclasslib [C#] Web/Razor/Library/Razor Class Library
ASP.NET Core Web API webapi [C#], F# Web/WebAPI
global.json file globaljson Config
NuGet Config nugetconfig Config
Web Config webconfig Config
Solution File sln Solution
Examples:
dotnet new mvc --auth Individual
dotnet new classlib --framework netcoreapp2.1
dotnet new --help
開發微服務,可以dotnet new mvc,建立一個mvc專案,然後VS CODE開啟即可。
工程實現
實現就簡單了,按部就班coding就可以,和幾年前的.NET MVC沒有本質區別:
新建一個APIController,新增一個方法:
public JsonResult Search(string tfsid)
{
try
{
return Json(new { success = true, data = PailitaoApi.SearchByTFSId(tfsid) });
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return Json(new { success = false, data = "Search failed!" }); ;
}
}
然後刪掉預設的模板檔案,將HomeControler裡的程式碼清理掉,保留Index,減小包體積
public string Index()
{
return "api";
}
主要程式碼OK!
Docker 映象編譯
按照官方指南,我們編寫Dockefile,主要是透過microsoft/dotnet:2.1-sdk AS build實現編譯,透過microsoft/dotnet:2.1-aspnetcore-runtime來執行,具體見下麵,註意pailitao.dll需要修改成你專案的名稱:
FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /app
# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# copy everything else and build app
COPY . ./
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime
WORKDIR /app
COPY --from=build /app/out ./
EXPOSE 80
ENTRYPOINT ["dotnet", "appname.dll"]
簡單分析:
-
build時,先dotnet restore
-
透過dotnet publish -c Release -o out 編譯release版本dll
-
然後構建runtime,從build環境將out 目錄複製出來
-
然後EXPOSE 80埠,設定ENTRYPOINT 為‘dotnet appname.dll’
微服務CICD
首先是構建,先將程式碼放入SVN, 在Jenkins裡新建自由樣式專案,Build裡使用Build/publish Docker Image:
然後部署,構建好image後,透過shell執行部署:
docker service rm pailitaoservice
docker service create –name pailitaoservice –replicas 1 –publish 15001:80 192.168.86.8:5000/pailitaoservice
最後,測試下服務:
搞定收工!
●編號244,輸入編號直達本文
●輸入m獲取文章目錄
資料庫開發
更多推薦《25個技術類微信公眾號》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。