是什么 What is it ?
如果用一个比喻来形容,可以这样理解
- Spring & Spring Framework 就象秘书 Spring 最重要的特性就是 IoC & AOP, 其中 IoC 是控制反转,说得好听点儿,就是 Bean 的生命周期管理反转给了 Spring ,由 Spring 来控制,说得直白一些,就是你可以偷懒儿了,因为 Spring 替你做了这些常规性的事务。所以说,Spring & Spring Framework 就象秘书一样,替你分担了工作。一般来说,秘书的工作就是:一些常规性的工作,她不做你就得做,而你做却未必有她做得好!
- Spring Boot 就象秘书长 那个叫 Spring 的秘书越来越多,Spring MVC, Spring Data Jpa, Spring Security, ..…..… 为了方便管理,派来一位叫 Spring Boot 的秘书长,将所有的秘书统一管理,然后就有了各种 starter , starter-web, starter-data-jpa, starter-data-redis, starter - security, ..…..… 。而这位秘书长新官上任三把火,当然也要有创新,所以就有了 Spring Boot Actuator - 服务监控管理,等等。这是从秘书长 Spring Boot 的工作职责,也就是 Spring Boot 的功能上来比喻的。如果从 Spring Boot 的初衷,也就是配这个秘书长的根本目的来说,她是为了一个叫 Spring Cloud 的老大服务的!
- JHipster 就象咨询公司 我们有了免费的秘书和秘书长,但是秘书和秘书长只能处理一些常规的事务,那个叫 Spring Cloud 的老大想要将自己的公司 ( SHE TUAN ) 管理好,仅有她们是不行的,所以就有了一个叫做 JHipster 的咨询公司,为 Spring Cloud 老大出谋划策。所以,就象真正的咨询公司一样,JHipster 提供的是业界的最佳实践 ( 这个有点儿象项目管理 PMI 的理念 ),我们遵从这个最佳实践,就会以最少的时间,最少的代价将 Spring Cloud 公司建立并管理起来,同时也能最大幅度地减少错误发生的概率!当然,对于这个最佳实践,我们也可以 Tailor - 裁剪 ( 这也是 PMP 中的理念 ),使它更加适合我们。
单体 Monolithic
JHipster 创建的应用包括单体 & 微服务,单体应用的技术栈与微服务类似,架构就比微服务简化了许多,这里不再赘述。
但是,就象 Spring 官方形容 Spring Boot 的最终使命 –— 就是为微服务( Spring Cloud )服务的一样,JHipster 项目的最终目的,也是以 Spring Cloud 全家桶为后台,以流行的 Angular, React 或 Vue 为前台,快速地创建微服务应用,进一步地简化微服务的创建、部署、运行的过程,并在此基础上,提供了类似咨询公司的能力 –— 业界的最佳实践!其中包括一些中间件的选型,合理的配置方案,以及部署和生产环境下运行的最佳实践等等。
微服务 Microservices
技术栈 Technology Stack
前台 Client Side
- Angular or React or Vue
- 响应式网页设计( Responsive Web Design with Twitter Bootstrap )
- HTML5 Boilerplate
- 国际化支持
- Optional Sass support for CSS design
- Optional WebSocket support with Spring Websocket
后台 Server Side
- Spring Boot for easy application configuration
- Maven or Gradle configuration for building, testing and running the application
- “development” and “production” profiles (both for Maven and Gradle)
- Spring Security
- Spring MVC REST + Jackson
- Optional WebSocket support with Spring Websocket
- Spring Data JPA + Bean Validation
- Database updates with Liquibase
- Elasticsearch support if you want to have search capabilities on top of your database
- MongoDB and Couchbase support if you’d rather use a document-oriented NoSQL database instead of JPA
- Cassandra support if you’d rather use a column-oriented NoSQL database instead of JPA
- Kafka support if you want to use a publish-subscribe messaging system
- HTTP routing using Netflix Zuul or Traefik
- Service discovery using Netflix Eureka or HashiCorp Consul
生产环境 Production Environment
- 监控 –— Monitoring with Metrics and the ELK Stack
- 缓存 –— Caching with ehcache (local cache), hazelcast or Infinispan
- 静态资源优化 –— Optimized static resources (gzip filter, HTTP cache headers)
- 日志管理 –— Log management with Logback, configurable at runtime
- 数据库连接池 –— Connection pooling with HikariCP for optimum performance
- 创建可执行 JAR/WAR 文件 –— Builds a standard WAR file or an executable JAR file
- Docker –— Full Docker and Docker Compose support
- 公有云 –— Support for all major cloud providers: AWS, Cloud Foundry, Heroku, Kubernetes, OpenShift, Azure, Docker…
Architecture 架构
API Gateway
JHipster Gateway 是一个微服务应用( 可以通过命令自动生成 ),它整合了 Netflix Zuul 和 Hystrix 来提供路由( Routing ),过滤( Filtering ),安全( Securiy ),熔断( Circuit Breaking )等功能。
JHipster Registry
JHipster Registry 是 JHipster 默认的服务注册组件。它是一个运行时组件,所有的微服务都需要向其注册,并且从其得到相关的配置,其实就是传统的服务发现 & 配置中心的整合。同时,它还提供了一些额外的功能,如:监控和健康检查面板等等。
JHipster Registry 主要组成如下:
- Netflix Eureka server
- Spring cloud config server
服务发现 Eureka
配置中心 Spring Cloud Config
JHipster UAA
JHipster UAA 是一个用户账号管理和认证 & 授权中心。它使用 OAuth2 认证协议。它是一个完全配置好的 OAuth2 认证服务器,并且有默认的用户和角色,同时,它被包装成一个普通的 JHipster 应用,这样做的好处是,可以让开发者深入定制&配置他们的用户域,包括用户、角色等等,而不会象其它开箱即用的UAA,受到各种限制。
JHipster UAA 可以通过命令自动生成。
JHipster Console
JHipster Console 是微服务的监控解决方案,它由 ELK + Zipkin 技术栈组成,并且整合好了现成的面板和相关的配置,是开箱即用的运行时组件。它提供即时可用的 Docker 镜像。
ELK Stack –— Elasticsearch, Logstash, Kibana
- Logstach 规范、汇总数据( 通常是日志数据 )
- Elasticsearch 快速处理数据
- Kibana 可视化数据
Zipkin 是一个分布式追踪系统,微服务的架构经常会出现延迟问题,所以需要一种有效的方式去解决。Zipkin 通过收集微服务调用的时间数据来帮助解决,并且提供了快速搜索、定位的功能。
默认,JHipster 生成的应用是 Zipkin disabled 的,但你可以通过修改 application-
.yml 文件来 enabled 它。
Microservices
Spring Cloud 微服务,你的业务代码,..…..…
代码分析 Code Analysis
后续
Some Tips
开发环境注意事项
Profiles
- 日常开发 application-dev.yml & IDE
- 模拟生产环境 application-dev.yml & IDE & application-prod.yml,要选择上 dev 不然会找不到相应的依赖包(打包生产环境时,可执行war文件中已经包括),也要选择上 prod 不然会找不到 prod 相关的设置,如:Database
- 注释 代码中所有原始注释都不要动,因为代码生成要用
Swagger & no-liquibase
1 | Spring profiles switches |
HTTPS support
Keytool 数字证书
1 | - 生成服务器keystore(创建服务器端的数字证书库文件) |
Keytool 双向认证
1 | - server & client 双向认证,暂时用不到. |
HTTPS configuration
- HTTPS can be configured directly in your JHipster application, or using a specific front-end proxy.
- HTTPS is configured using Spring Security’s standard server.ssl configuration keys in your application-prod.yml file.
- To enable SSL, generate a certificate using:
1 | keytool -genkey -alias <your-application> -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650 |
You can also use Let’s Encrypt using this tutorial.
Then, modify the server.ssl properties so your application-prod.yml configuration looks like:
1 | server: |
生产环境打包 & 运行
打包
1 | mvn -Pprod clean package -DskipTests |
运行
1 | Linux : ./hr-0.0.1-SNAPSHOT.war —-spring.profiles.active=prod,no-liquibase |
微服务构建要点
Registry
- 如果从源码构建,除了运行 mvn 构建 Java ,还要运行 yarn install 构建 front-end. 一个例子 http://www.baeldung.com/jhipster-microservices
- Registry Server 要最先启动,不然其它的会报错
- Dev,native 是用本地的 central-config 目录,prod 用的是 git ,看官网说明
Gateway
- 这里的 gateway 就是 dubbo 里的服务消费者,也就是应用里的前端,和 Nginx 作用的 gateway 意义不同
- 需要 UAA 先启动
- 【重要】 如果要添加 Entity ,应该在微服务端(micro-service)先创建,此处创建 front-end 时,会提示是否从已有的微服务获取,提供微服务的路径即可完成
UAA
- UAA Server 启动时会查找 Registry Server
UAA Cluster 搭建
- 不同的实例,名字起相同即可建立集群。
- 第一种情况:JHipster 创建时,起相同名字,也就是 .yo-rc.json 中 “baseName”
- 第二种情况:创建完后修改,在 application.yml 中 spring.application.name
- 一定要保证相同的 keystore.jks, 要 Copy 过去覆盖
- 通过 JHipster-register 可以查看到
- 创建集群时,不能用 H2, 因为 H2 只能支持一个连接!
- 微服务时,Cache 都应该用其默认的 hazelcast , 因为 hazelcast 是分布式的,JHipster 做了整合,可以直接加入到 Cache 集群中
- 创建 Gateway & 微服务时的,也就是 .yo-rc.json 中 “uaaBaseName” 指向 UAA 名字即可,后期手动在 application-xxx.yml 中修改好象也可以,只要将 http://uaa.xxx.xxx 开头的路径写对即可。
应用创建后的修改
- 创建时的选项都在 .yo-rc.json 中,只要修改其内容即可
- TODO : Entity 在 Gateway(前端)的修改不管用,目前的做法:
- 删除 .jhipster 目录下的 实体名.json
- 重建 Entity, 与新建时一样,选择从已有微服务中生成
- NEW: 上述修改完成后,gateway 的 .jhipster 目录下并没有 实体名.json, 只有微服务下面有,可能是我之前的操作有误,待确认~