Skip to main content

Java相关日志

ApacheHttpClient的连接池引起Jetty工作线程被耗尽后的TCP的连接状态分析

Submitted by taotao on Tue, 12/25/2018 - 19:10

文章ApacheHttpClient的连接池引起Jetty工作线程被耗尽 中提到的,

如果应用中没有对如下代码中:

HttpResponse response = httpClient.execute(httpHost, httpPost);

response 对象执行如下方法,释放链接:

EntityUtils.consumeQuietly(response.getEntity());

就会导致connection不能回归到connection pool中。

今天对这些不能回归的connection从系统层面进行分析,

看看是处于什么状态。

模拟多次接口调用后,Jetty的工作线程都阻塞在 connectionPool中的get方法调用上:

将基于Spring-Boot开发工程调整成多Maven-Module的实战总结

Submitted by taotao on Sun, 12/23/2018 - 08:47

概述

在基于Spring Boot开发的项目中,为了便于后期的维护, 需要将项目按照模块进行划分,先将项目按照业务逻辑模块进行划分, 然后根据划分的业务模块再基于Maven的Module形式组织工程。

下面主要记录我将UC项目中单Module的Spring Boot工程,调整成多Module的形式的过程, 以及碰到的问题和解决过程。

调整过程

将项目按照如下三个大的module进行划分: API/Core/Web, 其中API定义所有的模块的行为但是不定义如何实现的,Core是基于API中接口的具体实现, Web是提供Http接口服务模块。基于这个边界的定义,自然我们就有如下的上下关系:

    web
     ^
     |
     |
    core
     ^
     |
     |
    api

API模块举例说明,比如我们在该模块中,有一个子模块为api-authentication, 该模块主要定义了和用户认证逻辑的所有业务接口,比如:

kingshard的连接问题调查(一)

Submitted by taotao on Sat, 12/22/2018 - 10:05

cat-head

kingshard是一个基于mysql读写分离的中间件,公司目前按照目前的体量和发展速度, 急需要一个能够支持读写分离的中间件支撑业务的发展需要,在各种背景下,我们目前选择了 kingshard作为首先验证的一个中间件。 为了验证kingshard的稳定性,先在内网的环境部署kingshard服务, 然后让项目使用kingshard进行验证,内网的开发环境、测试环境都是使用频次比较高的环境,打算在这两个环境中验证1-2个星期看稳定性如何。在这个过程中频繁出现如下的 错误:

ApacheHttpClient的连接池引起Jetty工作线程被耗尽

Submitted by taotao on Fri, 12/21/2018 - 20:28

tomjerry

概述

12月20日下午2点到4点左右,商城商品的商品评论不能被加载出来,当时生产环境有3个商品服务的实例,根据日志报错信息来看,有大量的超时

报错信息,超时是由于调用用户中心的服务接口导致的,再排查用户中心的服务的状态,发现用户中心的3个服务的网络流量比平时都大了10倍,

为了尽快恢复服务,将用户中心的服务再平行扩展出一个节点,然后再将商品评论的3个服务中的两个重启,保留一个服务作为问题调查的现场。然后线上

如何调整Spring-Data读请求不开启事务

Submitted by taotao on Tue, 12/11/2018 - 20:05

概述

接着上一篇的文章MyCAT-Spring-Boot-JPA中间件使用过程的问题提到的问题, Spring Data 默认会对所有的读数据请求加上事务, 但是在使用类似MyCAT、KingShard的读写分离中间件的时后, 会将带有事务的请求都发送到主库上去,而达不到读写分离需求。 因此我们需要对Spring Data进行一定的改造,能够让读数据的请求不被事务包裹, 而达到利用中间件读写分离的目的。

基于之前的文章MyCAT-Spring-Boot-JPA中间件使用过程的问题中的分析, 我们发现SimpleJapRepository是在类级别加上了@Transaction(readOnly=true)的标注, 这会导致所有的 读请求都被事务包裹,所以我们需要将这个默认的设置删除掉。

openjdk编译后出现的中文乱码问题及解决过程

Submitted by taotao on Mon, 12/10/2018 - 18:45

概述

项目的打包是通过Jenkins进行的, 由于对Jenkins进行了一次升级和数据迁移之后, 凡是在Java类中有中文字符输出的地方,都变为乱码。 乱码问题是发生在升级迁移之后, 后来通过在jvm的启动参数追加-Dfile.encoding解决该问题,下面是问题的详细分析过程:

发生问题之前的打包环境

[root@server ~]# java -version
java -version
java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)

Jenkins版本为2.53,启动方式为

SpringBoot-Async-线程池爆满问题解决过程

Submitted by taotao on Fri, 12/07/2018 - 19:32

问题概述

前几天生产环境的购物车服务突然不能正常访问,分析日志中的报错信息,发现是购物车使用的异步工作线程池的队列达到了设置的上限, 致使新的http请求生成的task不能被继续放入到线程池的队列中。这是直接的报错原因,深入分析日志,发现有大量的超时错误,这些超时错误 都是发生在购物车服务调用另一个用户中心服务时发生的。所以问题是由于大量的超时请求将工作线程池中的线程消耗光导致。 故障发生持续了10-15分钟,最后是以重启购物车服务的方式恢复服务。

下面就基于该问题进行详细的分析过程。

超时错误分析

首先查看问题发生时的错误日志信息,在20:00 至 20:05 之间,从日志系统统计下来有大概1600 到 1700条超时的错误日志

如何创建maven plugin

Submitted by taotao on Tue, 12/04/2018 - 21:34

本文主要介绍如何创建一个简单的maven插件

需要提前准备好如下内容

  1. 安装好maven的环境
  2. 安装好idea或者eclipse
  3. 搭建好neuxs服务

首先在控制台执行命令:

mvn archetype:generate

该命令会生成一个maven plugin的骨架项目。 在命令的执行过程中,会提示需要你选择一个项目类型,我们这里输入: maven-archetype-plugin 然后再选择生成的是什么类型的插件和对应的插件的版本号。

再利用idea导入刚生成的maven 工程,找到源码MyMojo.java,这个类是在maven工程的输出目录中创建一个 touch.txt文件。

我们先不对这个类做任何改动,让该插件可以在项目中执行,可以快速体验下如何执行一个自定义的插件的过程。

我们进入刚生成的目录 demo-touch中,然后执行:

 mvn clean install

这个命令会生成该插件jar包到本地的maven仓库中。