自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(105)
  • 问答 (2)
  • 收藏
  • 关注

原创 Spring的全局异常处理

@ExceptionHandler的处理过程DisptcherServlet中service方法会调用dispatch方法,这个方法主要负责了handler方法(controller里的方法)的调用、应用拦截器、异步处理、异常处理等。我们只关心异常处理的部分,其他部分看一看就好。doService代码如下:DispatcherServlet继承了FrameworkServlet,但并...

2019-07-08 11:39:11 572

原创 重新学习javaSE——类型系统

1.java识别类型信息通过两种方式:一是RTTI,所谓的运行时类型识别,另一种是反射。2.RTTI用于实现oop的多态,oop推崇面向接口编程而不是面向实现,面向接口编程可以更好地解耦代码,以达到更高的可扩展性。在多态的情况下,一个接口存在多个实现,实现类通常会向上转型为接口的类型,再通过接口暴漏的api调用实现类的具体方法,即所谓的 “泛化调用”。在语法级别上,RTTI主要应用于三种场景下...

2019-01-02 15:47:39 465

原创 重新学习javaSE——枚举

1.枚举类被编译器自动声明为final,不可被子类继承。枚举类隐式地继承java.lang.Enum,且枚举类中每一个生成的enum元素,都是枚举类中的static & final 枚举类实例,有点像内部类。如果想扩展枚举,只能通过接口实现,枚举默认实现了Comparable接口和序列化接口,可以直接重写其compareTo方法自定义比较逻辑。2.枚举的ordinal可用于表示枚举的声...

2019-01-01 15:14:58 492

转载 SBT相关配置

转自:https://www.cnblogs.com/30go/p/7909630.html开发环境:windows1. 下载sbthttp://www.scala-sbt.org/download.html我使用的是zip包,下载后解压到d:\tool\目录2.添加配置2.1 打开D:\tool\sbt\conf\sbtconfig.txt,在最后添加下面几行配置,注意指...

2018-11-30 16:21:18 414

转载 SSL用pem和key文件生成jks文件

转自:https://blog.csdn.net/long19901216/article/details/79696796    在工作中时长会遇到配置https,我使用的是Tomcat服务器,tomcat服务器一般使用的.jks文件配置SSL加密。但是,https供应商不会直接提供.jks文件。所以,我们就需要将加密文件转换成所需要的jks文件。现将我遇到并解决的相关问题记录下来,仅供各位...

2018-11-06 19:43:32 6714

原创 netty-channel的attachment源码解读

netty的每一个channel都会有一个绑定当前channel的attachment(附件),有点类似ThreadLocal,但在netty里你不能直接用ThreadLocal,因为一个EventLoop可能与多个channel绑定,一个线程可能处理几个channel,这时ThreadLocal无法做到与某一channel绑定。直接上代码吧,attachment用起来很简单,调用channe...

2018-10-30 11:47:54 1008

转载 Reactor线程模型

无论是C++还是Java编写的网络框架,大多数都是基于Reactor模式进行设计和开发,Reactor模式基于事件驱动,特别适合处理海量的I/O事件,netty、redis、nodejs都是reactor模型的典型代表,tomcat的nio也是基于reactor模型的,reactor模型大概可分为三种。1.2.1. 单线程模型Reactor单线程模型,指的是所有的IO操作都在同一个NIO线...

2018-10-27 11:37:46 282

原创 web服务器IO模型随笔

进程是系统资源管理最小单位,线程是CPU调度的最小单位。一个进程中应至少有一个线程,否则该进程无法被CPU调度执行,一个进程中可以有多个线程。进程更偏向于内存管理,每个进程的内存都是相互隔离的,无法互相访问。线程作为CPU调度的最小单位,有些程序是基于进程调度的,一个进程中由一个或多个线程。但进程粒度过高,CPU都是基于时间片转轮法切换进程的,每次切换进程都需要保存程序运行的上下文,如临时变量...

2018-10-21 15:34:13 469

原创 tomcat优化后的worker线程池

