- 博客(38)
- 资源 (1)
- 收藏
- 关注
原创 IoT MQ实现篇:Jmqtt设计与源码阅读指导
一、概述本篇是第一篇,主要介绍jmqtt架构思想和一些模块介绍,帮助一些需要使用jmqtt的同学更好的理解Jmqtt,方便问题排查和二次开发。二、Jmqtt架构思想Jmqtt主要分为四大块,上层用netty做协议编解码和与设备间的通信,接收到mqtt报文后进行协议处理及消息分发处理,并对一些mqtt元信息做存储管理等。请先阅读理解mqtt协议,再结合代码一起看,方便理解。三、Jmqtt模块介绍主要关注Jmqtt-broker即可,相关的代码都在这里四、Jmqtt-brok
2021-03-15 20:41:58
798
1
原创 领域驱动设计-从分层架构聊起
一、概述对于比较复杂的业务流程,传统的分层架构等在后续代码可扩展性,可维护性,可测试上存在很大的问题,最近也在学习和研究领域模型相关的设计,实践总结一下。代码仓库:Jmqtt,只关注其中的jmqtt-admin模块即可,欢迎老铁给个star二、传统的分层架构如图:这是一个极简的三层架构模式,每层的关系和职责大约是:WEB层(Controller层):提供http接口给外部,处理参数的接收和响应;依赖业务层;与之类似的层包括:Gateway层,OpenAPI层,服务层(提供RPC给
2021-03-01 23:35:12
793
原创 IoT MQ实现篇:Jmqtt3.x升级总篇
欢迎关注Jmqtt并给个star背景之前没怎么运营,纯属感兴趣做的broker,发现star,感兴趣的朋友还挺多的。 之前的版本木有代码注释,木有技术文档,木有测试,不能开箱即用 mqtt5标准版都出了一版了,支持一波目标jmqtt3.0的版本将分为三个大的阶段进行开发发布:目标第一阶段:架构重构 jmqtt3.0版本将实现基于db/redis的存储/集群,基于db的只要有数据库,开箱即用:集群节点理论上可横向扩容(依赖db的性能),理论上集群可支持百万级设备;基于redis的性能更高
2021-02-26 14:52:31
542
2
原创 IoT MQ设计篇:最终架构与jmqtt介绍
概述本篇是IoT MQ设计篇的最后一篇,前面分别介绍了一些IoT MQ的基本信息以及趟过的开源项目的坑,本篇主要介绍下我们在经历一系列问题后确定的最终架构以及我开源的jmqtt项目的介绍: 最终架构的确定 jmqtt介绍 为什么选择主主架构 最终架构在经历对moquette的深入二次开发后,我们发现仍然有很多需求不能满足,但是却掌握了很多基于mqtt协议的开发...
2021-02-26 14:48:46
4493
8
原创 IoT MQ设计篇:基于开源项目二次开发的坑
概述在对开源项目进行一些调研后,结合实际情况,我们选择了基于Moquette进行开发,本篇主要从以下两个个维度介绍在二次开发遇到的问题: moquette介绍,为什么选择moquette 从选择到放弃,趟不过去的坑就不趟了吧 moquettemoquette是一个用java和netty实现的mqtt broker,主要特性有以下几点: 基本完整支持了mqtt协议...
2021-02-26 14:48:37
2265
原创 IoT MQ设计篇:开源or自研,系统复杂度分析
概述上一篇介绍了IoT MQ的一些基本知识以及与Kafka这类“系统级别”的MQ的区别,同时简单介绍了使用最广的两种物联网通信协议coap与mqtt并最终决定使用mqtt作为基础协议,本篇主要介绍IoT MQ在进行设计时考虑到的一些问题: IoT MQ需求及系统复杂度分析 开源or自研 需求及系统复杂度分析因为初始阶段对于IoT MQ并不是很了解,也从未涉及过物联网领域...
2021-02-26 14:48:23
1868
原创 IoT MQ设计篇:调研与协议选型
概述本篇是IoT MQ系列的第一篇,本篇主要从以下几个维度介绍下IoT MQ: IoT MQ和Kafka,RocketMQ,RabbitMQ这些消息队列有什么区别 目前IoT的传输协议有哪些,有什么区别,如何选择合适的协议作为基础协议? IoT MQ的适用场景有哪些? IoT MQ到底是什么东东IoT MQ(Internet of things message...
2021-02-26 14:48:07
1543
4
原创 IoT MQ实现篇:组件选型与插拔式设计
IoT MQ实现篇:组件选型与插拔式设计概述本篇是IoT MQ内部实现篇的第一篇,实现篇主要介绍在内部设计和实现时对很复杂的功能点的设计与考虑,也是jmqtt的内部的具体实现,本篇主要介绍:模块化与各个组件的选型模块插拔式的设计模块化与各个组件的选型模块化和组件两个概念总是在设计架构时会讨论到的两个概念,一般来说,模块化是指功能上的拆分,将各个功能拆分为模块,组件化指根据模块对于技...
2021-02-26 14:47:38
1207
2
翻译 MySQL Daemon failed to start
MySQL Daemon failed to start在linux-centos6.5安装mysql时,最后启动的时候出现:MySQL Daemon failed to start这个问题有点坑,stackoverflow执行下面这个命令再启动就OKinstall -m 0700 -o mysql -g mysql -d /var/lib/mysql-files再启动...
2018-12-07 16:26:56
553
原创 Redis使用实践
Redis使用实践场景一:数据缓存在使用Redis时,利用Redis作为系统的分布式缓存组件是非常多的,主要解决两个问题:数据量太大时,与关系型数据库的大量交互会产生一定的性能瓶颈问题。本地缓存可能导致数据不一致的问题。在之前使用Redis做数据缓存时,主要是两个应用方面:大量的查询数据,利用Redis对这些数据做缓存用户会话信息的保存,在用户登陆后的session会话信息,利用Redis做ses...
2018-06-12 14:25:59
847
原创 系统优化实践记录—JVM
系统优化实践记录—JVMjvm方面的优化往往是系统优化的最后一步,万不得已时才会基于JVM去优化系统,在对mqtt系统进行优化时,也是仅仅对jvm层面进行了少量的修改。下面总结记录一下一、设置合适的JVM大小设置合适的堆的大小:主要涉及三个参数:-Xms:设置JVM的初始化内存的大小,JVM启动时就会分配这么大的内存-Xmx:设置JVM最大可用内存的大小,JVM在运行期间如果内存超过-Xms设置的...
2018-05-23 01:45:47
420
原创 系统优化实践记录—多线程方面的处理
系统优化实践记录—多线程方面的处理因为mqtt也是一种适合于物联网的mq,简单来说是比较轻量级的mq,对于消息的tps等没有像传统mq那么高,但是要求的是多终端,其中也涉及了很多多线程地方的处理。这里总结和记录一下。一、netty的多线程处理与设置在netty中,有两个EventLoopGroup,维护了两个线程组,如果不设置初始化的大小,那么默认初始化的线程数的大小为:系统内核数*2,如果现在主...
2018-05-23 01:45:21
384
原创 系统优化实践记录—日志
系统优化实践记录—日志在决定使用该开源项目后,首先熟悉了项目的架构,然后在阅读源码的过程中,发现日志打印十分不规范,同时对日志的使用也很差,于是,我利用jmeter和jvisualvm在windows机器上进行了简单的测试。发现写日志的时间占据了整个系统执行时间(CPU)时间的40%多,于是,首先便是对日志的重构。 PS:这里主要用jmeter进行压力测试,用jvisualvm监控java程序的方...
2018-05-10 21:40:20
1074
原创 系统优化实践记录
系统优化实践记录—引言从2017年11月初截至2018年5月,一直在从事一个mqtt消息中间件项目的开发,整个项目从最初的开发到如今稳定的运营也经历主要四个阶段,这里总结下在对系统进行优化时的一些处理。四个阶段主要有开源项目选型,最终综合选择了一款开源但是不成熟的mqtt代理作为开发的原型。存储实现与优化,由于开源的不支持集群和数据的持久化(持久化实现的很差),我们自己实现了数据的持久化和集群。对...
2018-05-10 20:28:37
333
原创 抽象类与接口的异同及实践
抽象类与接口的异同及实践一、相同点 都不能被实例化二、不同点抽象类可以定义具体的方法,(jdk8以后,接口也是可以定义具体的方法的,必须有default关键字)接口是implements,抽象类是extends设计理念不同,接口是“has-a”,抽象类是"is-a"抽象类可以有构造器,接口没有,抽象类的构造方法是不能直接实例化的,但是一旦一个具体的类继承了抽象类,那么就可以在子类中调用抽象类的构...
2018-04-24 22:09:28
320
原创 java中==和equals和hashcode的区别
一、相同点都是用来进行值或对象的比较。二、不同点对于“==”而言,对于基本类型(char,byte,short,int,long,float,double,boolean),对比的是值,所以是相等的,对于引用对象,对比的是引用的对象的堆地址,例如:public class Main { public static void main(String[] args) throws Interr...
2018-04-24 21:31:58
289
转载 事物—事物的传播性与Spring事物传播特性
事物的传播性我们都知道事务的概念,那么事务的传播特性是什么呢?(此处着重介绍传播特性的概念,关于传播特性的相关配置就不介绍了,可以查看spring的官方文档) 在我们用SSH开发项目的时候,我们一般都是将事务设置在Service层 那么当我们调用Service层的一个方法的时候它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,在事务层里面调用的这些方法要么全部成功,要么全
2017-08-03 20:25:24
621
原创 事物—事物的隔离级别
四个隔离级别脏读,重复读,幻读的含义一个客户端session会对应产生一个数据库端的server process。同时产生一个事物来处理session的操作。当系统并发量十分大时,就可能会发生上面的读数据的错误。
2017-08-02 22:07:43
459
原创 事物—事物四大特性
事物(一)——事物四大特性原子性(Atomicity)原子性是事物最小的单元,是不可再分的,对一个数据库小的操作。这些必须同时完成,如果有一个失败了。则一切的操作都全部失败。比如A给B转账,A是一个操作,B也是一个操作。A转账失败,则B接帐也失败一致性(Consistency)指在数据库操作前后是完全一致的。这个一致可以理解为对数据库操作的有效性。如果事物正常操作则系统会维持有效性,如果事物操作失败
2017-08-01 22:56:33
4076
原创 linux安装pcre
1.获取pcre: 最新版本为8.40wget https://netix.dl.sourceforge.net/project/pcre/pcre/8.40/pcre-8.40.tar.gz2.解压:tar -zxvf pcre-8.40.tar.gz3.编译: 进入pcre-8.40目录make4.安装:make install
2017-03-08 10:15:55
20912
转载 bootstrap-paginator分页插件运用-一个网上的资料里的
需要引入jquery,bootstrap.css和bootstrap-paginator.js文件 html: <div style="text-align: center;"> <ul id="pageHelper" style="cursor:pointer;"></ul> </div>js: $(function(){ var elem
2017-02-27 14:10:11
411
原创 springboot与mybatis整合dao层不能注入的问题
需要重写VFS,并将其在mybatis整合类中指定为VFS的实现类public class SpringBootVFS extends VFS { private final ResourcePatternResolver resourceResolver; public SpringBootVFS() { this.resourceResolver = new Path
2017-02-27 14:03:18
7071
1
原创 AES加密在linux上的问题
AES加密在Linux上加密和解密都必须加上 KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); random.setSeed(encryptKey.getBytes()); k
2017-02-27 13:59:28
1837
1
原创 java基础之几个基本概念
三大特性封装概念:把客观事物封装成抽象的类,并且类可以让自己或自己的方法或字段让其它类进行操作。 用法:private default protected public关键字定义在类,方法或字段上。 作用:增强了安全性,提高可用性和可控性,提高了可维护性和可复用性继承(is-a)概念:一个类继承另一个类的方法或字段(私有不行),可以使用父类继承的所有方法和字段。 用法:extends继承类,i
2016-12-22 22:30:18
313
原创 初探JVM之垃圾收集器
前面大约了解了下JVM的垃圾收集算法,如果说收集算法是内存回收的方法,那么垃圾收集器就是内存回收的具体实现。现在HotSpot虚拟机都是用的G1收集器。 这里先总结下具体收集器的使用地方: 新生代:Seria,ParNew,Parallel Scavenge. 老生代:CMS,Parallel Old,Serial Old(MSC) 其实从它们处于不同的堆的代也大致能猜出它们使用了那些算法!
2016-03-11 20:40:17
385
原创 初探JVM之垃圾收集算法
当垃圾收集成为系统达到更高并发量的瓶颈时,就需要对“自动化”的技术实施必要的监控和调节。 引用计数算法 就是对一个对象添加一个引用计数器,每当有一个对象引用时,计数器就加1,引用失效时,对象减一,当计数器为0时,代表不可能再被使用,就开始回收。 但是在主流java虚拟机里面没有选用引用计数算法来管理内存,因为它很难解决对象之间相互循环引用的例子,比如objA.instance = objB,o
2016-03-10 10:35:25
449
原创 初探JVM之对象的创建
对象的创建 虚拟机在遇到一条一条new指令时,首先先检查该指令的参数能否在常量池中定位到这个类的符号引用,并检查该类是否被加载,解析,初始化过,若没有,则先加载。 若类加载检查通过,则将为新生对象分配内存,对象所需内存的大小在类加载完后就可确定,有两种方式,第一种是“指针碰撞”,指针碰撞方式指在分配内存时,就像一边是用过来的,一块是没用过的,中间有一个指针是分界线,在需要新分配一块内存时,指针就
2016-03-10 09:33:07
444
原创 重温javase—MySQL数据库基础
MySQL语句基础 DML(数据操作语言):inset、update、delete DDL(数据定义语言):create、alter、drop、truncate DCL(数据控制语言):grant、revoke ENGINE= MyISAM,强制使用MyISAM存储机制。 ENGINE=InnoDB,强制使用InnoDB存储机制(默认)DDL语句 常见的数据库对象:表(table)
2016-03-07 23:12:02
509
原创 Java设计模式之桥接模式(Bridge)
意图 将抽象与抽象方法的实现相互分离来实现解耦,以便二者可以相互地变化。 书上说的太抽象了,直接写个例子来总结。
2016-03-05 19:20:49
422
原创 初探JVM之java内存区域
这些理解都是基于学习《深入理解Java虚拟机》的,因为很多还不能理解,这里以及后面就只总结我可能常用到或要分析的最重要是我理解到了的~~。 Java运行时数据区域 方法区、虚拟机栈、本地方发栈、堆、程序计数器 他们有的随着虚拟机进程的启动而存在,有的则依赖用户线程的启动和结束而建立和销毁。 程序计数器 这是一块较小的内存空间,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行
2016-03-04 09:01:08
366
原创 Java设计模式之合成模式(Composite)
意图 为了保证客户端调用单对象与组合对象的一致性 黑猫的理解 就是相当与一棵大树,把树干和树叶组合到一起,统一管理。要管理,就需要getComponent,removeComponent,addComponent等方法,合成模式主要分为安全式和透明式(不安全)的,由于要想要满足这种方式,一般都是透明式的 写个例子 树干,统一管理的//定义树干public abstract cl
2016-03-03 14:16:12
475
原创 SpringAOP动态代理小结
学习springAOP时,顺便学习了jdk与cglb动态代理,jdk与cglb动态代理最大不同之处就是jdk动态代理是基于接口的,如果有的项目不是基于接口又想实现动态代理,就需要cglb动态代理,这里总结下AOP的动态代理。 springAOP动态代理实现方式 是基于jdk与cglb的,就是选它们一种来实现。这里涉及两个属性proxyTargetClass属性,若为true,则是面向类动态代理,
2016-03-02 18:08:03
957
原创 jdk动态代理与cglib动态代理
最近学习springaop的知识,看到了其中的aop的代理的实现,现在总结一下,aop的代理其实就是用jdk的动态代理或者cglib动态代理来实现的,所谓的代理就是来给某个方法,在执行这个方法之前多一些事,在执行这个方法之后做一些事,下面各个分析一下: jdk动态代理 jdk动态代理需要4样东西,1.目标对象,2.织入类(用于增强),3.代理类,4、接口,下面写一个服务员问好的例子//目标
2016-03-01 13:19:02
451
原创 Java设计模式之外观模式(Facade)
Facade的意图 为子系统提供一个接口,便于它的使用。 比如医院看病,咱们不知道医生的话是不是直接找接待员呢?,这个接待员再找适合医生来看病,直接上代码,清晰易懂: 几个医生类,不同医生不同职责public class Doctor1 { /* * 作为一个医生的职责 * */ public void kanBing(){ System.o
2016-02-29 13:44:32
423
原创 Java设计模式之适配器模式(Adapter)
上课的时候不能撸其它代码,只能看下java设计模式的书,网上也有很多总结好的,但觉得自己总结一遍能收获的更多,下来慢慢总结下这些设计模式。之所以叫接口型模式,是因为这些设计模式都需要用到Interface。 适配器模式的意图 使用不同接口的类所提供的服务为客户端提供它所期望的接口 Adapter之类的适配器 比如一个客户找到黑猫要一件衣服,要求这件衣服必须要有拉链,扣子,高领(in
2016-02-28 23:16:42
394
原创 Java国际化与spring框架国际化的处理
今天学习springIOC时学习到了其国际化的用法,这里总结下自己学习到的知识点, 这里先上两种简单的格式化 日期格式化 //日期格式化,得到当前系统时间,转换成想要的格式,一般放在项目中的util包里 String date = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date());
2016-02-28 20:09:25
1782
原创 ajax与json的学习总结
最近重温了下ajax与json技术,发现又收获了不少,这里记录下,我是一只接触编程8个月的小白,如有错误,还请指出,后面直接上干货。首先,为什么要学习ajax与ajax的优势? 以我自己的理解,其实ajax就是方便数据从前端传递到后端。在java中,主要有两种。第一种就是通过html的form表单,通过submit直接传输到后端,但是这个提交有一个坏处,就是服务器端(servlet端)返
2016-02-27 12:41:16
9785
4
Redis-2.8,linux版本下载
2017-05-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人