Развертывание Java Webapp в обозревателе фабрики Azure Service

У нас есть Java-приложение без состояния, которое я хочу развернуть в структуре Azure. Я установил Fabric SDK и инструменты Visual Studio в соответствии с документацией.

После этого я создал шаблон "Гостевая исполняемая" приложения Service Fabric, и моя структура проекта выглядит следующим образом:

Я выполнил шаги, похожие на документацию, как в https://azure.microsoft.com/en-us/documentation/articles/service-fabric-deploy-existing-app/

Мой ServiceManifest.xml находится ниже:

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="Guest1Pkg"
                 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>
    <StatelessServiceType ServiceTypeName="Guest1Type" UseImplicitHost="true" />
  </ServiceTypes>
  <CodePackage Name="Code" Version="1.0.0">
    <EntryPoint>
      <ExeHost>
        <Program>HelloWorld.war</Program>
        <Arguments></Arguments>
        <WorkingFolder>CodePackage</WorkingFolder>
      </ExeHost>
    </EntryPoint>
  </CodePackage>
  <ConfigPackage Name="Config" Version="1.0.0" />
  <Resources>
    <Endpoints>
      <Endpoint Name="JavaAppTypeEndpoint" Protocol="http" Port="8080" Type="Input" />
    </Endpoints>
  </Resources>
</ServiceManifest>

Мой фрагмент ApplicationManifest.xml находится ниже:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest ApplicationTypeName="Application1Type"
                     ApplicationTypeVersion="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">
  <Parameters>
    <Parameter Name="Guest1_InstanceCount" DefaultValue="-1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Guest1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="Guest1">
      <StatelessService ServiceTypeName="Guest1Type" InstanceCount="[Guest1_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
</ApplicationManifest>

Я развернул в Service Fabric Explorer на своем локальном компьютере, и шаги сборки и публикации выполняются без ошибок:

-------- Package: Project: Application1 succeeded, Time elapsed: 00:00:00.3530634 --------
2>Started executing script 'Deploy-FabricApplication.ps1'.
2>. 'C:\Users\samanoha\Documents\Visual Studio 2015\Projects\Application1\Application1\Scripts\Deploy-FabricApplication.ps1' -ApplicationPackagePath 'C:\Users\samanoha\Documents\Visual Studio 2015\Projects\Application1\Application1\pkg\Debug' -PublishProfileFile 'C:\Users\samanoha\Documents\Visual Studio 2015\Projects\Application1\Application1\PublishProfiles\Local.5Node.xml' -DeployOnly:$true -UnregisterUnusedApplicationVersionsAfterUpgrade $false -OverrideUpgradeBehavior 'None' -OverwriteBehavior 'Always' -SkipPackageValidation:$true -ErrorAction Stop
2>Copying application to image store...
2>Copy application package succeeded
2>Registering application type...
2>Register application type succeeded
2>Removing application package from image store...
2>Remove application package succeeded
2>Finished executing script 'Deploy-FabricApplication.ps1'.
2>Time elapsed: 00:00:01.9327912
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
========== Deploy: 1 succeeded, 0 failed, 0 skipped ==========

Started executing script 'Publish-NewServiceFabricApplication'.
[void](Connect-ServiceFabricCluster); Import-Module 'C:\Program Files\Microsoft SDKs\Service Fabric\Tools\PSModule\ServiceFabricSDK\ServiceFabricSDK.psm1'; Publish-NewServiceFabricApplication -ApplicationPackagePath 'C:\Users\samanoha\Documents\Visual Studio 2015\Projects\Application1\Application1\pkg\Debug' -ApplicationParameterFilePath 'C:\Users\samanoha\Documents\Visual Studio 2015\Projects\Application1\Application1\PublishProfiles\..\ApplicationParameters\Local.5Node.xml' -ApplicationParameter @{_WFDebugParams_='[]'} -Action Create -SkipPackageValidation:$true -ErrorAction Stop
Creating application...


