我正在开发一个小团队的Web应用程序,经过研究和研究,我们发现分离后端和前端项目是一个很好的做法。因此,我们将使用hapijs和mysql数据库开发后端作为REST API,使用angularjs开发前端。
但是在生产环境中,它们必须位于同一台服务器上,对吧?如果它们位于不同的存储库中,我们如何将它们部署到同一服务器?
我们是一个相当新的团队,开始我们在网络开发方面的冒险经历,所以我们正在研究很多事情来做正确的事。
我们的技术堆栈将是:
我们将使用microsoft azure来托管我们的网络应用程序。
感谢您的回答和帮助。
答案 0 :(得分:6)
他们不必在同一台服务器上。将后端放在不同的服务器上是完全没问题的,如果你需要扩展你的后端/前端而不是另一个,那么它也很方便。
有几种可能性:
您可以使用RabbitMQ之类的消息代理在两个微服务之间进行通信
您的前端应用可能会暴露您后端的网址,并且您在AJAX请求中使用该网址,这需要您的后端启用CORS。不是这种方法的粉丝。
在前端使用相对网址,然后将具有特定模式(如/ api / *)的请求通过管道传递到后端。您的AngularJs应用程序是由Node.js服务器提供的,还是Hapi.js服务器? 如果Node.js类似于
app.all(['/api/*', '/fe/*'], function(req, res) {
console.log('[' + req.method + ']: ' + PROXY + req.url);
req.pipe(request({
url: PROXY + req.url,
method: req.method,
body: req.body,
rejectUnauthorized: false,
withCredentials: true
}))
.on('error', function(e) {
res.status(500).send(e);
})
.pipe(res);
});
PROXY_URL
是后端服务器的url / ip。
Haven没有在hapi.js中完成它,但它也应该是可能的。
我确定有更多选择,那些是我熟悉的选项。
答案 1 :(得分:0)
正如你们现在开始的那样,我认为你可以通过使用hapi创建两个服务器实例来解决这个问题。这解决了您只需要生产一台服务器的要求:
const server = new Hapi.Server();
server.connection({ port: 80, labels: 'front-end' });
server.connection({ port: 8080, labels: 'api' });
这很容易实现,但它有一个缺点:每当您推出更新时,您需要接受客户端和服务器应用程序的停机时间。
您可以在此信息中找到更多信息:https://futurestud.io/blog/hapi-how-to-run-separate-frontend-and-backend-servers-within-one-project
关于部署,无论你用什么构建版本(持续集成工具,手动脚本等)都可以将git推送到azure:https://azure.microsoft.com/en-us/documentation/articles/web-sites-publish-source-control。例如,手动脚本将从两个单独的存储库(前端和后端)获取代码,复制相关文件,更新配置值并将最终结果推送到git。