所以,让它正常工作真是让人头痛。但它能够工作。嗯,有点勉强。
首先,在Linux上可靠的服务仍处于预览阶段:https://github.com/Microsoft/service-fabric/issues/71
全面支持Linux应该很快就会到来(根据之前的链接,实际上它已经可以使用了...)。
现在关于如何进行的详细信息,这里有一些信息来帮助其他人,因为Microsoft文档中没有任何关于此的内容,我花费了整整3天才设法让它工作。
1. 使用.NET Core 2.0进行项目开发。
它支持Linux。目前仍处于预览阶段,但它可以工作。
2. 对于您的项目,请使用正确的RID。
截至今天(2018年4月),使用的正确RID是ubuntu.16.04-x64
。
编辑您的可靠服务项目的csproj
文件,并设置RID如下:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<IsServiceFabricServiceProject>True</IsServiceFabricServiceProject>
<RuntimeIdentifier>ubuntu.16.04-x64</RuntimeIdentifier>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
有趣的是,你应该能够使用RuntimeIdentifiers
参数(以S结尾)提供多个RID,就像这样:
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<IsServiceFabricServiceProject>True</IsServiceFabricServiceProject>
<RuntimeIdentifiers>win7x64;ubuntu.16.04-x64</RuntimeIdentifiers>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
所以你可以同时构建Windows二进制文件和Linux二进制文件。
但是
它根本不起作用。当我从Visual Studio构建项目时,最终只得到以下目录:
bin/Debug/netcoreapp2.0/
只有DLL文件,没有有效的入口点。没有win7-x64
文件夹,没有ubuntu.16.04-x64
,什么也没有。
这是一个错误,应该已经修复,但并没有(我使用最新的Visual Studio 15.6.2)。请参见https://github.com/dotnet/core/issues/1039。
3. 您需要为您的服务提供有效的入口点。
在Windows上,它是一个可执行文件(*.exe)。在Linux上不是。最终,我得到了Linux C#示例,并复制/粘贴了入口点。 https://learn.microsoft.com/en-us/azure/service-fabric/service-fabric-create-your-first-linux-application-with-csharp
因此,基本上我现在在每个可靠服务的ServiceManifest.xml
文件中都有以下EntryPoint
:
<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="XXXX"
Version="1.0.0"
xmlns="http://schemas.microsoft.com/2011/01/fabric"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ServiceTypes>
<StatefulServiceType ServiceTypeName="YYY" HasPersistedState="true" />
</ServiceTypes>
<CodePackage Name="Code" Version="1.0.0">
<EntryPoint>
<ExeHost>
<Program>entryPoint.sh</Program>
</ExeHost>
</EntryPoint>
</CodePackage>
entryPoint.sh
的内容如下:
#!/usr/bin/env bash
check_errs()
{
if [ "${1}" -ne "0" ]; then
exit ${1}
fi
}
DIR=`dirname $0`
echo 0x3f > /proc/self/coredump_filter
source $DIR/dotnet-include.sh
dotnet $DIR/NAME_OF_YOUR_SERVICE_DLL.dll $@
check_errs $?
dotnet-include.sh
如下:
#!/bin/bash
. /etc/os-release
linuxDistrib=$ID
if [ $linuxDistrib = "rhel" ]; then
source scl_source enable rh-dotnet20
exitCode=$?
if [ $exitCode != 0 ]; then
echo "Failed: source scl_source enable rh-dotnet20 : ExitCode: $exitCode"
exit $exitCode
fi
fi
两者都在PackageRoot
文件夹中。我为两者指定了属性,使得Build Action
为"Content
",Copy to Output Directory
为"Copy always
"。
![enter image description here](https://istack.dev59.com/v4xSR.webp)
4. 不要使用MSBuild进行构建!!
是的,它也应该能够构建Linux软件包,或者至少看起来是这样的,因为当您右键单击项目并单击“构建”时,MSBuild能够生成以下文件:
![enter image description here](https://istack.dev59.com/H7zFE.webp)
不要相信操作的表面成功,当部署时,它将惨败于无法正确执行的问题,一些*.so文件丢失和其他问题。MSBuild非常有bug,并且在依赖方面表现不良。
例如,请参阅此错误报告:
https://github.com/dotnet/sdk/issues/1502
一个多月过去了,仍未解决...
或者
https://github.com/dotnet/core/issues/977(我也遇到了这个问题)。
5. 请编写一些PowerShell脚本来自己构建东西。
最终,我使用以下脚本重新发明了轮子以构建我的软件包:
cd DIRECTORY_OF_MY_SERVICE_1
dotnet publish -c Release -r ubuntu.16.04-x64
cd ..\DIRECTORY_OF_MY_SERVICE_2
dotnet publish -c Release -r ubuntu.16.04-x64
cd ..\DIRECTORY_OF_MY_SERVICE_3
dotnet publish -c Release -r ubuntu.16.04-x64
cd ..
mkdir PKG\ServiceFabricApplication
echo F|xcopy "ServiceFabricApplication\ApplicationPackageRoot\ApplicationManifest.xml" "PKG\ServiceFabricApplication\ApplicationManifest.xml" /sy
mkdir "PKG\ServiceFabricApplication\Service1Pkg"
mkdir "PKG\ServiceFabricApplication\Service1Pkg\Code"
xcopy "Service1\PackageRoot\*" "PKG\ServiceFabricApplication\Service1Pkg" /sy /D
xcopy "Service1\bin\Release\netcoreapp2.0\ubuntu.16.04-x64\publish\*" "PKG\ServiceFabricApplication\Service1Pkg\Code" /sy
mkdir "PKG\ServiceFabricApplication\Service2Pkg"
mkdir "PKG\ServiceFabricApplication\Service2Pkg\Code"
xcopy "Service2\PackageRoot\*" "PKG\ServiceFabricApplication\Service2Pkg" /sy /D
xcopy "Service2\bin\Release\netcoreapp2.0\ubuntu.16.04-x64\publish\*" "PKG\ServiceFabricApplication\Service2Pkg\Code" /sy
mkdir "PKG\ServiceFabricApplication\Service3Pkg"
mkdir "PKG\ServiceFabricApplication\Service3Pkg\Code"
xcopy "Service3\PackageRoot\*" "PKG\ServiceFabricApplication\Service3Pkg" /sy /D
xcopy "Service3\bin\Release\netcoreapp2.0\ubuntu.16.04-x64\publish\*" "PKG\ServiceFabricApplication\Service3Pkg\Code" /sy
Write-host "Compressing package..."
Copy-ServiceFabricApplicationPackage -ApplicationPackagePath .\PKG\ServiceFabricApplication -CompressPackage -SkipCopy
sfproj
文件是与Visual Studio / MSBuild相关的项目,因此您需要自己构建所有内容。上面的脚本生成与使用Visual Studio构建sfproj
时MSBuild创建的pkg
文件夹相同的内容。它将所有内容复制到解决方案根目录下的PKG
文件夹中。
包结构在此处详细说明:https://github.com/MicrosoftDocs/azure-docs/blob/master/articles/service-fabric/service-fabric-package-apps.md
6.现在是部署的时候了!
此时我不再信任Visual Studio,因此我构建了自己的PowerShell脚本:
. .\ServiceFabricApplication\Scripts\Deploy-FabricApplication.ps1 -ApplicationPackagePath '.\PKG\ServiceFabricApplication' -PublishProfileFile '.\ServiceFabricApplication\PublishProfiles\Cloud.xml' -DeployOnly:$false -ApplicationParameter:@{} -UnregisterUnusedApplicationVersionsAfterUpgrade $false -OverrideUpgradeBehavior 'None' -OverwriteBehavior 'SameAppTypeAndVersion' -SkipPackageValidation:$false -ErrorAction Stop
它重复利用了 Service Fabric 项目模板中
sfproj
项目内提供的
Deploy-FabricApplication.ps1
脚本。该脚本解析
Cloud.xml
的
PublishProfile
并部署到您的服务群集。
因此,您需要在
PublishProfiles/Cloud.xml
和
ApplicationParameters/Cloud.xml
上分别指定正确的值,然后执行脚本。
当然,这只有在您安装了用于保护群集的证书时才有效。请注意,第一个点 '.' 很重要,因为如果您不使用它,则会遇到以下错误:
Get-ServiceFabricClusterManifest:群集连接实例为空
请参阅
https://dev59.com/S1oT5IYBdhLWcg3w2SUS#38104087
哦,由于 Service Fabric SDK 中也存在错误,您可能还想关闭本地 SF 群集……
https://github.com/Azure/service-fabric-issues/issues/821
7. 现在是时候进行另一个欺骗了。
它根本不起作用,服务在启动时崩溃。在 LinuxsyslogVer2v0
Azure 存储表中搜索数小时后(Linux 的日志表,位于自动创建的两个 Azure 存储帐户之一与 SF 集群),我发现 Microsoft 自己的 Nuget 包也存在问题。
具体来说,Nuget 包 Microsoft.Azure.Devices
在版本 1.6.0 上无法工作。出现了 dll 引用未找到或其他问题。我回滚到以前的版本,即 1.5.1,问题得以解决。
此时,我已经没有精力再为此创建另一个 Github 问题。抱歉 MS,我不是你们的 QA 团队,我感到疲惫不堪。
8. 使用第一个 PowerShell 脚本重新构建,使用第二个 PowerShell 脚本部署,完成。
您终于将 C# 可靠服务使用 .NET Core 2.0 从 Visual Studio(有点故障,我使用了 PowerShell)部署到 Linux SF 集群上。
现在我仍然有我的 ASP.NET Core 服务问题,但这将成为另一天的故事。
结论:简而言之
整个事情都很混乱。到处都是漏洞。在SDK、工具和一些Microsoft Nuget包中都有。非常糟糕的体验。但它得到了支持(目前是预览版),你可以让它工作。希望这篇文章能够帮助...