Mac八种邮箱客户端对比 有更新!

  |   0 评论   |   1,875 浏览

Mac也用了一年多了,邮箱客户端之前用的是网易邮箱,但是不太满意,感觉功能不太全面,不太能够满足我的需求。于是去网搜集了下mac上可选的八种邮箱客户端,这里统一做一个对比,看看有没有什么可以替代的,也为大家做一个参考。

NIO知识点总结

  |   0 评论   |   435 浏览

NIO允许使用单个或者少量的线程去管理多个channel(网络请求/文件),代价是相对基于流的方式,解析数据变得更加复杂。

对于单个socket连接来说,不考虑zero-copy的因素,引入NIO实际会增加请求延时,降低吞吐量。所以如果是写一个客户端程序,完全可以用BIO来降低编程的复杂度。

但如果你需要管理的是成千上万的连接,每个连接只有少量的数据。最典型的就是类似于聊天室这种应用,NIO就具有非常明显的优势。

Kotlin vs Java

  |   0 评论   |   275 浏览

发现一个给Java工程师,快速学习kotlin,掌握其语法的网站:

https://www.kotlinvsjava.com/index.html

特别nice,通过与Java代码进行对比的方式,很直观的表现了Kotlin语法的精髓。差不多只需要半小时,就可以比较清楚的Kotlin语言的主要语法了。

我过了一遍之后,发现其在Java语言的基础上,有大量python、go语法的影子,简化了大量Java中模板化的语法,真的很亲切。

当然如果需要深入学习,肯定还需要参考更多的书籍,但是入门这一个网站就够了。

如何实现一个Spring Boot Starter 有更新!

  |   0 评论   |   636 浏览

在实现Spring Boot Starter之前,首先要明确实现Spring Boot Starter是干嘛用的?

Starters是一些便捷实用的依赖,可以在工程中引用。你可以通过Starter,直接得到你所需要的Spring以及相关技术的一站式服务,而不再需要通过复制样例代码和依赖的方式。举个例子,如果你需要使用Spring和JPA来进行数据库访问,只需要在工程中引入spring-boot-starter-data-jpa依赖即可。

Spring Boot启动原理解析

  |   0 评论   |   691 浏览

与传统的web应用服务部署不同,Spring Boot提供了java -jar 这种方式的一键部署,不再需要单独部署tomcat实例,使得部署变得相当简单。这背后究竟是如何实现的呢?要想分析这个问题,我们需要先了解Spring Boot打包后的jar文件,究竟是什么样子的。

JVM-类加载机制 有更新!

  |   0 评论   |   503 浏览

今年网上充斥着各种令人焦虑的中年危机新闻,很自然的影响到了我。思来想去,还是需要提升自己的核心竞争力。稍微出去面了一下,看看自己竞争力还够不够,发现了问题比我想象中还要严重,随便问两个问题就能把我难倒。原因在于随着时间的流逝,好多以前倒背如流的知识点,现在不给点提示,我自己压根想不起来。这背后的原因,并不能简单用没有持续学习来搪塞的,因为问到的知识点也没有多深入,刚毕业那会儿就很清楚了。这当然是自己工作中疏于总结,疏于温故知新造成的。所以我决定从近期开始,对自己的知识体系重新开始梳理。就从这篇JVM的类加载开始吧~~

Hotspot JVM 1.8参数查阅手册 有更新!

  |   0 评论   |   981 浏览

这里整理下JVM相关的参数信息,本文档使用的是MAC OS平台的Hotspot JVM,版本为1.8.0_181。

Hotspot JVM有两种运行模式,分别是server和client。
它们的区别是server的初始堆空间会大一些,默认使用的是并行垃圾回收器,启动慢运行快。client VM相对来讲会保守一些,初始堆空间会小一些,使用串行的垃圾回收器,它的目标是为了让JVM的启动速度更快,但运行速度会比server模式慢些。
可以使用-server和-client选项来指定JVM的类型。

老家买房记 有更新!

  |   27 评论   |   3,793 浏览

今年截止目前最重要的事情,就是7月底在老家买了套房子,大三室130平带30平车库,算是真正在老家扎根了。当然与此同时带来的是一身的负债,欠亲戚朋友27万,欠银行90万。这篇文章就写写我买房的经历。

Selenium自动化测试实践 有更新!

  |   0 评论   |   850 浏览

近期在公司做了一个分享,关于Selenium自动化测试实践的分享,这里贴一下。欢迎参观:

视频主要讲解了Selenium的基本用法,它是如何与浏览器通信的,并且我们如何利用其中的通信协议来完成我们需要的,但Selenium并没有提供的功能。

清晨专注时间管理 有更新!

  |   0 评论   |   778 浏览

我最近2个月养成了晚上跑步的习惯,体重已下降25斤左右,精神面貌有所改善。但是跑步时间也占用了很多时间,使得工作之余的学习时间极少。长此以往,个人能力可能退步。身体与灵魂不能有一个脱节。因此,必须利用另外的时间来提升个人能力。

