目录
引言
前一段时间需要开发一款基于云原生的SaaS医疗平台,由于SaaS是一个老话题,有不少开源架构可供选择,因此开始调研那款最符合我的期望。
经过一段时间的调研,有不少基于Python或nodejs的SaaS架构,但由于团队开发人员以Java为主,还是希望保持原有技术栈,因此就有了一系列的甄选。
由此变诞生了这个系列的文章,本篇文章作为第一部,首先介绍SaaS选型的初衷及过程,以及为什么最终选择JHipster 作为全栈开发架构。
什么是SaaS
SaaS(Software as a Service,软件即服务)是一种通过互联网提供的软件服务模式,用户不需要购买、安装和维护软件,而是通过订阅的方式使用软件。SaaS应用通常托管在云端服务器上,用户通过浏览器或客户端访问,数据和应用的管理由服务提供商负责。
开源SaaS架构选择原则
SaaS要选择什么架构,取决于需求。由于SaaS的多租户和高可用特性,在开发时一般选择微服务架构或分布式架构,如SpringCloud、Micronaut等。
选择原则 | 描述 | 推荐技术 |
---|---|---|
功能需求 | 根据SaaS平台的功能需求选择架构,是否需要多租户、计费系统、API管理等。 | JHipster, Spring Boot, Spring Cloud |
可扩展性 | 确保架构能够支持随着用户增长和业务扩展而进行扩展,支持高并发和分布式系统。 | Spring Cloud, Kubernetes, Apache Kafka |
技术栈兼容性 | 选择与现有技术栈兼容的框架,减少学习成本和技术转换成本。 | Spring Boot, Quarkus, Micronaut |
开发效率 | 选择能够加速开发过程的框架,如自动化代码生成、脚手架、模板等工具。 | JHipster, Spring Roo, Grails |
维护成本 | 选择易于维护、文档完善、社区活跃的架构,减少后期运维的难度。 | Spring Boot, Quarkus, Micronaut |
安全性 | 确保架构能够满足SaaS应用的安全需求,如数据加密、用户认证、权限管理等。 | Spring Security, OAuth2, JWT, Keycloak |
多租户支持 | SaaS平台通常需要支持多租户架构,确保每个客户的数据和配置隔离。 | Spring Boot + Spring Cloud, JHipster |
部署和运维便利性 | 选择支持自动化部署、云平台和容器化的架构,简化运维过程。 | Kubernetes, Docker, Helm, Jenkins |
成本效益 | 根据预算选择适合的架构,避免过度配置,并能按需扩展和计费。 | Kubernetes, Spring Cloud, AWS, Docker |
技术社区与文档 | 选择有活跃社区支持和完整文档的框架,确保开发者能快速获取帮助和解决问题。 | Spring Boot, JHipster, Quarkus |
基于Java的SaaS开源架构有哪些
框架/工具 | 特点 | 适用场景 | 优点 | 缺点 |
---|---|---|---|---|
JHipster | 全栈开发平台,集成Spring Boot和前端框架(Angular/React/Vue),支持微服务架构 | 微服务架构、全栈开发、快速原型开发、SaaS平台 | 高效的代码生成,支持微服务架构和云原生,前后端整合,自动化构建和部署,支持多种技术栈(Spring Boot、React/Angular/Vue) | 生成的代码灵活性有限,学习曲线较陡,项目结构复杂,依赖Spring和Java |
Spring Boot + Spring Cloud | 微服务框架,基于Spring Boot,集成Spring Cloud进行服务发现、负载均衡、断路器等功能 | 大规模分布式系统、微服务架构、高并发、SaaS平台 | 完全可定制,强大的生态系统,广泛的社区支持,能够轻松实现微服务架构和云原生应用,强大的安全机制 | 配置复杂,微服务架构的学习曲线较陡,可能出现过多的技术债务 |
Quarkus | 为GraalVM和OpenJDK优化的Java框架,轻量级、高性能,支持微服务和无服务器架构 | 云原生应用、高性能SaaS应用、大规模微服务 | 快速启动时间和低内存占用,支持GraalVM编译和无服务器架构,性能优秀,支持Spring兼容扩展 | 生态和社区相对较小,尚在成长中,学习曲线可能较陡 |
Micronaut | 高性能微服务框架,专为构建云原生应用和微服务架构而设计,支持依赖注入和AOP | 微服务架构、无服务器架构、云原生应用 | 快速启动和低内存占用,支持微服务、云原生架构,内建依赖注入和AOP,支持多种数据库和消息队列 | 与Spring相比,生态较小,学习曲线较陡,需要较强的Java基础 |
Grails | 基于Groovy和Spring的Web应用框架,遵循“约定大于配置”原则,适合快速开发 | 快速开发中小型Web应用、快速原型开发 | 快速开发、自动化配置,支持插件和扩展,内建集成Spring框架,适合快速原型和中小型应用 | 性能较低,相比Spring,社区支持较少,Groovy可能不适应部分Java开发者 |
Spring Roo | 快速开发框架,基于命令行工具生成代码,简化Spring应用的开发过程 | 快速开发中小型应用、Spring全栈应用 | 自动化生成代码,简化Spring开发过程,基于Spring生态系统,快速搭建开发环境 | 可扩展性较低,生成的代码灵活性差,适用于简单项目 |
Dropwizard | 轻量级框架,专为构建RESTful Web服务设计,集成了Jetty、Jersey等技术 | 构建RESTful API、小型Web应用 | 高效轻量,适合小型RESTful服务,内建日志、监控和配置功能,非常适合快速部署和开发 | 不支持复杂微服务架构,不如Spring Cloud全面,适用于较小项目 |
Play Framework | 异步Web框架,支持Scala和Java,擅长高并发、异步I/O处理 | 高并发应用、分布式系统、SaaS平台 | 支持异步I/O和响应式编程,适合高并发应用,灵活集成其他Java技术栈 | 配置复杂,学习曲线较陡,社区支持不如Spring |
为什么选择JHipster
选择 JHipster 做SaaS简单来说:
开发快:可以快速启动项目,减少开发周期。
微服务:适合大规模分布式SaaS平台。 多租户支持:方便实现不同客户的数据和配置隔离。
有全栈:采用现代化前后端分离技术,提升开发效率。
高可用:适合高并发、高扩展性的应用需求。
安全性:与Spring Security集成,确保SaaS平台的安全性。
选择理由 | 描述 |
---|---|
快速开发 | JHipster提供了丰富的代码生成器,可以快速生成全栈应用,帮助开发者快速启动项目,缩短开发周期。 |
微服务架构支持 | JHipster默认支持微服务架构,并与Spring Cloud集成,适合构建大规模、分布式的SaaS应用。 |
多租户支持 | JHipster可以轻松实现多租户架构,支持数据隔离和配置定制,非常适合为多个客户提供SaaS服务。 |
前后端分离 | 提供前后端分离的全栈开发方案,前端使用现代化框架如Angular、React或Vue,后端使用Spring Boot,适合现代Web应用。 |
DevOps集成 | 支持Docker、Kubernetes等容器化技术,能够与DevOps流程无缝集成,支持持续集成和部署(CI/CD)。 |
高性能与可扩展性 | 通过微服务架构和Spring Boot,JHipster提供了高性能、可扩展的解决方案,适用于高并发场景。 |
丰富的生态系统 | 基于Spring生态系统,JHipster可以利用Spring Security、Spring Data等技术,简化开发。 |
社区支持与文档 | JHipster拥有活跃的社区和完善的文档,开发者可以快速上手,并且能从社区获得及时支持。 |
安全性 | 与Spring Security集成,支持OAuth2、JWT等认证与授权机制,确保应用的安全性。 |
支持云原生 | JHipster支持容器化部署,并且与云平台如AWS、Azure兼容,适合云原生应用的部署和扩展。 |
部署JHipster 步骤
安装
-
安装依赖项:
- Node.js 19+
- Docker
- Git
- Java JDK 17+(下载:https://adoptium.net/zh-CN/temurin/releases/?version=17&os=windows&arch=x64)
-
安装JHipster:
执行命令:npm install -g generator-jhipster
初始化
执行命令并按需选择初始化配置,命令:jhipster
重要选项:
- 应用类型:选择 Monolithic 或 Microservice。前者单服务,后者微服务。
- 身份验证类型:可以选择 JWT(JSON Web Tokens)认证,适合需要分布式和安全的SaaS平台。
- 数据库类型:可以选择 SQL(例如 PostgreSQL 或 MySQL) 或 NoSQL(例如 MongoDB)。
- 开发框架:选择前端框架,JHipster 支持 Angular、React 或 Vue。
参考选项如下(第一次尝试配置,我们选择单服务作为demo):
启动
启动后端服务(gradle模式):
./gradlew
启动前端界面:
npm start
界面展示:
使用默认账号登录,以确认后端服务正常(admin/admin):
其他界面:
问题
问题:
1.如果登录报错:
org.springframework.boot.docker.compose.core.ProcessExitException:
‘docker compose --file E:\Code\jhipster-test\src\main\docker\services.yml --ansi never up --no-color --detach --wait’ failed with exit code 1. Stdout: Stderr: Container jhipstertest-mysql-1 Starting Error response from daemon: Ports are not available: exposing port TCP 127.0.0.1:3306 -> 0.0.0.0:0: listen tcp 127.0.0.1:3306: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
解决:
可能是Docker内的MySQL服务没有启动,启动即可。
可能是Docker内的MySQL的端口不是3306,确认端口并修改对应配置,目录位于项目src/main/docker/mysql.yml
拓展:JHipster选项的解释
服务发现
- Consul (recommended)
- Consul 是一种现代化的服务发现工具,通常被认为是最先进和功能最全的选择。它不仅提供了服务发现功能,还支持健康检查、键值存储、以及多数据中心支持等功能。
- 优点:
- 多数据中心支持:Consul 可以在多个数据中心之间进行服务发现。
- 健康检查:Consul 可以自动进行服务的健康检查。
- 广泛支持:有很多工具和生态系统与 Consul 集成,适用于微服务架构。
- Kubernetes 支持:Consul 与 Kubernetes 集成良好,可以作为云原生服务发现的解决方案。
- 适用场景:如果你正在构建一个有很多服务需要动态扩展和管理的系统,Consul 是一个很好的选择。
- JHipster Registry (legacy, uses Eureka, provides Spring Cloud Config support)
- JHipster Registry 是 JHipster 提供的一个自定义服务发现解决方案,基于 Eureka,并且支持 Spring Cloud Config 配置管理。
- 优点:
- 集成 Spring Cloud Config:提供集中配置管理,适合微服务架构。
- 成熟的生态:Eureka 在 Spring Cloud 生态中非常流行,许多传统的 Spring 项目都使用 Eureka 来做服务发现。
- 缺点:
- 不如 Consul 现代:尽管 Eureka 长时间在 Spring Cloud 中被使用,但相比 Consul,它的功能和社区支持不如前者活跃。
- 过时:这个选项被标记为 “legacy”,表明它正在逐渐被其他更现代的技术(如 Consul)替代。
- 适用场景:如果你已有基于 Eureka 的项目,或者在使用传统 Spring Cloud 生态中的其他工具,那么可以选择 JHipster Registry。对于新项目,推荐使用 Consul。
- No service discovery
- 无服务发现:如果你不打算在微服务架构中使用服务发现,或者只是做一个简单的单体应用,选择此选项。
- 适用场景:适合非常简单的应用,或者你计划手动管理服务间的通信(例如,通过直接硬编码服务地址),这种情况下不需要服务发现。
Spring WebFlux
Spring WebFlux 是 Spring 框架中的一个模块,用于构建响应式、非阻塞的 Web 应用程序。它是 Spring MVC 的替代方案,专为高并发、低延迟的场景设计,支持异步和非阻塞的编程模型。
Spring WebFlux 与 Spring MVC 对比:
特性 | Spring WebFlux | Spring MVC |
---|---|---|
编程模型 | 响应式、非阻塞 | 同步、阻塞 |
并发模型 | 基于事件循环,少量线程处理大量请求 | 每个请求占用一个线程 |
性能 | 高并发场景下性能更优 | 适合低并发、计算密集型任务 |
适用场景 | 实时数据处理、高并发服务 | 传统 Web 应用、RESTful API |
学习曲线 | 需要掌握响应式编程 | 更简单直观 |