Java服务_服务稳定性和标准化建设六件套_缓存&监控&限流&日志&异常&响应体
服务稳定性
在常见服务开发中,为了保障服务稳定性,一定都需要建立缓存、监控和限流机制的,这个一般通过AOP的方式建立在抽象方法的周围。
服务标准化
服务的标准化建设主要是方便自己,方便他人的一些规范性建设,我觉得主要有三点:
- 日志标准化:1)格式化添加uuid、erp、traceid等前缀,2)mybatis打印sql日志;
- 全局异常捕捉:1)异常统一定义和出口,2)异常码标准化定义;
- 通用响应和请求体:1)标准化header、body。
1.使用MDC添加uuid
使用MDC添加uuid可以方便与上下游请求链路串联,也可以方便研发快速定位一次请求的整个调用过程,可以在开发测试时提效,也方便快速定位线上问题。一个使用实战如下:
SLF4J、Log4j、logback的使用和配置方法就不再赘述了,可参考之前博文进行知识复习:使用SLF4J&Log4j、SLF4J日志应用
1.配置文件中设置日志格式
添加了uuid、erp、PFTID三个日志前缀,其中:-uuid表示默认值为字符串’uuid’。
1 | logging: |
输出的日志格式如下:

2.创建MDCUtil工具类
mdc是slf4j提供的一个线程安全的存放诊断日志的容器,本质和ThreadLocal类似。可以直接使用mdc来操作设置每个线程独有的一些kv数据。注意这里虽然用同一个静态方法封装了mdc的操作方法,但是每个不同的线程调用这个静态方法时,方法体中操作的是独属于自己线程的mdc。
同时还用一个ERR_MSG_KEY来保存异常发生时的错误信息,在发生错误时存入,在方法最终返回时写入返回错误信息中。
1 | public class MDCUtil { |
3.创建过滤器在业务方法前设置uuid,业务方法后清空MDC
一般可以通过aop的方式来设置这种统一的操作,使用过滤器或者拦截器都可以方便的实现。
1)如果上游有传入uuid,则取上游uuid写入mdc;如果上游没有传入,则取一个随机值作为uuid。2)最后一定要使用clear()方法手动清空mdc中的数据。3)注意要想日志中能够像这些设置值打印出来,一定要将key与第一步配置文件中的配置的占位字符串一致,如本例中的uuid、erp、PFTID等。
1 | public class IntelligentProduceJsfFilter extends AbstractFilter { |
4.在spring配置文件中配置过滤器
在spring配置文件中通过ioc依赖注入的方式将IntelligentProduceJsfFilter过滤器配置在IntelligentProduceService业务类之中。
1 | <bean id="intelligentProduceJsfFilter" class="com.jd.bdaa.arch.filter.IntelligentProduceJsfFilter" scope="prototype"/> |
如何快速查询一个接口的所有执行日志?利用SLF4J的MDC轻松搞定
SpringBoot logback日志打印增加trace_uuid追踪接口请求输出日志
spring cloud脚手架项目(五)日志模块之出入参数和日志链路追踪UUID
2.mybatis打印sql日志
只需在yml文件中添加一行配置即可,就是logging.level.com.jd.data.application.decision.mapper=debug,其中key就是mapper类所在的分层。
案例如下:
1 | logging: |
3.全局异常捕获和异常码标准化定义
全局异常捕获就是多自定义RuntimeException的子类,把所有运行时异常情况都包括进行来,然后对应可能出现该异常的地方加上对该异常的catch,并总定义异常信息。总而言之,就是要保障透出给外界的异常信息一定不能是最原始的e.getMessage()的类似于printStackTrace()的一长串方法之类的detailMessage,最好是给出简短的一句话和修改建议等简洁明了的信息。就比如后端给前端透出的异常信息,数据服务给后端透出的异常信息。
比如希望透出的不是这么一长串用户看不懂的东西:

而是如下简短明了的信息:

1.自定义异常case
这种自定义异常case越多越好,能覆盖到的异常场景越多越好。
1 | 4j |
1 | 4j |
2.异常码标准化定义case
1 | public enum ResponseCode { |
4.通用响应和请求体
标准化的响应和请求体,包括request和response,包括header和body,包括返回码和返回描述枚举值,等等能标准化的都尽量标准化。
case如下:
1 |
|