Java Web技术经验总结(二)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

该系列的第一篇在此:Java Web技术经验总结一,主要包含我在日常工作中的经验和心得体会(如有不足之处欢迎指出)。

  1. Maven的使用经验

    • 依赖的scope有test、provided、compile等。test:一般是单元测试场景使用,在编译环境加入classpath,但打包时不会加入,如junit等;provided:表示容器或者JDK已经提供该依赖,打包时不需要打包入war;compile:默认范围,在工程环境的classpath(编译环境)和打包(如果是WAR包,会包含在WAR包中)时候都有效。
  2. JVM相关参考资料

  3. JVM观察和调试相关的命令

    • 排查full gc问题,可以通过命令jstat -gccause java_pid 1s查看gc发生的原因
    • 观察gc.log的时候:(1)GC开头的都是Young GC;(2)CMS-initial-mark标识,且没有full字样的,是old区的GC;(3)带full字样的是fgc(例外情况:-XX:+ExplicitGCInvokesConcurrent,这个参数会把full gc转成cms gc,因此gc.log中不会有full gc字样)。
    • 查看JVM进程:ps -ef|grep java
    • 查看JVM内存占用信息:
      sudo -u admin /opt/taobao/java/bin/jstat -gccause ${PID} 1000 1000
    • dump内存:
      sudo -u admin /opt/taobao/java/bin/jmap -F -dump:live,file=/home/admin/heap.bin ${PID}
  4. 线上机器每隔一个小时full gc问题排查

    • 参考文章
    • 排查思路
      • 首先,怀疑jdk版本问题,升级之后依然存在,排除
      • 第二,怀疑tomcat版本问题,由7.0.26.1升级到7.0.54.1之后消失
      • 分析gc.log,每隔一小时出现一次cms收集,最开始认为这不是full gc;后查询资料发现ExplicitGCInvokesConcurrent选项会将full gc转换成cms gc,因此gc.log中没有“full gc”字样;然后根据参考文章1和参考文章2定位问题。
    • 结论:tomcat 7.0.26.1版本中的JreMemoryLeakPreventionListener,该监听器每隔一个小时会触发一次System.gc()。根据tomcat官方的bug fix报告可知,在7.0.28版本将该间隔fix成Long.MAX_VALUE了。
  5. 在单元测试中加载配置文件

    • 在spring项目中,使用Mockito+JUnit测试业务逻辑时,有时需要读取一些外部配置文件(例如biz.properties),可以参考Spring下的单元测试(JUnit)--加载配置文件
    • 可以考虑使用@Properties定位配置文件、使用@Value注入配置属性;不过在这种情况下,需要解决不同环境下的属性配置问题;
    • 可以考虑通过暴露set接口,在单元测试中设置对应的属性,从而避免处理外部配置文件的先关技术。
  6. Mockito + Spring + AssertJ是Spring项目中写单元测试的最佳组合,优点有:轻量、简洁、可以测试web层(拦截器、过滤器等)、可以测试异常分支。

  7. log4j中的日志级别有:DEBUG、INFO、WARN、ERROR(级别依次变高),在生产环境中一般采用ERROR级别、在开发环境中使用DEBUG级别。如果日志级别为DEBUG级别 ,则代码中的logger.debug()logger.info()logger.warn()logger.error()等日志都会打印;如果日志级别为WARN,则只会打印WARN和ERROR日志。参考:日志级别的选择

  8. 给Controller的@RequestMapping方法加日志,通过AOP不容易加(有解决方案),一个比较迂回的方法是,让Controller使用一个Service代理(包含一个process方法),拦截这个process方法比较容易。

  9. Java Web的最佳实践:Spring Boot + Thymeleaf,基础技术包括:Spring + HTML + CSS。JSP,Velocity和FreeMarker,那是上一代的模板引擎,应该尝试一下新的东西。参考:Thymeleaf官网

  10. 数据库部分,企业级Java Web要求的知识架构很多,后端就包括数据技术,最常用的是关系型数据库MySQL,可以阅读下列文章补充一点知识点。当然,最常用、最有效的参考资料是官方文档。

  11. 常用概念,PV:请求次数/day;UV:不同uuid的个数/day。对于自己负责的业务,有两个日志是必须的:BI日志和业务监控日志——BI日志用于计算业务指标,可以指导运营和产品的动作、业务日志用于研发同学监控自己服务的稳定性、机器的使用率、接口的QPS等指标。

  12. 服务的稳定性,需要良好的监控保障,主要包括几个方面:系统监控、应用监控(JVM)、业务监控(PV/UV/RT)和调用链路监控等。



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
17天前
|
Java API
Java技术体系
Java技术体系包括运行于Java虚拟机上的各种语言及其相关程序,传统上由Java程序设计语言、Java虚拟机、Class文件格式、Java API类库以及第三方类库组成,可进一步细分为Java Card、Java ME、Java SE和Java EE四个平台。
32 3
Java技术体系
|
1天前
|
SQL 缓存 搜索推荐
后端技术在现代Web开发中的应用与挑战
本文将深入探讨后端技术在现代Web开发中的重要性,涵盖从基础架构到性能优化的多个方面。通过分析当前主流后端技术的优缺点,并提供一些实用的解决方案和建议,帮助开发者更好地应对日常开发中的挑战。
11 1
|
7天前
|
安全 JavaScript Java
后端技术在现代Web开发中的实践与挑战
本文旨在探讨后端技术在现代Web开发中的关键作用,分析其在数据处理、业务逻辑实现和系统安全等方面的重要性。通过阐述常见的后端技术和框架,如Node.js、Django和Spring Boot,展示它们在实际项目中的应用。同时,文章将讨论后端开发所面临的主要挑战,包括性能优化、扩展性和维护性问题,以及如何应对这些挑战。最终,通过对实际案例的分析,总结出一套行之有效的后端开发最佳实践,为开发者提供参考。
29 5
|
7天前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
21 2
|
7天前
|
人工智能 关系型数据库 数据安全/隐私保护
后端技术在现代Web开发中的应用与挑战
本文将深入探讨后端技术在现代Web开发中的重要性,通过分析其在数据处理、业务逻辑实现和安全性保障方面的应用,揭示后端技术的核心价值。同时,本文还将讨论当前后端开发面临的主要挑战,如高并发处理、数据安全、微服务架构的复杂性等,并给出相应的解决方案。无论是后端开发者还是对后端技术感兴趣的读者,都可以通过这篇文章获得启发和指导。
|
11天前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
11天前
|
算法 Oracle Java
Java字符串拼接技术演进及阿里巴巴的贡献
本文主要讲述了Java字符串拼接技术的演进历程,以及阿里巴巴贡献的最新实现 PR 20273。
|
15天前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
16天前
|
算法 Oracle Java
Java字符串拼接技术演进及阿里巴巴的贡献
本文主要讲述了Java字符串拼接技术的演进历程,以及阿里巴巴贡献的最新实现 PR 20273。
|
18天前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
43 7