所以,我近期逼迫自己养成早起的习惯,虽然过程异常艰难,但成效显著,近两周已经逐步可以稳定在6点前起床。现在已经可以利用每天清晨6:00 ~ 8:30 不被打扰的特性,专注个人技能的提升。

selenium获取请求返回内容的解决方案 有更新!

  |   0 评论   |   14,348 浏览

之前一篇博客说的是怎么利用selenium来做自动化监控。当出现异常时,我们需要记录页面源码、网络请求数据、截图等信息来方便我们诊断问题,基本上就够用了。但是,这两天遇到一个棘手的异常,时不时页面会弹出:“系统繁忙,请稍候再试!”,这时候我们去看网络请求数据,结果状态码全部都是200,没有其它信息,这压根没法定位不了问题。

这就说明:网络出现异常的时候,仅靠状态码是不够的。我们最好能拿到http所有数据,包括:请求头、响应头、请求体、响应体。其中请求头、响应头,可以通过PERFORMANCE_LOG拿到,问题都不大。但是请求体与响应体,我们可以拿到么?

JVM学习总结-垃圾回收器 有更新!

  |   0 评论   |   1,234 浏览

JVM迄今为止(JDK10),常见的垃圾回收器有7种,分别是:Serial 、Serial Old、ParNew、Parallel Scaverage 、 Parallel Old、 CMS、Garbage First(G1).我们来总结一下这七种垃圾器。

JEP 193:Variable Handles 有更新!

  |   0 评论   |   1,453 浏览

学习JDK源码过程中,发现了java.lang.invoke.VarHandle这个类,查了一下,这个类来源于JEPS193,因此查了一下规范。以下便是规范的具体内容以及对应的翻译,其中上半段翻译是我自己翻译的,后半段翻译时,发现网上已有,翻译比我靠谱多了,但他只有中文版,以下是我整理的中英文对照着看,方便理解。
Summary(摘要)

Define a standard means to invoke the equivalents of variousjava.util.concurrent.atomic and sun.misc.Unsafe operations upon object fields and array elements, a standard set of fence operations for fine-grained control of memory ordering, and a standard reachability-fence operation to ensure that a referenced object remains strongly reachable.

定义了一些标准方法来执行java.util.concurrent.atomic和sun.misc.Unsafe包下对对象属性和数组元素的操作,提供了对内存序列细粒度访问对象属性的操作,和一个标准可达性栅栏操作来确保被引用的对象是强可达的(strongly reachable)。

结合案例谈谈我对领域驱动设计的理解 有更新!

  |   0 评论   |   12,694 浏览

为什么要聊领域驱动设计?

领域驱动设计是一套建模的方法论。在微服务大形其道的当下,如何确保微服务拆分的结果是利大于弊的,具体到业务仍然是个难题。而领域驱动设计可以指导微服务的具体实践。

设计领域模型的步骤

  1. 根据需求划分出初步的领域和限界上下文,以及上下文之间的关系;
  2. 进一步分析每个上下文内部,识别出哪些是实体,哪些是值对象;
  3. 对实体、值对象进行关联和聚合,划分出聚合的范畴和聚合根;
  4. 为聚合根设计仓储,并思考实体或值对象的创建方式;
  5. 在工程中实践领域模型,并在实践中检验模型的合理性,倒推模型中不足的地方并重构。

常见树形数据结构总结 有更新!

  |   0 评论   |   387 浏览

最近补了一些基础知识,发现jdk的集合、MySQL、Redis等,都离不开树相关的数据结构,因此这里把一些相关的树形数据结构做了下整体。
总体来说,树的结构主要是二叉树与多叉树,其中:BST、AVL、RBT是二叉树,B树、B+树、B*树是多叉树。

rocketmq超时重试导致的重复消费问题处理 有更新!

  |   0 评论   |   1,136 浏览

公司各系统交互使用的是RockeMQ 3.x版本的消息中间件。RocketMQ是以consumer group + queue 为单位来管理消费进度的,以一个consumer offset 标记这个组在queue上的消费进度,依靠这个进度来判定从哪里开始消费,每次消费成功后,本地的消费进度会被更新,然后定时器(这个时间很短)去同步到broker,来持久化消费进度,但是每次记录消费进度,只会把一批消息中最小的offset值记为消费进度值,

这种机制会带来一个潜在的重复问题——由于消费进度只是记录了一个下标,就可能出现拉取了100条消息如 2101-2200的消息,后面99条都消费结束了,只有2101消费一直没有结束的情况,这种情况下,RocketMQ为了保证消息肯定被成功消费,消费进度只能维持在2101,直到2101也被消费结束了,本地的消费进度才能标记2200消费结束。

kafka一台挂掉导致消息消费不了的问题处理

  |   0 评论   |   2,249 浏览

Kafka集群有3个节点,其中一个节点挂掉了。这时候,部分group可以消费消息,但是有一部分group存在消息无法消费的情况。重启服务后正常。

按理说,Kafka集群已经保证了高可用,为什么会出现一台down掉服务却不可用了呢?

网上搜了下,大概率是需要调整kafka的主题__consumer_offsets的副本数量。