成人免费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-07-22 10:18:20

緩存服務器

2009-08-14 15:02:24

Service模板C#創建

2010-08-27 09:14:32

DHCPdhcpd

2009-11-18 09:25:02

linux應用程序

2011-05-06 15:37:10

Service BroSQL Server

2009-04-07 15:45:54

2009-09-18 13:17:05

2009-08-11 13:27:22

C#創建Web Ser

2015-09-01 13:44:57

LinuxRAID 5

2023-03-05 16:36:14

Linux鏈接目標文件

2009-12-08 17:16:37

WCF Web Ser

2021-03-03 08:13:57

模式垃圾回收

2009-04-13 11:31:55

IBMdWWebService

2021-12-29 07:44:50

Dotnet 代碼系統

2021-06-29 10:50:40

Linux.NET命令

2021-03-10 07:20:44

數據定位匹配
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久99蜜桃综合影院免费观看 | 激情久久网 | 精品粉嫩超白一线天av | 啪啪网页| 日韩精品一区二区三区 | 久久久精| 亚洲激情一区二区三区 | 日韩欧美在线观看 | 亚洲一区二区三区视频免费观看 | 国产精品美女久久久久aⅴ国产馆 | 国产精品久久一区二区三区 | 91国内精精品久久久久久婷婷 | 犬夜叉在线观看 | 国产精品久久久久久久久久久久 | 在线免费观看视频你懂的 | 国产精品国产成人国产三级 | 久久久久一区二区三区 | 日韩电影一区二区三区 | 久久精品青青大伊人av | 伊人91在线 | 成人在线精品视频 | 日韩天堂av | 精品福利在线 | 国产福利91精品 | 91久久精品国产91久久性色tv | 欧美精品一区二区在线观看 | 黄视频网站免费观看 | 麻豆一区二区三区 | 久草在线免费资源 | 有码一区 | 伊人一区 | 欧美日韩在线精品 | 在线成人精品视频 | 国产精品欧美一区二区三区不卡 | 欧美区在线 | 国产精品96久久久久久 | 亚洲一区在线播放 | 色婷综合网 | 久久久久久国产精品久久 | 91不卡| 亚洲欧美精品国产一级在线 |