ApplicationName        : fabric:/Application1
ApplicationTypeName    : Application1Type
ApplicationTypeVersion : 1.0.0
ApplicationParameters  : { "_WFDebugParams_" = "[]" }

Create application succeeded.


Finished executing script 'Publish-NewServiceFabricApplication'.
Time elapsed: 00:00:01.8691591
Started executing script 'Get-ServiceFabricApplicationStatus'.
[void](Connect-ServiceFabricCluster); Import-Module 'C:\Program Files\Microsoft SDKs\Service Fabric\Tools\PSModule\ServiceFabricSDK\ServiceFabricSDK.psm1'; Get-ServiceFabricApplicationStatus -ApplicationName 'fabric:/Application1' -ErrorAction Stop
The application has started.
Service Status:
fabric:/Application1/Guest1 is ready.

The application is ready.
Finished executing script 'Get-ServiceFabricApplicationStatus'.
Time elapsed: 00:00:01.0230548

Но состояние работоспособности приложения показывает ошибку, и событие

"Error event: SourceId='System.Hosting', Property='CodePackageActivation:Code:EntryPoint'.
There was an error during CodePackage activation."

Я понятия не имею, в чем может быть проблема при развертывании, нужно ли что-либо включать в точку входа службы приложений в дополнение к упомянутому выше.

Кроме того, веб-приложение Java при развертывании на автономном tomcat имеет следующий контекст http://localhost:8080/HelloWorld/hello. Если приложение развернуто в кластере Service Fabric, останется ли контекст URL для этого неизменным или это должно быть что-то вроде http://localhost:8080/Application1/Guest1/HelloWorld/hello из-за оболочки оболочки Azure?

4 ответа

Решение

Наконец, оказалось, что нам нужно отдельно установить Java на виртуальной машине хоста (виртуальная машина Azure или локальный рабочий стол), а затем мы должны сослаться на путь Java.

Так что мой сервисный манифест

<EntryPoint>
      <ExeHost>
        <Program>scripts\launchConfig.cmd</Program>
        <Arguments></Arguments>
        <WorkingFolder>CodePackage</WorkingFolder>
        <ConsoleRedirection FileRetentionCount="5" FileMaxSizeInKb="2048"/>
      </ExeHost>
</EntryPoint>

Я создал папку с именем scripts в папке Code, и файл сценария "launchConfig.cmd" имеет только одну строку, как показано ниже:

"C:\Program Files (x86)\Java\jre1.8.0_101\bin\java.exe" -jar HelloWorld.war

Возможно, нам понадобится удалить жесткие кодировки пути, но так оно и было указано в конце.

Как описано в предыдущем ответе, один из подходов заключается в отдельной установке Java на машины.

Я написал об альтернативном подходе на https://blog.vjrantal.net/2017/04/11/high-availability-java-hosting-in-azure-using-service-fabric/ который основан на упаковке требуемой среды выполнения Java в пакет приложения.

То, что вы помещаете в конфигурацию программы, должно быть исполняемым (.exe, .cmd и т. Д.). Service Fabric попытается выполнить все, что вы положили туда.

Например, в документе, с которым вы связаны, для запуска приложения node.js Программа называется node.exe, а Аргументы указывают на приложение:

<ExeHost>
  <Program>node.exe</Program>
  <Arguments>bin/www</Arguments>
  <WorkingFolder>CodePackage</WorkingFolder>
</ExeHost>

Точка входа должна быть командой. HelloWorld.war не является командой. Гостевой исполняемый файл предназначен для запуска команды или exe.

<SetupEntryPoint>
     <ExeHost>
         <Program>scripts\launchConfig.cmd</Program>
     </ExeHost>
  </SetupEntryPoint>

и launchConfig.cmd должен содержать скрипт для запуска Tomcat или jboss (или любого сервера приложений j2ee). Вы должны установить java, настроить tomcat/ jboss, развернуть HelloWorld.war и настроить порт перед запуском сервера.

Другие вопросы по тегам