【问题标题】:Spring Boot + Angular project structure and architecture [closed]Spring Boot + Angular 项目结构和架构 [关闭]
【发布时间】:2021-05-29 16:35:47
【问题描述】:

我正在构建一个由 Spring Boot 后端和 Angular 前端组成的应用程序。 以下项目结构有哪些优缺点?

要求:

  • maven 项目
  • spring security(登录+注册)->表格?基本的? jwt?
  • 角度前端
  • Spring Boot 后端

我想到了以下几种可能:

在同一台服务器上运行的 spring 项目中的 Angular

Angular 项目文件夹位于 spring boot 项目中。在构建 Spring Boot 应用程序时,将构建 Angular 项目并将其包含在静态文件夹中。

优点:

  • 只有一个可部署
  • 轻松使用spring security(表单登录+会话)
  • 单一代码库

缺点:

  • ui 高度依赖后端
  • 负载平衡可能更困难(我不确定)

Spring Boot + Angular 在一个项目和同一服务器中

Angular 应用程序和 Spring Boot 应用程序位于不同的文件夹中(可能是包含这 2 个 maven 模块的根项目)。在构建 spring 项目时,将构建 angular 项目并将其包含在它的目标文件夹中(例如:https://github.com/FraktonDevelopers/spring-boot-angular-maven-build

优点:

  • 只有一个可部署
  • 轻松使用spring security(表单登录+会话)
  • 单一代码库
  • 多模块maven项目

缺点:

  • ui 高度依赖后端
  • 负载平衡可能更困难(我不确定)

Spring Boot + Angular 在一个项目和不同的服务器中

Angular 项目文件夹与 Spring Boot 项目在同一个项目中(可能是一个根文件夹,其中有 ui 和后端项目作为单独的文件夹)。后端和ui在不同的服务器上运行(spring boot的jar/war中不包含angular)

优点:

  • 单一代码库
  • 将 ui 与后端分离 缺点:
  • 安全性要困难得多(您需要检查用户是否在前端手动登录并手动接收会话/jwt)

Spring Boot + Angular 在不同的项目和不同的服务器中

这两个项目完全分开(两个 git repos)并且没有共同的代码。它们部署在不同的服务器上。

优点:

  • 将 ui 与后端分离 缺点:
  • 安全性要困难得多(您需要检查用户是否在前端手动登录并手动接收会话/jwt)
  • 开发时要打开两个项目

哪种项目结构是“最佳实践”?还有其他选择吗?我错过了任何优点/缺点吗?

是否有任何示例项目/开源项目?我更喜欢生产就绪的架构/结构,最好包括弹簧安全性。

【问题讨论】:

    标签: angular spring spring-boot maven architecture


    【解决方案1】:

    安全

    “轻松使用spring security”可能没有你想象的那么简单。特别是,“表单登录和会话”部分不能开箱即用:

    当客户端发送没有有效(或过期)凭据的请求时,Spring Security 将拦截该请求,并使用登录表单进行响应。如果请求是浏览器中的页面导航,那很好,但如果无效请求到达 API 端点怎么办?发出 XMLHttpRequest 的 Angular 服务不知道如何处理这个意外的 HTML 文档。

    另外,会话?我发现会话过期从可用性的角度来看真的很烦人,并且使用 Angular,应用程序状态可以很容易地保存在浏览器中,让我们摆脱服务器端会话(这也很好地防止了 CSRF 攻击,你的 API 可能否则易受攻击,简化负载平衡,并提高后端的可扩展性)。

    因此,虽然 Spring Security 可以帮助进行访问控制,但它无法解决登录部分,因此无法从同一台服务器提供 UI 中受益。

    其他注意事项

    值得注意的是,开发和运行时的“协同性”可以独立决定。

    对于开发,我会考虑:

    • 我可能想在不同的前端使用后端吗?
    • 是由同一个人进行前端和后端更改,还是由不同的人在不同的时间进行?这些更改会一起发布还是单独发布?
    • 我的测试策略是什么?前端和后端是单独测试还是一起测试?

    因此,如果我有一群全栈开发人员,每个人都将在所有层上实现他们的功能,并一起发布和测试,那么所有内容都将进入同一个存储库并构建(尽管我仍然可以保留在开发过程中单独构建前端:更改 Angular 代码时无需等待 Spring Boot 重启)。

    相比之下,如果我有一个单独的前端和后端团队,他们的版本可能会不同步,并且单独测试,我会创建单独的存储库和构建。

    对于运行时,我会考虑:

    • 易于部署:在我希望部署到的任何地方一起部署还是单独部署更容易?

    这几乎是唯一的考虑因素。特别是,不应该有超出 HTTP API 的耦合,因为这种耦合不会带来任何好处并抑制系统的未来发展:如果操作偏好或最佳实践发生变化,我希望能够对此做出响应。例如,如果我以后想在我的 UI 中使用 CDN,我应该能够轻松地做到这一点。

    【讨论】:

    • 非常感谢您的回答!至于安全部分:您会选择哪种身份验证类型?我阅读了本指南:spring.io/guides/tutorials/spring-security-and-angular-js,但我仍然不确定当我只有 1 个后端和 1 个正常登录/注册的前端时我会使用哪种类型。
    • "... 并构建(尽管我仍然保留在开发过程中单独构建前端的能力:当我更改我的角度代码时,无需等待 spring boot 重启)。”所以你会在它自己的网络服务器中运行 Angular,或者你会将它打包到 Spring 的服务器中,让 Angular 能够在它自己的服务器中运行?至于您的考虑:我只有一个全栈团队,负责前端和后端。并且应用程序不会有第二个 UI。
    • 有没有github上的模板项目或者github上的开源项目你推荐学习一下?
    • 1) 抱歉,这个链接太冗长了,我无法通读... 2) Angular CLI 带有自己的开发网络服务器,可以重新加载实时代码。我的意思是说你会想要使用它,而不是一直做 maven 构建。 3)自从我进行“正常”登录以来已经有一段时间了(我们将身份管理外包给不同的组件,例如使用 OpenID Connect 的 Google 登录,由 angular-oauth2-oidc 和 spring security 实现),所以我不能推荐库或用于您的用例的模板项目。
    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2017-02-18
    • 2017-04-15
    • 1970-01-01
    • 2017-05-15
    • 2015-07-19
    相关资源
    最近更新 更多