前言

taptap-developer是一个spring boot框架驱动的纯Grpc服务,所以,只用了四步,移除了web和spring cloud相关的模块后,启动速度就稳稳的保持在了6s内。除了启动速度提升外,在服务待机状态下,内存锐减了50%左右,从500M左右的内存占用,缩减到了250M不到。

分析日志

日志是一个应用的门面,在未深入了解一个应用的架构前,通过启动的日志输出基本可以分析出这个应用的大概的技术构成。在分析日志之前,在强调一点,这个应用是一个纯Grpc的服务。如上图贴出的日志,是未优化前的系统日志输出,从上到下有四个红色箭头指向,是本次日志分析的关键信息,下面就这四个关键信息,分别分析下。然后总结出常见的优化方法

优化点一:关于Spring Data repository scanning

Spring Data repository是一个高度抽象的数据访问层接口,常见的实现有redis、jdbc、jpa、MongoDB、elasticsearch等等。实现一个Spring-data-xxx包,需要实现org.springframework.data.repository.core.support.RepositoryFactorySupport抽象类,然后在!/META-INF/spring.factories文件中定义好实现类。spring容器启动时,会扫描加载factories的信息。如果一个项目里有被扫描到有多个spring-data-xxx的实现,启动时日志就会打印Multiple Spring Data modules found, entering strict repository configuration mode!

优化:看到这个日志,我们就需要检查下项目中是否用到了这些功能,比如引入了spring-data-redis,其实只用到了其携带的jedis,而且jedis实例可能还是自己实例化的,这个时候就可以禁用repository的功能。参考配置如下:spring.data.redis.repositories.enabled=false

Spring Data repository有三种内置的初始化模式,分别对应如下:

DEFAULT:和Spring其他Bean一样,在容器上下文加载时就初始化

DEFERRED:惰性加载,容器上下文启动完成后开始初始化

LAZY:惰性加载,并且延迟注入,容器上下文启动完成接收第一个请求时开始初始化

如日志输出:Bootstrapping Spring Data repositories in DEFAULT mode,默认是随容器启动就开始初始化的,

优化:这里可以根据业务特点,选择延迟加载,参考配置spring.data.jpa.repositories.bootstrap-mode=lazy

Spring Data repository会扫描项目中的实现了repository接口的类,默认情况下会盲扫所有的jar包,日志输出:Finished Spring Data repository scanning in 148ms. Found 0 repository interfaces.打印出了扫描repository接口的耗时情况。

优化:这里可以通过@EnableRedisRepositories(basePackages = "com.taptap")指定扫描的路径,可以显著提升扫描加载的速度

优化点二:关于WebApplicationContext

在spring中,WebApplicationContext是ApplicationContext的增强,由spring-web-mvc实现,增加了servlet、session等web相关的内容。从日志Initializing Spring embedded WebApplicationContext可以看出,我们初始化了一个web容器,而纯Grpc服务用不到Web的容器上下文,所以移除如下依赖即可

优化:移除implementation('org.springframework.boot:spring-boot-starter-web')

优化点三:关于servlet容器

spring-web-mvc是基于java web标准servlet设计架构的。而servlet是由servlet容器来驱动的,常见的servlet有tocmat、jetty、undertow等。从日志中可看出,我们启动了一个8081的servlet容器。这个不应该出现在纯Grpc的服务中,所以,直接移除即可。

优化:移除implementation 'org.springframework.boot:spring-boot-starter-undertow'

优化点四:关于archaius配置组件

从最后一个箭头指向的日志信息可以分析出,项目引入了archaius配置加载组件,所以项目在启动时,archaius会尝试去加载默认策略的配置源。而我们整体的技术栈,配置中心统一采用了apollo,所以可以直接移除,最后通过分析定位,archaius不是单独引入的,是随着spring-cloud-starter-netflix-hystrix一同引入,这个组件是spring-cloud-netflix微服务框架最常用的,但是在这边,目前所有的微服务都是直接注册到k8s容器的,所有服务的熔断、限流、负载均衡都下沉到了容器基数设施平台,所以应用层面虽然引入了这个包,其实没有实际作用,所以最后移除spring cloud相关组件

优化:移除implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'和 implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix'组件、

附优化后的日志输出:

系统资源的变化

优化前的

优化后的

最后,基于资源监控图,从三个维度总结下,优化后的资源占用情况:

资源名称

优化前

优化后

内存

500M左右

250M左右

总线程数

107

78

装载类

12922

10041

