如何读取配置文件以在打包为WAR并部署在IBM Liberty的Angular App中设置API URL

时间:2019-06-28 09:24:32

标签: angular typescript docker deployment websphere-liberty

我已经运行ng build --prod,并将/dist文件夹的内容复制到动态Web项目的webapps文件夹中。

然后,我尝试将该项目导出为.war文件并将其部署在Liberty服务器上。面临的挑战是,我在environment.prod.ts中设置了API URL。

因此,如果我需要更改API URL,则需要重新运行ng build并复制/dist的内容,然后导出为.war

我尝试将API基本URL设置为window.location.origin,因为我们的Angular应用和微服务的基本URL相同。

我们想要的是改为使API URL可从外部配置。例如,我们已经创建了最终的.war文件,但是当将其作为容器部署到docker上时,我们会读取一些配置文件并将其设置为API URL。

3 个答案:

答案 0 :(得分:2)

由于使用的是Liberty,因此可以使用JAX-RS(JAX-RS here上的教程)创建一个端点,该端点从文件或环境变量中读取所需的基本URL(可以使用标准Java API或类似MicroProfile Config之类的东西),并将它们作为响应返回。将其打包为.war文件的一部分。

然后,在startup上,您的Angular应用程序可以向该终结点发出请求(您将始终知道该终结点的位置,因为它将是同一窗口。Angular应用程序本身来自哪里,只是一个不同的上下文根和/或路径。)这将为它提供工作所需的信息。

答案 1 :(得分:0)

1)您可以拥有用于配置的json文件,并将其添加到资产文件夹中,然后从代码中为api引用这些文件,因此您无需为这些文件进行重建,只需替换资产中的内容文件即可解决的盒子。

2)您还可以使用动态导入,但是在这种情况下,您将需要具有自定义的build-pack来处理文件。

答案 2 :(得分:0)

第一个解决方案:

您可以将ng构建,war文件创建和部署包括在同一Dockerfile中,因此可以在ng构建步骤之前直接设置API_URL。但这会使您每次更改API_URL时都重新构建一个容器(据我了解,这是您每次重新部署战争时所做的事情)。

第二个解决方案:

因此,我将为第一个解决方案做一些假设。

根据您所说的,我假设您正在开发微服务架构。我还将假设您所有的微服务都通过一个端点(即API网关)公开。

一种可能的解决方案是通过您的API网关公开一个固定端点,Angular App将使用该端点获取API_URL(例如:/ api / url)。这样可以解决所有问题,因为您可以使端点(/ api / url)返回所需的内容。

您可以进行设置,使其返回从配置存储/微服务中获取的url,您可以在任何给定时间轻松对其进行修改。

我唯一看到的缺点是您将依赖该URL来使您的应用正常工作。这使其成为单点故障。虽然您可以使用一些后备api绕过此操作,以防/ api / url端点不起作用。