成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Dotnet創建Linux下的Service應用

系統 Linux
說到服務端應用,最常見的就是API服務。除此之外,還有一類應用,比方一個Socket的服務器。這類型的應用,本身沒有Web層,當然也不屬于API服務。

[[403140]]

本文轉載自微信公眾號「老王Plus」,作者老王Plus的老王 。轉載本文請聯系老王Plus公眾號。

前言

說到服務端應用,最常見的就是API服務。

除此之外,還有一類應用,比方一個Socket的服務器。這類型的應用,本身沒有Web層,當然也不屬于API服務。

通常大家會怎么做?

不講究的做法,就是做一個Console應用,加載到后臺一直跑著。

其實,還有另外一種做法,就是把應用加載到Services里,使應用以一個Service來做響應。這樣可以依托操作系統的Services管理器來進行統一管理,自動運行和故障處理。

Dotnet做Window Service的內容,網上有很多。我今天寫一個在Linux下做Service的方法。

創建Linux下的Service應用

創建一個LInux下的Service應用其實很簡單,就分這么幾步:

1. 用 Worker 模板創建工程

如果習慣用VS上創建,就找一下Worker Service模板。

我是習慣從命令行創建,就一條命令:

  1. % dotnet new worker -o projectname 

Dotnet會自動造成工程,并自動引用Microsoft.Extensions.Hosting包,因為這本身是一個Self-Hosting應用。

2. 加入Linux Service擴展包

其實這就是一個包:Microsoft.Extensions.Hosting.Systemd。這個包為應用提供了在Linux下使用Systemd守護進程的基礎配置。

還是命令行:

  1. % dotnet add package Microsoft.Extensions.Hosting.Systemd 

3. 修改Program.cs

其實就是一行代碼,把第二步引入的包加入應用。修改Program.cs

  1. public static IHostBuilder CreateHostBuilder(string[] args) => 
  2.     Host.CreateDefaultBuilder(args) 
  3.         .UseSystemd()  // 加入的就是這一行。 
  4.         .ConfigureServices((hostContext, services) => 
  5.         { 
  6.             services.AddHostedService<Worker>(); 
  7.         }); 

到這兒,套路性的工作已經完成。簡單吧?

我們來看一下現在的工程:

  1. ├── Program.cs 
  2. ├── Properties 
  3. │   └── launchSettings.json 
  4. ├── Worker.cs 
  5. ├── appsettings.Development.json 
  6. ├── appsettings.json 
  7. └── workerdemo.csproj 

大家會注意到,里面多了一個Worker.cs的類文件。

看一下這個文件:

  1. public class Worker : BackgroundService 
  2.     private readonly ILogger<Worker> _logger; 
  3.  
  4.     public Worker(ILogger<Worker> logger) 
  5.     { 
  6.         _logger = logger; 
  7.     } 
  8.  
  9.     protected override async Task ExecuteAsync(CancellationToken stoppingToken) 
  10.     { 
  11.         while (!stoppingToken.IsCancellationRequested) 
  12.         { 
  13.             _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); 
  14.             await Task.Delay(1000, stoppingToken); 
  15.         } 
  16.     } 

這其實就是加載到Systemd里的服務的模板。我們需要的服務代碼,需要加到ExecuteAsync(CancellationToken stoppingToken)方法中。

我簡單做個例子,在里面加入UDP服務,看代碼:

  1. public class Worker : BackgroundService 
  2.     private readonly ILogger<Worker> _logger; 
  3.     private readonly IConfiguration _configuration; 
  4.  
  5.     public Worker(ILogger<Worker> logger, IConfiguration configuration) 
  6.     { 
  7.         _logger = logger; 
  8.         _configuration = configuration; 
  9.     } 
  10.  
  11.     protected override async Task ExecuteAsync(CancellationToken stoppingToken) 
  12.     { 
  13.         _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); 
  14.  
  15.         UdpClient udpClient = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000)); 
  16.  
  17.         while (!stoppingToken.IsCancellationRequested) 
  18.         { 
  19.             UdpReceiveResult udpReceiveResult = await udpClient.ReceiveAsync(); 
  20.  
  21.             string message = Encoding.UTF8.GetString(udpReceiveResult.Buffer); 
  22.             Console.WriteLine($"{udpReceiveResult.RemoteEndPoint.ToString()} - {message}"); 
  23.  
  24.             await udpClient.SendAsync(Encoding.Default.GetBytes("Got"), 3, udpReceiveResult.RemoteEndPoint); 
  25.         } 
  26.     } 

這個代碼中,有兩件事需要注意:

  1. 在前邊Program.cs中加入UseSystemd()時,已經注入了IConfiguration。因此,可以在這個方法中直接引入并使用。換句話說,就是可以直接讀取例如appsetting.json的內容;
  2. 是上邊提到的,真正的服務響應在ExecuteAsync(CancellationToken stoppingToken)中。這兒沒什么特別的,就是正常的寫法。

上面這個,是服務端的程序,是響應。

下面我簡單做個客戶端的請求,供測試用。就不解釋了,只列出步驟:

創建一個工程

  1. % dotnet new console -o democlient 

