我想知道是否有人可以向我指出一篇关于编写 Spring 应用程序的好教程或博客文章,该应用程序可以在单个进程中运行以进行本地集成测试,但在部署时会将不同的子系统部署到 heroku 上的不同进程/dynos 中。
例如,我的 Web 应用程序中有用户管理、作业处理等服务。我想将它作为本地 Web 应用程序运行。但是,当我部署到 Heroku 时,我只想将无状态 Web 前端部署到两个测功机,然后让我可以选择不同的服务来运行工作测功机。我可能决定将其中 2 个服务分组到一个进程中,或者决定每个服务都应该在自己的进程中运行。显然,当服务在自己的进程中运行时,它们需要透明地添加某种传输,如 REST、RabbitMQ 或 AKKA 等。
有没有关于从哪里开始学习如何做到这一点的指示?或者我是否错误地思考了这个问题,而您想建议一种不同的方法?我需要弄清楚如何设置应用程序以及如何构建 maven 和 intellij 来实现此目的。
谢谢。
最佳答案
我无法向您指出预制的文章或帖子,但我可以分享我开始解决类似问题的方向。本质上,所提出的方法与您的方法类似 - 将具有可能长时间运行逻辑的特定服务放入工作动态中,并通过 RedisToGo 实例(Heroku 附加组件)上的 Jesque(Resque 的 Java 端口)传递消息。我从未完全解决单独的 Web 与 Worker Spring 上下文(转移到其他优先事项),但其要点是 1) Web 层应用程序上下文将配置为发布消息,2) Worker 应用程序上下文配置为使用。
也就是说,我在本地使用 foreman
来模拟 Heroku 环境来调试缩放(foreman start --formation="web=2"
+ Apache mod_proxy_http
)。当您扩展到 2 个以上 dyno 时,Spring 会遇到大问题 - 确保在使用 webapp-runner
时使用 Redis 或 Memcache 进行 session 存储。 Spring 默认使用 HttpSession 来存储安全上下文...没有 session 关联或 native Tomcat session 复制。
最后的警告 - 在我们的例子中,我们的工作进程不需要反射(reflect)给最终用户。也就是说,我们将 Pusher 用于其他功能(也是 Heroku 插件)。如果您需要在异步任务完成时更新用户,我建议您查看它。
关于java - 在 Heroku 上扩展 Spring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16376129/