tomcat实现了自己的worker线程池,重写了ThreadPoolExecutor的execute部分逻辑,使之更适合web服务这种IO密集型任务。直接贴源码。自定义的ThreadPoolExecutor:/** * Same as a java.util.concurrent.ThreadPoolExecutor but implements a much more effici...

2018-09-27 15:24:17 2438

原创 tomcat源码解析——NIO线程模型

最近在用netty写一些东西,有点好奇tomcat和netty在性能上到底有多大差距,毕竟tomcat也支持nio,都是基于reactor模式的,8.0之后还支持异步servlet(虽然还用不起来),跟netty比应该不落下风,回头看一下tomcat NIO部分的源码。上一章看的是tomcat初始化和start部分的源码,就接着上回的地方看,之前看到的是JIO的init方法,这回直接从NIO的...

2018-09-25 20:56:53 1072

转载 NIO之Selector

--------------------- 转自 江湖人称小白哥 的CSDN 博客 :https://blog.csdn.net/dd864140130/article/details/50299687?utm_source=copy1. Selector简介选择器提供选择执行已经就绪的任务的能力.从底层来看,Selector提供了询问通道是否已经准备好执行每个I/O操作的能力。Selec...

2018-09-25 19:07:54 151

原创 线上问题排查:cpu100%

简单记录下排查过程1.top找到tomcat进程2.假设把cpu吃满的tomcat进程pid是20172,ps -mp 20172 -o THREAD,tid,time查看线程情况,找到把cpu吃满的线程3.上图中的TID需要转成16进制,可以用printf "%x\n",假设把cpu吃满的TheaddId为201744.然后用jstack 20172|grep 4e...

2018-09-19 14:29:31 436

转载 wss连接的一些坑

转自:https://blog.csdn.net/qq_28804275/article/details/80891921  过去的这一个多月里,我的工(开)作(发)任务转战回了游戏。短短的一个月里,催着输出两款h5游戏,再加上对接、联调,想想真是够辛(ku)苦(bi)的。本人负责后端,也就是服务端这块的游戏主流程输出。去年下半年,在前任大佬的带领下,做过一两款棋牌类的手游,虽然目前的运营状况...

2018-09-18 15:32:10 117842 19

转载 Netty的ByteBuf

转自:https://blog.csdn.net/yjw123456/article/details/77843931正如之前所说,网络传输的基本单位是字节。Java NIO 提供了ByteBuffer作为它的容器,但是这个类使用起来比较复杂和麻烦。Netty提供了一个更好的实现:ByteBuf。ByteBuf的APINetty为数据处理提供的API通过抽象类ByteBuf和接口Byt...

2018-09-13 18:53:07 433

转载 两种 NIO 实现:Selector 与 Epoll

我想用这个话题小结下最近这一阶段的各种测试和开发。其实文章的内容主要还是想总结一下 NIO Socket ,以及两种不同操作系统实现 NIO 的方式, selector 和epoll 。问题应该从服务器端开始说起。我们都写过net包下的socket,用socket的accept方法来等待客户端的请求,请求来了则处理,没有则一直等待,然后反复循环。这样的方式,类似于重用进程,要说线程也可以,始终...

2018-09-09 20:16:19 253

转载 MQTT协议发布流程

转自:http://www.blogjava.net/yongboy/archive/2014/02/10/409689.html前言这次要讲到客户端/服务器的发布消息行为,与PUBLISH相关的消息类型,会在这里看到。PUBLISH客户端发布消息经由服务器分发到所有对应的订阅者那里。一个订阅者可以订阅若干个主题(Topic name),但一个PUBLISH消息只能拥有一个主题。...

2018-09-09 10:45:38 836

原创 对REST的一点理解

restful,指的是web开发中的一种接口风格,但凡稍微接触过web开发的都应该了解过。rest是Representational State Transfer的缩写,翻译后意为”表征状态转移“。刚开始接触rest的时候对这个”表征状态转移“一脸懵逼,但现在一看翻译的确实很精准,这个词应该从两方面理解,即”表征“和”状态转移“。表征:Representational翻译过来是”具体的“,...

2018-09-02 13:55:51 259

原创 接口幂等问题

项目代码里类似有这样的业务逻辑... ...Service service1 =serviceDao.getService(serviceId);if(service1.getStatus == 200){ throw new BusinessException("status exception!");}Service service2 =new Service();s...

2018-08-26 14:16:37 330

转载 doublecheck单例由于指令重排产生的问题

转自https://blog.csdn.net/anjxue/article/details/51038466在阅读之前,请先了解下线程并发涉及到的三个概念:原子性、可见性、有序性,可以看下这篇文章:http://www.cnblogs.com/dolphin0520/p/3920373.html我假设你已经看过几篇double check的文章,但还是一知半解。我们先看这种双重检...

2018-08-23 09:52:01 501

原创 记一次mysql锁超时问题

当时的业务场景是要为从腾讯云队列拉取的数据做路由,分发到4个环境里(dev/test/preonline/online),先根据环境从不同的db里查询一条记录,如果记录满足条件则通过rest接口调用不同环境的接口修改该条记录。排查过程:select * from information_schema.INNODB_LOCK_WAITSselect * from information_...

2018-08-21 20:25:43 3911

转载 webRTC协议

如图可见,webRTC协议是建立在websocket协议之上的ICE交互式连接建立Interactive Connectivity Establishment (ICE) 是一个允许你的浏览器和对端浏览器建立连接的协议框架。在实际的网络当中,有很多原因能导致简单的从A端到B端直连不能如愿完成。这需要绕过阻止建立连接的防火墙,给你的设备分配一个唯一可见的地址(通常情况下我们的大部分设备没...

2018-08-07 16:33:35 2853

原创 匿名内部类(闭包)与lambda

以前一直以为匿名内部类传入的参数之所以是final的是由于匿名内部类新开了个线程去处理,现在一看完全不是这么回事public class test<T> { @FunctionalInterface public interface Supplier<T>{ T add(T add); } public Supplier...

2018-08-05 21:27:14 402

原创 ES实时索引原理

目录结构:    data——nodes——indices——shade(lucence分片)    比如:/opt/search/elasticsearch-node1/data/elasticsearch/nodes/0/indices/logstash-custom-2018.07.27/0/index    这里第一个0即是ES的节点,indices是ES的索引,第二个0是两个主分片...

2018-08-05 13:05:47 2609

转载 mysql锁表

    锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。 概述    相对其他数据库而言,MySQL的锁机制...

2018-08-01 15:27:39 164

原创 jdk中的观察者模式和监听器模式

1.观察者模式如图,比较简单,直接看代码,Observer里有一个update方法,需要你手动实现当被观察者被修改时调用的业务逻辑。在调用update时可以传参进去。public interface Observer { /** * This method is called whenever the observed object is changed. An * a...

2018-07-15 20:49:57 2666

原创 关于java与cpu内核的疑惑

        一直以来都有这样一个疑惑,即为什么多线程可以提高程序的运行效率,因为无论开多少线程,都是基于cpu切片时间的,理论上讲,无论开多少线程,由于cpu线程间切换的缘故,其效率都应该不如单线程。        其实这个问题可以分两部分看:        1.程序在运行过程中,cpu不总是满负荷的。假设cpu只有单核,由于各种各样的原因,总是会导致IO资源的阻塞,比如网络太慢,业务代码使用...

2018-07-03 11:06:28 347

原创 ThreadLocal的意义与本质

threadlocal众所周知,可以把变量绑定到某一线程上,thread里有个全局变量threadlocalmap,范型为<ThreadLocal,Object>,threadlocal在执行set方法时先获取当前线程,拿到threadlocalmap,以以身为key把值放到map中,从而实现变量与线程的绑定。关于threadlocal的用法,有这样几种说法。1.传递上下文变量...

2018-06-10 11:33:40 2086

转载 Servlet3 异步原理

一、什么是Servletservlet 是基于 Java 的 Web 组件,由容器进行管理,来生成动态内容。像其他基于 Java 的组件技术一样,servlet 也是基于平台无关的 Java 类格式,被编译为平台无关的字节码,可以被基于 Java 技术的 Web 服务器动态加载并运行。容器(Container),有时候也叫做 servlet 引擎,是 Web 服务器为支持 servlet 功能扩展...

2018-06-02 22:34:32 693

转载 java spi机制(动态接口实现)

SPI 简介SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现,而后,把新加的实现,描述给JDK知道就行啦(通过改一个文本文件即可) 公司内部,目前Dubbo框架就基于SPI机制提...

2018-06-02 20:54:23 2275

原创 tomcat源码解析——初始化

        tomcat作为一个web容器,实现了servlet规范,是对http请求进行处理的关键部分。下面是Tomcat整体架构:catalina类是tomcat处理请求的起点。下面的server是tomcat组件的容器,可以在server.xml中配置多个。service包含了connector和container,connector即连接器,支持http/https/ajp协议...

2018-05-26 11:17:41 528

转载 优化ElasticSearch之合理分配索引分片

原文链接: https://qbox.io/blog/optimizi...转自segmentFault:https://segmentfault.com/a/1190000008868585大多数ElasticSearch用户在创建索引时通用会问的一个重要问题是:我需要创建多少个分片?在本文中, 我将介绍在分片分配时的一些权衡以及不同设置带来的性能影响. 如果想搞清晰你的分片策略以及如何优化,请...

2018-05-20 21:54:18 917

原创 mybatis源码分析

    之前看了看mybatis的日志模块源码,对mybatsi的运行流程也有了一些兴趣,下面我们从sqlsessionFactory开始,看看mybatis是如何实现orm查询的。    一般初始化sqlSessionFactory的代码如下:mybatis的config文件通过Resources类中的静态方法传入,可以接受Reader或者inputStream。然后通过sqlSessionFa...

2018-05-20 14:05:34 125

转载 http请求user_agent字段解析

浏览器的常见User Agent 各字段的解释浏览器的User Agent字段令人迷惑,例如:某一版本的Chrome访问网络时,User Agent字段如下:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.29 Safari/537.36其中既包含多个公司的浏览器...

2018-05-19 17:57:18 8309

原创 深入mybatis日志模块源码

    mybatis打出的日志是这样的:2018-05-18 17:17:09,870|DEBUG|c.i.c.d.m.B.listByKeys|debug|dao|[http-nio-8090-exec-3]|xlk|icu|127.0.0.1|133455757jhbr2ty5|75007|==> Preparing: SELECT * FROM department WHERE i...

2018-05-18 19:41:21 1755 6

转载 对象所占内存空间的计算

基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:Java代码  Object ob = new Object();   这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Ja...

2018-05-13 20:15:20 870

转载 logstash使用es映射模板

在使用logstash收集日志的时候,我们一般会使用logstash自带的动态索引模板,虽然无须我们做任何定制操作,就能把我们的日志数据推送到elasticsearch索引集群中,但是在我们查询的时候,就会发现,默认的索引模板常常把我们不需要分词的字段,给分词了,这样以来,我们的比较重要的聚合统计就不准确了: 举个例子,假如有10台需要的监控的机器,他们的机器名如下: Java代码  search...

2018-05-11 14:39:14 5928

转载 linux nohup命令后台运行

1.nohup用途:不挂断地运行命令。语法:nohup Command [ Arg … ] [ & ]  无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。  如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。  如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不...

2018-05-09 19:16:45 4502

转载 linux安装jdk

由于各Linux开发厂商的不同,因此不同开发厂商的Linux版本操作细节也不一样,今天就来说一下CentOS下JDK的安装:方法一:手动解压JDK的压缩包,然后设置环境变量1.在/usr/目录下创建java目录[root@localhost ~]# mkdir/usr/java[root@localhost ~]# cd /usr/java2.下载jdk,然后解压[root@localhost j...

2018-05-06 11:27:02 157

转载 线程上下文类加载器

前言此前我对线程上下文类加载器(ThreadContextLoader)的理解仅仅局限于下面这段话:Java 提供了很多服务提供者接口(Service Provider Interface,SPI),允许第三方为这些接口提供实现。常见的 SPI 有 JDBC、JCE、JNDI、JAXP 和 JBI 等。这些 SPI 的接口由 Java 核心库来提供,而这些 SPI 的实现代码则是作为...

2018-05-05 16:44:17 142

原创 ELK日志处理平台搭建

日志处理平台可以分成三个部分:shipper:日志收集 broker:中间件/队列 indexer:日志存储日志的功能侧重点:1.快速定位线上log,快速差错,2.对日志进行数据处理,提取整理日志中的重要数据3.提取用户请求整个访问流程的日志,便于分析         最开始考虑了几种架构方案elk+kafka或者reids+mongodb,但后来根据实际业务场景考虑了...

2018-05-04 16:14:52 550

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除