springboot设置运行内存_spring boot应用优化,6s内启动,内存减半相关推荐

  1. springboot 压测 50并发 线程等待_Spring Boot中三款内嵌容器的使用

    做Spring Boot的盆友应该都知道,Spring Boot支持三种内嵌容器,有了这几个容器,我们就不需要打成War包再去部署,而是直接执行java -jar jar包即可启动,真是太方便了. T ...

  2. springboot异步注解_Spring Boot 2 :Spring Boot 中的响应式编程和 WebFlux 入门

    [小宅按]Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕. WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可 ...

  3. eclipse中tomcat启动不了_Spring Boot中Tomcat是怎么启动的

    Spring Boot一个非常突出的优点就是不需要我们额外再部署Servlet容器,它内置了多种容器的支持.我们可以通过配置来指定我们需要的容器. 本文以我们平时最常使用的容器Tomcat为列来介绍以 ...

  4. 设置springboot日志级别_Spring Boot 日志框架实践

    概述 Java应用中,日志一般分为以下5个级别: ERROR 错误信息 WARN 警告信息 INFO 一般信息 DEBUG 调试信息 TRACE 跟踪信息 Spring Boot使用Apache的Co ...

  5. springboot默认数据源如何设置连接数_spring boot基于DRUID数据源密码加密及数据源监控实现...

    项目源码路径:https://github.com/Syske/learning-dome-code.git 前言 随着需求和技术的日益革新,spring boot框架是越来越流行,也越来越多地出现在 ...

  6. springboot默认数据源如何设置连接数_Spring Boot系列之配置数据库连接池

    在实际的应用开发中,与数据库交互通常使用数据库连接池来重用Connection对象,减少资源消耗. Spring Boot 的数据源是自动配置的.在 Spring Boot 2.2.1 版本中,有几种 ...

  7. springboot aop使用_Spring Boot 的自动配置,是如何实现的?

    点击上方"IT牧场",选择"设为星标"技术干货每日送达! 作者 | 祖大帅 链接 | juejin.im/post/5b679fbc5188251aad2131 ...

  8. springboot tomcat配置_Spring Boot项目如何同时支持HTTP和HTTPS协议

    本文首发于个人网站:Spring Boot项目如何同时支持HTTP和HTTPS协议 如今,企业级应用程序的常见场景是同时支持HTTP和HTTPS两种协议,这篇文章考虑如何让Spring Boot应用程 ...

  9. springboot日志可视化_spring boot面试问题集锦

    击上方"码农突围",马上关注,每天早上8:50准时推送 真爱,请置顶或星标 译文作者:david  原文链接:https://www.javainuse.com/spring/Sp ...

最新文章

  1. 2021年,Java开发者值得学习的13项技能
  2. Linux从零开始(二、基础命令)
  3. 2008年清华大学计算机研究生机试真题
  4. java中 a_java中 a++ 和 ++a
  5. GNU C 、ANSI C、标准C、标准c++区别和联系
  6. Java编写的统计字符代码
  7. LeetCode 278. First Bad Version
  8. python unicode转字符串_Python2.X如何将Unicode中文字符串转换成 string字符串
  9. UnityGI1:光照烘培
  10. react在线文件_在线IDE开发入门之从零实现一个在线代码编辑器
  11. epsonl360打印机连接电脑_epsonl360打印机脱机如何解决
  12. getvod.php_飞飞影视系统飞飞cms2.8标签大集合
  13. C语言程序——用星号打印图案
  14. aseprite手机版_Voxel像素画体素模型转拼豆图纸方法
  15. 什么是测试场景标准库?
  16. 15张超详细的Python学习路线图,纯良心分享,零基础学习宝典
  17. DeepSort论文学习
  18. PotPlayer不支持S/W HEVC(H.265)解码的解决方法
  19. ArcGIS之修改图层要素名称
  20. Servlet生命周期(图解)

热门文章

  1. 盘点最适宜旅游过年的中国名城
  2. 你是谁的蘑菇,你的蘑菇又在哪?
  3. 北京人工智能产业联盟成立,百度CTO王海峰出任联盟理事长
  4. Qt 快速入门学习笔记
  5. Bose SoundLink Revolve或者Bose SoundLink Revolve+ AUX音频播放一会没有声音
  6. fabric-ca-client 详解动态添加组织
  7. 软件工程第四次作业 石墨文档IOS
  8. Mac 2020版M1 安装虚拟机各种踩坑详解(关注文末小惊喜哟)
  9. 爬虫爬取安居客二手房和新房信息,你是买新房还是二手的呢?
  10. 无需工具:腾讯视频.qlv格式转换成.mp4格式的方法!