Spring Boot 构建微服务实践
前言
在本文中将分享关于 Spring Boot 构建微服务程序的 "黄金法则" ,欢迎大家补充。
系统运行在白盒之上
监控可视化系统的作用效果绝对是出乎你的预料,无论是简单的
Spring Boot Admin
还是复杂的Grafana
,能够识别出应用运行中的大部分问题,及时反馈给开发团队。监控系统提供了大量的图表和报警监控,使得对于故障有更快的响应速度。在微服务架构下,运行指标监控和收集,则比单体应用更为重要。对于 Spring Boot 应用内置
Spring Boot Actuator
来暴露一些运行的指标。若使用它,仅需要增加以下依赖即可:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
对我们来说 http.server.requests
是最重要的指标之一,它提供了统计信息以及传入请求的数量和响应时间。
关于 actuator 存储,业界比较成熟的是 InfluxDB 和 Prometheus。它们代表着不同的收集模型,Prometheus 会定期从应用公开的端点检索数据,而 InfluxDB 提供了必须由应用程序调用的 REST API。(当然如果你的应用规模比较小、或者团队能力有限可以使用 Spring Boot Admin 这种基于内存形式展示的中间件)
当然注意生产环境务必屏蔽对外暴露,笔者在使用某些 APP 的后台竟然可以直接获取部分信息(某些操作可使服务宕机)。
日志记录
对于日志记录在开发过程中往往被忽视,但在后期运维过程中变得尤为重要。建议项目经理在 review code 、测试团队在业务测试过程中将日志输出作为一项重要的依据。
对于微服务架构应用使用相同的日志记录标准,通过 MDC 记录应用传递过程,区分不同的实例,并且能够计算和存储每个请求的执行时间。
对于日志存储我们建议统一集中存储,那么业界比较推荐的就是 Elastic Stack(ELK) 技术栈。
<dependency>
<groupId>net.logstash.logbackgroupId>
<artifactId>logstash-logback-encoderartifactId>
<version>5.3version>
dependency>
当然如果项目规模比较小或者团队经验有限,可直接使用云厂商提供的日志处理工具 (七牛 logkit、日志易等价格挺便宜)
确保接口文档清晰可用
对于微服务架构服务之间调用或者对外提供的 REST API 调用非常繁多,因此要特别注意提供清晰而正确的(及时)文档。
提起 swagger 大家肯定很熟悉强大的 API 文档工具,业界必备的开发工具。通过简单依赖和配置,即可完成在线接口文档的维护。
但 swagger 的功能相对较弱,对于实际开发过程中需要打通整套 DevOps 体系远远不够。YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理。当然支持 swagger 接口一键导入 yapi 实时自动维护,减少重复劳动。
如果是 dubbo 可以尝试使用一下 smart-doc,是一款同时支持 java restful api 和 apache dubbo rpc 接口文档生成的工具。完全基于注释生成文档,做到零侵入。
应用信息透明
我们迁移到微服务架构最重要的原因之一是对于持续交付的需求,快速交付的能力已经能够为市场人员带来强大的竞争优势。甚至于一天可以发布多个版本,因此务必在版本中声明当前的版本信息和变更信息等。
Spring Boot 提供了强大的 maven 插件,通过简单的配置即可完成
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<executions>
<execution>
<goals>
<goal>build-infogoal>
goals>
execution>
executions>
plugin>
plugins>
访问 /actuator/info
端点即可发现部分有趣的信息
curl http://localhost:8080/actuator/info 15:35:44
{"build":{"artifact":"demo","name":"demo","time":"2020-12-31T07:33:54.017Z","version":"0.0.1-SNAPSHOT","group":"com.example"}}⏎
当然若通过 SpringBootAdmin
我们可以轻松浏览已注册的应用程序列表,并检出每个应用程序的版本或提交信息(需要额外引入 git-commit-id-plugin 插件)。
及时更新依赖
目前 Spring Boot 、Spring Cloud 团队保持每月发布新的版本,每个版本或多或少的引入新的功能或者 BUG 修复。此外在最新稳定版本中 Spring Boot 改善了应用程序的启动时间和内存占用,更好的和容器化结合。正因如此,所以值得去使用新的版本
最新稳定版本
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.4.1version>
parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>2020.0.0version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
Spring Cloud 版本说明
往期推荐