【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)
问题描述
如何在一个AppService下同时部署运行多个Java 应用程序呢?
问题解答
因为App Service的默认根目录为 wwwroot。如果需要运行多个Java 应用程序,需要在 wwwroot目录中创建独立文件夹,用于部署 Jar包 和 web.config 文件,特别注意的时:需要在web.config中指定jar包的启动指令。
如正常部署一个jar包,App Service 根目录下的文件结构如下:
web.config内容为:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
</handlers>
<httpPlatform processPath="%JAVA_HOME%\bin\java.exe"
arguments="-Djava.net.preferIPv4Stack=true -Dserver.port=%HTTP_PLATFORM_PORT% -jar "%HOME%\site\wwwroot\logdemo-1.0-SNAPSHOT.jar"">
</httpPlatform>
</system.webServer>
</configuration>
Spring Boot的代码为:
App.Java
package com.example;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
private static final Logger logger = LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
SpringApplication.run(App.class, args);
logger.info("test java logs : info");
logger.error("test java logs : error");
logger.warn("test java logs : warn");
logger.trace("test java logs : trace" );
}
}
HelloController.java
package com.example;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/")
String hello() {
return "Hello World!";
}
@RequestMapping("/newhello")
String hello2() {
return "Hello World,this is hello2 result!";
}
}
PS: 以上Spring Boot代码为Spring 框架默认生成的代码,只是添加了一个hello2的新接口用于测试。
使用 mvn clean package 打包为 logdemo-1.0-SNAPSHOT.jar文件,直接通过拖拽的方式,放入App Service wwwroot 目录中。 当文件上传完成后,直接访问App Service URL查看效果:
部署多个Spring Boot应用的办法
1: 在wwwroot目录下创建多个应用文件夹,如app1,app2,app3
2: 把对应的app jar包访问对应文件夹中,然后修改web.config中的路径, 如 %HOME%\site\wwwroot\app3\app.jar
- httpPlatformHandler 的名称在整个App Service中需要保持唯一,如app3的web.config中handlers的名称为:httpPlatformHandlerapp3
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpPlatformHandlerapp3" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
</handlers>
<httpPlatform processPath="%JAVA_HOME%\bin\java.exe"
arguments="-Djava.net.preferIPv4Stack=true -Dserver.port=%HTTP_PLATFORM_PORT% -jar "%HOME%\site\wwwroot\app3\app.jar"">
</httpPlatform>
</system.webServer>
</configuration>
3: 在 App Service的配置项中,进入"路径映射 Path Mapping",配置Virtual applications
- 虚拟路径为:/app1, /app2,/app3
- 物理路径为:site/wwwroot/app1, site/wwwroot/app2, site/wwwroot/app3
- 默认Type被勾选为 Directory,一定要去掉勾选。
4:多应用访问效果如下
5: 特别注意 -- 因为app1,app2,app3等应用的访问url为 host/app1等,所以在 Controller 代码中,RequestMapping的路径必须根据第三步中配置路径名相匹配
如/app3的 Request Mapping设置必须为:
@RequestMapping("/app3")
String hello() {
return "Hello World!";
}
@RequestMapping("/app3/newhello")
String hello2() {
return "Hello World,this is hello2 result!";
}
参考资料
快速入门:在 Azure 应用服务中创建 Java 应用: https://docs.azure.cn/zh-cn/app-service/quickstart-java?tabs=javase&pivots=platform-windows
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!