导读
一、背景介绍
二、基于SpringBoot的服务框架设计
统一规范可以通过默认约定、强制校验、自动内嵌等多种方式来实现,下面将分别举例说明。
统一管理依赖包(默认约定)
基于Maven的依赖包管理,通过Partent统一定义依赖包及版本,默认引入必须的依赖包和插件。创建工程自动生成代码时,默认约定继承Parent,开发者只需引入必要的Starter即可,开发者可以修改继承关系,但不推荐。
依赖包的统一管理,可以避免不同版本包冲突的麻烦,也方便后期公司统一升级依赖包和版本。
统一参数格式(强制校验)
统一处理异常(自动内嵌)
通过Spring的RestControllerAdvice可以对全局异常统一捕获,并对异常统一处理。异常处理自动内嵌到核心包中,只要使用该框架,就自动生效。
统一异常处理,不仅规范了异常返回格式,兼容了强类型客户端,日志统一记录,并对返回的异常信息进行脱敏处理。
所有中间件依赖包都在Parent中统一管理,对于自研的通用类组件(比如日志组件、线程池组件、web安全组件、自研的工具类组件等),默认在Parent中已引入,开发者可以直接使用。
公司有很多自研的中间件组件或系统,或者根据公司环境二次开发过的开源组件,只能按照公司的特定的方式进行接入使用,有一定的接入成本。为了接入更方便,都做成了可插拔的组件,通过Starter方式进行接入。
使用Starter方式,简化了依赖、简化了配置、简化了接入代码。
OpenFeign是一种声明式、模板化的HTTP客户端,在Spring Cloud中使用OpenFeign,只需要定义接口和注解,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样。
但OpenFeign和我们公司技术环境不一致,加上太多历史项目也无法支持OpenFeign,于是我们借鉴OpenFeign思想,基于开源Fegin开发了适合公司环境的ZbjFeign,支持在SpringBoot和普通Spring环境中使用。
虽然实现了声明式调用,如果每次都要写接口定义和注解,还是很不方便。为了解决这个问题,我们开发了一键发布Client包功能,通过扫描Controller接口方法元数据,基于ZbjFeign生成接口调用Client,构建打包发布到公司Maven仓库。后端开发者只需引入一个包,就可以像调用本地接口一样调用远程HTTP接口。对于前端NodeJS调用,也生成了对应的生成物,支持前端框架的“强类型”调用。如果开发者要看接口文档,我们也提供全公司统一、完整的接口文档。
公司所有文档都是基于Confluence进行管理的,接口文档也不例外,于是我们也实现了在发布阶段,一键发布接口文档。后台实现也是自动扫描Controller接口元数据,通过模版生成HTML片段,并提交到Confluence。接口文档中提供了Java强类型客户端调用、HTTP调用两种方式的参考。
Client和文档都有了,接下来我们通过案例看一下如何使用。
三、框架使用案例
通过Starter方式使用分布式消息队列 RabbitMq,只需要引入Starter,就可以直接使用了。
第一步:引入依赖Starter。
第二步:消费者监听队列消息。无需做任何配置,具体代码如下。
说明:公司的RabbitMQ是经过二次开发的,不是通过“地址+账号”访问,而是通过申请的业务ID进行访问。
2、强类型客户端使用案例
四、未来框架的思考和展望
最后,给大家分享一下关于未来工作,我们的一些思考与规划,还不太成熟,抛出来和大家探讨一下。
1、服务治理本文未涉及到服务治理相关部分(熔断、限流等),是因为考虑到解耦、灵活性等多方面因素,我们并没打算像Dubbo或者SpringCloud, 通过代码库方式耦合在应用程序生命周期中,而是从应用生命周期脱 离出来,下沉到基础设施或者网络层,进行统一治理。
2、应用可观测性微服务架构中,故障可能出现在任何地方,做可观测系统已经在我们 计划中,通过日志、链路跟踪、度量等手段,让各数据之间产生更多的关联,使每一次 App 点击所产生的多次服务调用耗时、返回值和参数都清晰可⻅,甚至可以下钻到第三方软件调用、SQL请求、节点拓扑、网络响应等信息中。运维、开发和业务人员通过这样的观测能力可以实时掌握软件的运行情况,并获得前所未有的关联分析能力,以便不断优化业务的健康度和用户体验。
3、框架持续演进如今,技术与业务都发展非常快,后端框架也会在一定范围内不断升级重构,以适应变化的技术和业务需求。本框架设计都是面向服务接口调用,未来可能也会引入消息驱动设计,处理一些异步化的场景, 甚至重构升级为事件驱动的架构。当然,在业务高速迭代的情况下, 也需要考虑架构演进与业务发展之间的平衡。
诚邀各位IT大佬加入我们“西南名猿交流群”
一个交流技术、招聘的场地
全国程序猿皆可扫码上车噢~
原文始发于微信公众号(八戒技术团队):【技术分享】微服务开发的幸福感,是如何提升的?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论