加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

后端开发实践系列——Spring Boot项目模板

发布时间:2019-07-24 15:50:23 所属栏目:建站 来源:无知者云
导读:在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为第0个迭代要做的事情。但是,当项目运行了一段时间之后再来反观,我总会发现一些不足的地方,要么测试分类没有分好,要么基本的

Gradle在默认情况下只提供src/test/java目录用于测试,对于以上3种类型的测试,我们需要将它们分开以便于管理(也是职责分离的体现)。为此,可以通过Gradle提供的SourceSets对测试代码进行分类:

  1. sourceSets { 
  2.     componentTest { 
  3.         compileClasspath += sourceSets.main.output + sourceSets.test.output 
  4.         runtimeClasspath += sourceSets.main.output + sourceSets.test.output 
  5.     } 
  6.  
  7.     apiTest { 
  8.         compileClasspath += sourceSets.main.output + sourceSets.test.output 
  9.         runtimeClasspath += sourceSets.main.output + sourceSets.test.output 
  10.     } 

到此,3种类型的测试可以分别编写在以下目录:

  • 单元测试:src/test/java
  • 组件测试:src/componentTest/java
  • API测试:src/apiTest/java

需要注意的是,这里的API测试更多强调的是对业务功能的测试,有些项目中可能还会存在契约测试和安全测试等,虽然从技术上讲都是对API的访问,但是这些测试都是单独的关注点,因此建议分开对待。

值得一提的是,由于组件测试和API测试需要启动程序,也即需要准备好本地数据库,我们采用了Gradle的docker-compose插件(或者jib插件),该插件会在运行测试之前自动运行Docker容器(比如MySQL):

  1. apply plugin: 'docker-compose' 
  2.  
  3.  
  4. dockerCompose { 
  5.     useComposeFiles = ['docker/mysql/docker-compose.yml'] 
  6.  
  7. bootRun.dependsOn composeUp 
  8. componentTest.dependsOn composeUp 
  9. apiTest.dependsOn composeUp 

更多的测试分类配置细节,比如JaCoCo测试覆盖率配置等,请参考本文的示例项目代码。对Gradle不熟悉的读者可以参考笔者的Gradle学习系列文章。

日志处理

在日志处理中,除了完成基本配置外,还有2个需要考虑的点:

1.在日志中加入请求标识,便于链路追踪。在处理一个请求的过程中有时会输出多条日志,如果每条日志都共享统一的请求ID,那么在日志追踪时会更加方便。此时,可以使用Logback原生提供的MDC(Mapped Diagnostic Context)功能,创建一个RequestIdMdcFilter:

  1. protected void doFilterInternal(HttpServletRequest request, 
  2.                                     HttpServletResponse response, 
  3.                                     FilterChain filterChain) 
  4.             throws ServletException, IOException { 
  5.         //request id in header may come from Gateway, eg. Nginx 
  6.         String headerRequestId = request.getHeader(HEADER_X_REQUEST_ID); 
  7.         MDC.put(REQUEST_ID, isNullOrEmpty(headerRequestId) ? newUuid() : headerRequestId); 
  8.         try { 
  9.             filterChain.doFilter(request, response); 
  10.         } finally { 
  11.             clearMdc(); 
  12.         } 
  13.     } 

2.集中式日志管理,在多节点部署的场景下,各个节点的日志是分散的,为此可以引入诸如ELK之类的工具将日志统一输出到ElasticSearch中。本文的示例项目使用了RedisAppender将日志输出到Logstash:

  1. <appender name="REDIS" class="com.cwbase.logback.RedisAppender"> 
  2.     <tags>ecommerce-order-backend-${ACTIVE_PROFILE}</tags> 
  3.     <host>elk.yourdomain.com</host> 
  4.     <port>6379</port> 
  5.     <password>whatever</password> 
  6.     <key>ecommerce-ordder-log</key> 
  7.     <mdc>true</mdc> 
  8.     <type>redis</type> 
  9. </appender> 

当然,统一日志的方案还有很多,比如Splunk和Graylog等。

异常处理

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读