修改Program.cs

  1. static async Task Main(string[] args) 
  2.     UdpClient udpClient = new UdpClient(); 
  3.  
  4.     for (int i = 0; i < 10000; i++) 
  5.     { 
  6.         byte[] buffer = new byte[8 * 1024]; 
  7.  
  8.         await Task.Run(() => 
  9.         { 
  10.             udpClient.SendAsync(buffer, buffer.Length, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000)); 
  11.         }); 
  12.  
  13.     } 
  14.     while (true
  15.     { 
  16.         UdpReceiveResult udpReceiveResult = await udpClient.ReceiveAsync(); 
  17.  
  18.         string message = Encoding.UTF8.GetString(udpReceiveResult.Buffer); 
  19.         Console.WriteLine($"{udpReceiveResult.RemoteEndPoint.ToString()} - {message}"); 
  20.     } 
  21.     Console.ReadKey(); 

運行一下,看看效果。

到這里,Service應用開發的工作已經完成。

下面是部署。

部署Service應用

Linux下面部署一個Service應用,只有兩個步驟:

1. 創建Service定義

Linux下的每個Service,都會有個定義文件。這個文件存在于/etc/systemd/system目錄下。

下面我給出一個簡單的Service模板:

  1. [Unit] 
  2. Description=DemoProject 
  3.  
  4. [Service] 
  5. Type=notify 
  6. ExecStart=dotnet /yourfolder/yourproject.dll 
  7.  
  8. [Install] 
  9. WantedBy=multi-user.target 

把這個內容保存為一個文件,例如叫demo.service。然后把這個文件復制到/etc/systemd/system下,并改為可執行。

簡單說一下這個文件的一些項:

  • Description,是服務的名字。不重要,啟動時,你用到的是文件名demo.service;
  • Type,服務類型,使用Dotnet加載時,只能是這種類型。如果把程序編譯為自包含程序,這個類型可以是simple;
  • ExecStart,啟動程序的命令,是全路徑的,要確保能找得到這個程序。上面例子中,dotnet /yourfolder/yourproject.dll,是因為dotnet命令是有PATH變量支持的。

這個文件的配置項有很多,包括定義是否需要自動重啟、重啟間隔等。如果需要,可以去這里查詢。

2. 啟動Service

有兩種方法。

第一種是刷新Service守護

  1. % systemctl daemon-reload 

刷新守護時,守護進程會去/etc/systemd/system目錄下,尋找新加入的Service文件,并啟動。

第二種是單獨啟動,有一系列命令:

啟動

  1. % systemctl start demo.service 

停止

  1. % systemctl stop demo.service 

重啟

  1. % systemctl restart demo.service 

查詢狀態

  1. % systemctl status demo.service 

嗯。這就是服務加載和停止了。

注意,這種方式加載的Service,是完全系統的服務,會沒有任何輸出。

如果需要調試,一種方式是加文件日志,另一種方式是用另一個命令啟動:

  1. % journalctl -u dnsserver.service 

當然,這種方式只用于調試。正式運行時,還應該是上面的方式。

 

責任編輯:武曉燕 來源: 老王Plus
相關推薦

2011-05-06 15:48:35

Service BroSQL Server

2020-09-16 23:04:32

Linux創建用戶主adduser

2021-10-10 13:37:36

DialectLinux開源翻譯

2018-01-04 16:08:13

Linux桌面啟動器.desktop文件

2009-08-14 15:02:24

Service模板C#創建

2009-07-22 10:18:20

緩存服務器

2010-08-27 09:14:32

DHCPdhcpd

2009-11-18 09:25:02

linux應用程序

2009-08-11 13:27:22

C#創建Web Ser

2009-09-18 13:17:05

2009-04-07 15:45:54

2011-05-06 15:37:10

Service BroSQL Server

2015-09-01 13:44:57

LinuxRAID 5

2021-03-03 08:13:57

模式垃圾回收

2009-12-08 17:16:37

WCF Web Ser

2021-12-29 07:44:50

Dotnet 代碼系統

2009-04-13 11:31:55

IBMdWWebService

2023-03-05 16:36:14

Linux鏈接目標文件

2021-06-29 10:50:40

Linux.NET命令

2021-03-10 07:20:44

數據定位匹配
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲高清在线 | 黄a免费看 | 精品综合 | 欧美一级小视频 | 99热在这里只有精品 | 羞羞在线观看视频 | 视频一区二区中文字幕日韩 | 中文字幕亚洲欧美 | 久久777| 日韩精品一区二区三区在线播放 | 国产视频一二三区 | 久久久免费少妇高潮毛片 | 国产2区 | 国产福利在线播放 | 国产精品久久久久久久粉嫩 | 亚洲日韩中文字幕 | 亚洲欧美成人 | 国产精品久久久久久久久久久久久 | 久久男人天堂 | 国产精品久久久久久吹潮日韩动画 | 免费毛片网站 | 国产精品极品美女在线观看免费 | 欧美国产精品一区二区 | 成人精品在线视频 | 亚洲国产精品视频一区 | 在线中文视频 | 男人天堂网址 | 国产精品国产精品国产专区不卡 | av超碰| 一区二区三区欧美 | 日韩无| 91视频网 | 在线观看免费av网 | 欧美日韩在线成人 | 日日夜夜精品视频 | 精品中文字幕一区二区 | 国产精品激情 | 黄色国产区| 巨大荫蒂视频欧美另类大 | 日本精品久久久久久久 | 波多野结衣一区二区 |