Java
文章平均质量分 75
刘莅
黄沙百战穿金甲,不破楼兰终不还
展开
-
爱TA!就为TA搭建一个只属于你俩的IM系统
前一段时间笔者利用业余时间,基于Netty开发了一套基本功能比较完善的IM系统。该系统支持私聊、群聊、会话管理、心跳检测,支持服务注册、负载均衡,支持任意节点水平扩容。正好前一段,网上的一些读者,也希望笔者分享一些Netty或者IM相关的知识,所以今天笔者把开发的这套IM系统与大家分享,并讲述IM系统的基本原理。相信很多朋友对微信、QQ等聊天软件的实现原理都非常感兴趣,笔者同样对这些软件有着深厚的兴趣。另外笔者在公司也是做IM的,每天承载着上亿条消息的发送。github地址:https://g原创 2020-10-16 17:32:54 · 330 阅读 · 0 评论 -
API接口限流
嗨,大家好!今天给大家分享一个高并发系统中必备的技能——限流。在正式开始之前我想问问大家,身为程序员的大家,在周一到周五早上上班进地铁站的时候,有没有见过类似这样的场景?同样,在互联网行业中,也存在这样得场景,我们把它称为——限流,为什么要限流呢,原因如下:在系统上线初期,用户量和访问量不大得时候,一般部署几台应用服务器,数据库做一个读写分离就基本上抗得住,但随着时间的推移,业务的发展,用户量和日活得增加,系统所承受的压力越来越大,我么都知道,应用服务器扩容很方便,但数据库扩容就有些麻.原创 2020-10-15 19:09:26 · 972 阅读 · 0 评论 -
Apache Dubbo系列:集群容错整体架构
本节为大家介绍Dubbo的集群容错的整体架构,让大家对整个集群容错层有一个整体的理解,并且让大家知道,集群容错层是如何工作的,每个组件的作用以及结构。导读在分布式环境中,为了避免单点故障,通常一个业务会部署在多台机器上。服务消费方调用时,如果服务提供方由于某些原因不可用,在Dubbo的集群容错的作用下,会自动根据某些容错策略选择可用的服务给消费方,以达到整个服务集群的高可用。集群容错在讲解源码前,我们先看一下集群容错的整体架构图和每个组件的作用。我们可以把Cluster看作是一个集群原创 2020-07-27 23:57:44 · 385 阅读 · 0 评论 -
Apache Dubbo系列:Netty与Dubbo是如何对接的
在 Dubbo 中,很多扩展点都是通过Dubbo SPI机制进行加载的,比如 Transporter、Cluster、LoadBalance 等。有时,有些扩展并不想在框架启动阶段被加载,而是希望在扩展方法被调用时,根据运行时参数进行加载(按需加载。由于Java SPI机制有性能问题,Dubbo SPI对Java SPI做了一定优化)。Dubbo 会为拓展接口生成具有代理功能的代码。然后通过 javassist 或 jdk 编译这段代码,得到 Class 类,最后再通过反射创建代理类。如果大家对Dubb原创 2020-07-27 23:48:02 · 871 阅读 · 0 评论 -
Apache Dubbo系列:增强SPI
Dubbo良好的扩展性与两个方面是密不可分的,一是Dubbo整体架构中,在合适的场景中巧妙的使用了设计模式,二是使用Dubbo SPI机制,使Dubbo的接口与实现完全解耦。在本次分享中,您可以了解如下知识点 JavaSPI机制 Java SPI机制的缺点 Dubbo SPI配置规范 Dubbo SPI的分类与缓存 Dubbo SPI的特点 Dubbo SPI源码分析 Dubbo对IOC的支持 JavaSPI机制SPI,全称S..原创 2020-07-26 23:08:13 · 385 阅读 · 0 评论 -
Apache Dubbo系列:ZooKeeper注册中心
在Dubbo微服务体系中,注册中心是核心组件之一。Dubbo通过注册中心实现分布式环境中各个服务之间的注册和发现,是各个节点间的纽带。在微服务体系中,注册中心的作用如下: 服务动态加入。一个服务提供者可以通过注册中心动态的将自己暴露给各个服务消费方。 服务动态订阅。服务消费方可以通过注册中心,实时的感知新旧服务的上线与下线。 动态调整。注册中心支持参数的动态调整,新参数将自动更新到所有相关的节点中。 统一配置。提供统一的配置服务。 在Dubb...原创 2020-07-26 22:46:44 · 541 阅读 · 0 评论 -
HashMap部分源码剖析
HashMap基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。HashMap的结构如下:我们可以看到HashMap的结构主要分为两大部分:左侧的table和右侧的链表,下面重点分析HashMap的...原创 2018-05-19 16:36:59 · 9790 阅读 · 0 评论 -
Java内存溢出(OOM)异常完全指南
这也许是目前最为完整的Java OOM异常的解决指南。1、java.lang.OutOfMemoryError:Java heap spaceJava应用程序在启动时会指定所需要的内存大小,它被分割成两个不同的区域:Heap space(堆空间)和Permgen(永久代):这两个区域的大小可以在JVM(Java虚拟机)启动时通过参数-Xmx和-XX:MaxPermSize设置,如果你没有显式设置,...转载 2018-05-22 22:46:30 · 9507 阅读 · 0 评论 -
RabbitMQ中的事务与confirmSelect模式
好久没写技术文章了,由于公司马上要做消息相关的业务,所以最近在Docker上搭了一台RabbitMQ并研究研究。从网易蜂巢上拉取的镜像:docker pull hub.c.163.com/library/rabbitmq:latest启动容器:docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672...原创 2018-08-06 19:34:58 · 13990 阅读 · 1 评论 -
并发编程JUC包源码分析——从AtomicInteger到Unafe
AtomticInteger类我们都知道,在多线程环境中操作一个Integer类型的数据会产生数据不一致现象,比如i++操作,这是因为i++操作并不是一个原子操作,来看下面的例子:public class Main{ public static int i = 0; public static void main(String[] args) throws Excepti...原创 2018-11-22 17:20:37 · 7538 阅读 · 0 评论 -
Dubbo如何正确捕获业务异常
笔者所在的公司,项目正在重构,从一个SpringBoot项目往Dubbo上迁移,但在拆分后发现一个问题,服务消费者(后文用Consumer代替)无法正确捕获服务提供者(后文用provider代替)所抛出的非受检查异常。在未拆分之前,项目都是打成一个jar包运行,service层未处理的unchecked异常,在controller层捕获到后可以正常打印出异常的堆栈信息,方便开发人员快速定位...原创 2019-02-09 21:28:17 · 10889 阅读 · 3 评论 -
【算法面试】TopN问题
竹石 作者:郑燮 咬定青山不放松,立根原在破岩中。千磨万击还坚劲,任尔东西南北风。 前言 又到了一年一度的南北人口大迁移的时候,没有买票的赶紧买票,今年很早就已经回家准备过年了,因为小编已经离职啦,最近正在积极复习找工作,闲话不多扯,开始今天的正题。面试题目:如何在10亿个整数中找出前1000个最大的数。 这就是有名的TopN问题,这样的问题有很...原创 2019-02-01 02:59:01 · 13163 阅读 · 2 评论 -
归并排序(JAVA版)
最近复习算法,为了年后找工作做准备,看了看网上归并排序,只懂算法原理源码没有看懂,算了,还是根据原理手撸吧!!!如果大家想了解其他两种牛掰的排序,请猛戳下面链接快速排序 堆排序归并排序复杂度O(nlogn)public class MergeSort { public static int arr[] = {2,4,7,8,9,4,5,1,2,3,6,8,7,8,54...原创 2019-01-27 17:16:01 · 3055 阅读 · 0 评论 -
快速排序(JAVA版)
快速排序,原理就不介绍了网上一搜一大堆,这里只贴出源码如果大家想了解其他两种牛掰的排序算法,请猛搓下面链接 堆排序 归并排序public class QuickSort { public static void main(String[] args) { int arr[] = {2,4,7,8,9,4,5,1,2,3,6,8,7,8,54,4,2,58,...原创 2019-01-27 18:01:43 · 2870 阅读 · 0 评论 -
【算法面试】二叉搜索树
每一个内心仰望理想的人,都在低头干活 摘要顾名思义,二叉搜索树是由两个孩子节点组成的树状的数据结构,由于其特殊的性质,任意一个节点的左子树的每个节点总比这个节点小,右子树的每个节点总比这个节点大,所以二叉搜索树的查询性能比较好。本文只讲解二叉搜索树,二叉平衡树不是本文重点 正文不得不承认,递归思想在二叉树中展现的淋漓尽致,本文讲解的二叉搜索树主要操作如下:...原创 2019-02-03 22:30:06 · 3031 阅读 · 0 评论 -
堆排序(JAVA版)
堆排序原理就不解释了,大家可以自行查找,建议大家阅读《算法导论》第六章堆排序,很详细哦,在这里直接把源码贴出来。如果大家想了解另外两种牛掰的排序算法,请猛戳下面链接快速排序归并排序 平均复杂度O(nlogn)public class HeapSort { public static int arr[] = {1,7,9,5,4,3,9,8,10,19,15,0,1};...原创 2019-01-29 17:34:25 · 3000 阅读 · 0 评论 -
Netty入门之TimeServer
嗨,大家好!!!最近,上级给我安排了个任务,要把系统中与websocket的的模块独立出来,并用Netty重写,哈哈,从毕业到现在一直做的都是业务方面的开发,这方面的工作还没怎么做过,很高兴的接了这个任务。下面就带大家初识JAVA界大名鼎鼎的Netty,从这篇文章中,大家可以学到的内容如下: 什么是Netty JDK中的I/O的缺点 为什么选择Netty ...原创 2019-03-24 16:56:37 · 2029 阅读 · 0 评论 -
JVM性能调优总结
1.堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。典型设置:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -Xmx3550m:设置JVM最大可用内存为3550M。-Xms3550m:...转载 2018-05-11 19:17:31 · 11166 阅读 · 0 评论 -
redis存储java对象
1、redis要存储java对象,首先要将java对象序列化public class Person implements Serializable { private int id; private String name; public Person(int id, String name) { this.id = id; this.name = name;原创 2018-01-02 20:22:40 · 11569 阅读 · 0 评论 -
Servlet中的Filter技术解决全站乱码
利用Filter解决全站乱码的两种方案1、实现HttpServletRequestWrapper类,增强HttpServletRequest2、动态代理技术,解决全站乱码代码如下1、使用HttpServletRequestWrapper方式CharSetFilter.java 过滤器//servlet过滤器技术解决全站乱码问题public class Char原创 2017-02-25 11:16:36 · 11871 阅读 · 0 评论 -
Servlet中HTML文本字符过滤器
当用户提交的数据中包含关键字符,例如 . & " 等字符,必须对这些字符进行转码,否则在jsp页面显示这些字符时,会以html的语法解析这类字符这里使用Servlet中的Filter解决特殊字符的转码代码如下//Html文本过滤器/* * 如果客户计较的数据是一段html文本或者javascript脚本,传给后台后在页面显示浏览器会自动执行这段脚本, * 所以要将客户提交的ht原创 2017-02-25 11:22:38 · 7603 阅读 · 0 评论 -
JdbcUtils工具类
在Dao层操作数据库时,需要频繁的得到数据库链接,所以自定义一个数据库的工具类JdbcUtils.java有两种方案:1、线程不安全的数据库工具类2、线程安全的数据库工具类代码如下1、线程不安全的数据库工具类db.propertiesdriver=com.mysql.jdbc.Driverurl=jdbc\:mysql\://localhost\:3306/test原创 2017-02-26 10:03:16 · 11855 阅读 · 0 评论 -
DBCP数据源
java中的DBCP数据源,与c3p0数据源类似,需要读取的配置文件dbcpconfig.properties#连接设置driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/testusername=rootpassword=root#initialSize=10#最大连接数量maxActi原创 2017-02-26 10:43:17 · 11210 阅读 · 0 评论 -
Java内省introspector
Java中对JavaBean的属性进行操作时可以使用内省introspector代码如下JavaBean:Person.javaclass Person{ private String name; private int age; private Date birhtday; //省略get/set方法} test1.javapublic void test01() th原创 2017-02-26 10:54:04 · 11228 阅读 · 0 评论 -
MD5与SHA加密算法
当用户提交的用户名和密码后不能直接存入数据库中,需要对密码加密后存入数据库中代码如下import java.security.MessageDigest;import sun.misc.BASE64Encoder;public class MD5{ public static void main(String []args) throws Exception{ String st原创 2017-02-26 11:29:40 · 11340 阅读 · 0 评论 -
Java对象转为Json串
在Ajax的应用中,我们通常需要将JavaBean,List,Map等对象转为Json串,方便页面解析需要导入的jar包有commons-beanutils-1.7.0.jarcommons.collections-3.2.jarcommons-lang-2.4.jarcommons-logging-1.1.jarezmorph-1.0.4.jarjdom.jarj原创 2017-03-24 10:03:05 · 11448 阅读 · 0 评论 -
Java、JavaScript生成二维码
这里使用QRCode方式生成二维码需要导入的jar包的网址:生成二维码:http://www.swetake.com/qrcode/index-e.html读取二维码:https://osdn.jp/projects/qrcode因为这两个jar包的名字相同,所以导入工程时要重命名代码如下生成二维码:public static void main(String[] ar原创 2017-04-01 10:49:41 · 11188 阅读 · 0 评论 -
Java中读取properties文件的两种方式
在Javaweb开发中,通常会把数据库的配置文件等信息写到db.properties文件中,目的是为了解耦,可以在不更改源码的条件下切换数据库在Java中读取db.properties文件通常有两种方式db.properties配置文件username=zhangsanpassword=liuli123456方式1、public class One{ public原创 2017-02-26 10:16:23 · 11429 阅读 · 0 评论 -
线程池ThreadPoolExecutor与java.util.concurrent.RejectedExecutionException异常
BlockingQueue queue = new LinkedBlockingQueue(10);//无界队列 // queue = new ArrayBlockingQueue(10); //有界队列 // queue = new SynchronousQueue(); //默认 ThreadPoolExecutor tpe = new ThreadPoolExecutor(5, 20原创 2017-11-25 15:15:13 · 20276 阅读 · 1 评论 -
双重检查锁定(double-checked locking)与单例模式
单例模式有如下实现方式:[java] view plain copy print?package com.zzj.pattern.singleton; public class Singleton { private static Singleton instance; private Singleton() { } public static转载 2017-12-13 11:14:49 · 11207 阅读 · 0 评论 -
Timer与ScheduledExecutorService
Timer与ScheduleExecutorService,二者都代表定时任务。Timer:public static void main(String[] args) { Timer timer = new Timer(); //继承TimerTask抽象类,覆写run方法,表示一个任务 MyTimerTask timerTask = new MyTimerTask();原创 2017-11-25 16:17:37 · 11378 阅读 · 0 评论 -
c3p0数据源
需要读取的配置文件c3p0-cinfig.xml com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/test root mysqladmin 10 30 20 5 200 com.mysql.jdbc.Driver jdbc:mysql://localhost:330原创 2017-02-26 10:28:15 · 11290 阅读 · 0 评论