自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

沉潜飞动

人非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。

  • 博客(110)
  • 资源 (13)
  • 论坛 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 Java 并发基础(一):synchronized 锁同步

你好,我是看山。synchronized 是 java 内置的同步锁实现,一个关键字实现对共享资源的锁定。synchronized 有 3 种使用场景,场景不同,加锁对象也不同:普通方法:锁对象是当前实例对象静态方法:锁对象是类的 Class 对象方法块:锁对象是 synchronized 括号中的对象synchronized 实现原理synchronized 是通过进入和退出 Monitor 对象实现锁机制,代码块通过一对 monitorenter/monitorexit 指令实现。在编

2021-03-28 20:18:28 20

原创 Docker 教程(三):Docker 命令

你好,我是看山。本文源自并发编程网的翻译邀请,翻译的是 Jakob Jenkov 的 《Docker 教程》 中的第三篇。我们通过 Docker 命令与操作 Docker 服务,可以构建 Docker 镜像、运行 Docker 容器、将 Docker 镜像推送到远程等。本文主要介绍一些常用的 Docker 命令。Docker 有很多命令,本文不会介绍所有的命令,如果需要完整的命令教程,可以参考 Docker command line reference。请注意,根据在 Linux 系统上安装.

2021-03-21 14:19:09 29

原创 Docker 教程(二):Dockerfile

你好,我是看山。本文源自并发编程网的翻译邀请,翻译的是 Jakob Jenkov 的 《Docker 教程》 中的第二篇。Dockerfile包含一组关于如何构建Docker镜像的说明,通过docker build命令执行Dockerfile文件,可以构建一个Docker镜像,本文介绍了如何编写Dockerfile文件以及构建一个Docker镜像。Dockerfile的好处Dockerfile文件以书面形式说明了如何构建一个Docker镜像,Docker镜像通常包含如下内容:首先需要一个.

2021-03-14 23:10:24 33

原创 Docker 教程(一):Docker 是什么

本文源自并发编程网的翻译邀请,翻译的是 Jakob Jenkov 的 《Docker 教程》 中的第一篇,本文大概介绍了 Docker 是什么和有什么用。可能在工作中,会有专业运维同学管理服务器镜像或其他内容,但是如果不了解这些概念,很多时候我们不会全面了解到系统的全貌。Docker 是一种将应用程序和服务器配置打包成 Docker 镜像的方法,使用了一种称为 Dockerfile 的简单打包规范。Docker 镜像可以启动多个多个实例,这些运行的实例被称为 Docker 容器。这个系列的内容主要..

2021-03-07 20:50:00 16

原创 Java 中 Vector 和 SynchronizedList 的区别

你好,我是看山。本文还是折腾 Java 中的队列,上次比较了 Vector、ArrayList、CopyOnWriteArrayList、SynchronizedList,当时感觉挺明白,后来想想又有些不理解的地方,所以今天在重新翻出来研究一下,我承认我钻了牛角尖了。Vector虽然种种问题,但是都属于设计上的问题,为什么不在后续版本中进行优化呢?HashMap就优化了好几次。而SynchronizedList这个内部类(也就是通过Collections.synchronizedList(new A.

2021-02-28 19:45:34 35

原创 软件架构-事件驱动架构

你好,我是看山。本文源自并发编程网的翻译邀请,翻译的是 Jakob Jenkov 的 《软件架构》 中关于事件驱动的内容,虽然是 2014 年的文章,但是从软件架构层面上,并不过时。以下是正文。事件驱动架构是一种系统或组件之间通过发送事件和响应事件彼此交互的架构风格。当某个事件发生时,组件A不直接调用组件B,而只是发出一个事件。组件A不知道哪些组件监听并处理这些事件。事件驱动架构可以在进程内和进程间使用。比如,GUI框架中会大量使用事件驱动。【译者注:目前很多系统采用微服务架构,事件驱动使用的更.

2021-02-21 21:03:58 117 1

原创 认识 Java 中的队列:Vector、ArrayList、CopyOnWriteArrayList、SynchronizedList

你好,我是看山。书接上文,上次聊了聊 在多线程中使用 ArrayList 会发生什么,这次我们说说平时常用的列表:Vector、ArrayList、CopyOnWriteArrayList、SynchronizedList。VectorVector是在 JDK 1.0 提供的,虽然没有被标记Deprecated,但是事实上已经没人使用了。主要原因是性能差,且不符合需求。从源码可以看出(这里不贴源码了),Vector是基于数组实现,几乎在所有操作方法上,都用synchronized关键字实现方法同.

2021-02-10 11:59:01 22

原创 如果非要在多线程中使用ArrayList会发生什么?

你好,我是看山。我们都知道,Java中的ArrayList是非线程安全的,这个知识点太熟了,甚至面试的时候都很少问了。但是我们真的清楚原理吗?或者知道多线程情况下使用ArrayList会发生什么?前段时间,我们就踩坑了,而且直接踩了两个坑,今天就来扒一扒。翠花,上源码上代码之前先说下ArrayList的add逻辑:检查队列中数组是否还没有添加过元素如果是,设置当前需要长度为10,如果否,设置当前需要长度为当前队列长度+1判断需要长度是否大于数组大小如果是,需要扩容,将数组长度扩容1..

2021-02-04 23:19:10 70

原创 java import 导入包时,我们需要注意什么呢?

你好,我是看山。这篇文章起因是 code review 时和同事关于 import 导入声明的分歧。用过 IDEA 的都知道,默认情况下,通过 import 导入类时,当数量达到设置数量(类 5 个、静态变量 3 个),就会改为按需导入方式,也就是使用使用*号折叠导入。同事建议不要采用按需导入,要使用单类型导入 (single-type-import)。而我是觉得既然 IDEA 作为宇宙级的 IDE,不会在这种地方出现纰漏,所以想继续按照 IDEA 默认配置来。所以总结一下这两种方式的差异。如果对.

2021-01-31 23:50:45 134 5

原创 JVM 垃圾收集算法

这是根据周志明老师的《深入理解Java虚拟机》整理的学习笔记,后续会更新在深入理解Java虚拟机中,希望能够帮到一些需要速成的同学。从如何判断对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两大类也常被称作“直接垃圾收集”和“间接垃圾收集”。从如何判断对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(T.

2021-01-24 22:06:02 44

原创 软件架构-缓存技术

本文源自并发编程网的翻译邀请,翻译的是 Jakob Jenkov 的 《软件架构》 中关于缓存技术的内容,虽然是 2014 年的文章,但是从软件架构层面上,并不过时。缓存缓存是一种加速数据查找(数据读取)的技术,直接读取本地缓存的数据,而不是从数据源读取数据,数据源包括数据库、其他远程系统。缓存是比源数据更靠近使用方的一块存储空间,可以更快的读取操作。缓存的存储介质一般是内存或磁盘,很多时候会选择内存作为缓存介质,但是内存缓存会在系统重启时丢失数据。在软件系统中,数据缓存存在多层缓存级别或多.

2021-01-17 22:23:58 49

原创 我从 HX 辞职了

这篇文章早就想写了,结果一直拖到 2020 最后一天,借着年终总结的感觉,记一下流水账,算是给这段经历画上一个句号。2020 年十一假期后和领导提了离职,思考很久的结果。在这待了整三年,一届高中生毕业了。因为一些原因,离职过程匆匆忙忙的,没有好好告别,总感觉差点意思,这里先胡乱说几句,算是开始画句号,毕竟三年时间,没做什么事,但也做了很多事。本文通篇灌水,记一下流水账。HX 旗下有一个钻戒品牌相信很多人听过或者见过,全国线下门店 600 多家,近两年 618、双十一钻石类目第一。这样想来,好像..

2020-12-31 21:13:36 132

原创 SpringBoot 实战:如何优雅的处理异常

前段时间写了一篇关于实现统一响应信息的博文,根据文中实战操作,能够解决正常响应的一致性,但想要实现优雅响应,还需要优雅的处理异常响应,所以有了这篇内容。作为后台服务,能够正确的处理程序抛出的异常,并返回友好的异常信息是非常重要的,毕竟我们大部分代码都是为了 处理异常情况。而且,统一的异常响应,有助于客户端理解服务端响应,并作出正确处理,而且能够提升接口的服务质量。SpringBoot提供了异常的响应,可以通过/error请求查看效果:这是从浏览器打开的场景,也就是请求头不包括content-ty.

2020-10-10 14:49:09 496

原创 SpringBoot 实战:一招实现结果的优雅响应

因为最近事比较杂,很多文章都没有连续性,想到哪写到哪,大家海涵,后面理清思绪,会连贯输出,形成系列,供大家找茬。今天说一下 Spring Boot 如何实现优雅的数据响应:统一的结果响应格式、简单的数据封装。前提无论系统规模大小,大部分 Spring Boot 项目是提供 Restful + json 接口,供前端或其他服务调用,格式统一规范,是程序猿彼此善待彼此的象征,也是减少联调挨骂的基本保障。通常响应结果中需要包含业务状态码、响应描述、响应时间戳、响应内容,比如:{ "code": 2

2020-08-13 00:17:31 464

原创 系统设计系列之如何设计一个短链服务

短链服务的鼻祖是 TinyURL,是最早提供短链服务的网站,目前国内也有很多短链服务:新浪(t.cn)、百度(dwz.cn)、腾讯(url.cn)等等。不得不问一句,为什么要用短链?这个问题的另外一层意思是,短链服务有必要存在吗?套用万金油答案:存在即合理。短链服务存在的合理性我们先说说短链服务存在的合理性。短链唯一的一个优点是短。微博的早期用户都知道,每条微博只能限制在 140 个字以内,如果想要分享一个链接,就需要减少描述的文字。同样,如果想要在营销短信中放入一个链接,就需要考虑成本问题

2020-08-02 23:49:00 963

原创 如何在足够规模团队中高效使用 Git 管理代码?

用了 Git 多年,优势和挑战都是深有体会。话不多说,直接上问题:如何在足够规模团队中高效使用 Git 管理代码?继续不多话,直接上答案:分支管理。Git 的分支管理有很多实践,有些是从 SVN 类的集中式版本管理工具继承的,有些是根据 Git 自己的特性总结的,目前市面上比较有名的三种 Git 分支管理模型是:TrunkBased:主干在手,天下我有。所有代码都往主干上招呼,发版也只用主干。GitFlow:严谨、规范、难用,主要是记不住该往哪个分支合并了。AoneFlow:前两种都不行,那

2020-07-24 21:42:03 150

原创 IPv4 与 int 之间互相转换

目前数据存储设备越来越便宜,已经不存在为了节省空间而引入复杂计算的场景,但是有时候,将 IPv4 这种长字符串数据转换为数字,更加便于比较和查询。1. 直接转换直接能够想到的方式是把网段之间的“.”去掉,组成一个长数字就行。但是在“255.255.255.255”地址时,去掉“.”的数字是255255255255,大于int能够表示的最大数字,所以,真正使用的时候,只能使用长整型Long型。但是这种方式有两个严重的问题:单向转换:只适合那种需要从 IPv4 到数字单向转换的场景,如果想要转回来,

2020-07-20 22:24:11 635

原创 从单体架构到微服务架构

微服务的优势众多,在现在如果有谁没有听过微服务架构,可以从这里了解一下。本文主要聊一聊是否值得花时间将单体架构重构为微服务架构?微服务架构是一种架构风格,专注于软件研发效能,主要包括单位时间内实现更多功能,或者软件从想法到上线的整个持续交付的过程。在当前的互联网环境中,业务变化迅速,也促使了微服务架构的普及。这种架构迫使团队迅速反应,快速实施,在方案没有过期之前已经上线运行,经受市场考察和考...

2020-03-22 23:06:51 473

原创 别让非理性思维毁了你的人生

本文是盖瑞·马库斯的《怪诞脑科学:战胜焦虑、混乱、拖延的自控术》一书读后感,借用作者给出的13条建议,结合自己的理解分享给大家。

2020-02-23 22:45:59 735

原创 实现DevOps的三步工作法

实现DevOps的三步工作法:流动原则、反馈原则、持续学习与实验原则。

2020-02-09 23:23:07 1236

原创 微服务中服务注册和发现的可行性方案

在 微服务的基建工作 中提到过,在云原生、微服务时代,如果还是手动修改服务地址,是几乎不可完成的工作,需要一种机制完成自动上报和获取服务地址的支撑组件,可以保障服务的快速上线和下线,这就是服务注册/发现组件。为了表述方便,从系统规模定义几个阶段:- 巨型应用架构时期:很多应用都是一个巨型服务,一个应用包含所有功能,部署在小型机和大型机上,或者直接部署在物理服务器上。- 单体架构时期:应用...

2020-01-29 17:36:51 1254

原创 微服务的基建工作

微服务的出现是为了研发效能的提升:相同的人数可以处理更多的需求、维护更多的产品,可以更快的交付产品。基于这点,微服务的基础组件,就从解放人力,减少人为失误出发。

2020-01-05 18:11:33 281

原创 什么是微服务?

什么是微服务?我所理解的微服务,就六个字:“高内聚,低耦合”。没错,就是这个在软件开发过程中被反复提到的六个字,各类设计模式、架构设计、从入门到放弃等各种书中总会提到,从初级到高级到骨灰级程序员、架构师挂在嘴边的也是这六个字。只不过,在微服务概念之前,这六个字被用在类、模块、组件上,微服务则是将它放在服务上。

2020-01-01 18:51:40 363

原创 并发与并行 同步或异步

并发与并行我们都知道,程序猿是一种逻辑性极强的生物,他们不擅言辞,不擅表达,但是他们能够用一种神秘的语言与机器进行沟通,知道怎么让机器听他们的。机器是线性思维,为了能够更高效的与机器沟通,程序猿主动或被动或潜移默化的转变思维模式,思维逐渐变得线性。最直观的表现就是,程序猿一次只能做一件事情,如果同时做多件事情,他们就会感觉不安,内心不够自信,我们戏称单线程生物。这其实是与机器微观世界有一定的契合...

2019-12-31 18:53:44 154

原创 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版) 读后感

写这篇读后感的缘由是这本书的第三版即将面世了,先拜谢周教授,相信很多人得益于周教授的这本书。14年入手的第二版,当时准备跳槽,需要理论知识武装一下。于是囫囵吞枣的扫了第一遍,就两个字,不懂,那种感觉就仿佛身在雾中,一切都看不通透,感觉浑身不舒服,想来是自己水平太渣了。那个时间点是在工作2年,加上大学4年,接触java将近6年的时间,在项目组内基本上属于横着走,跟同学出牛,“只要能说明白需求,我...

2019-12-12 11:31:22 246

原创 微服务编程范式

目前很多互联网公司都采用微服务架构,微服务的优点和缺点被反复说到,这里不在重复赘述,只结合工作中的一些实践,说说要用微服务要注意的点,厚颜写做编程范式,其实就是一些技巧而已。

2019-11-09 19:52:08 328 2

翻译 程序员什么时候该考虑辞职

经常有程序员在讨论要不要辞职,以及现在辞职是不是一个明智之举。这是很严肃的话题,因为这个决定会对程序员的职业生涯和生活产生非常深远的影响。很多人想要辞职但是因为怕被贴上“爱跳槽”的标签而裹足不前。从我观察的结果来看,很多程序员趋向于为了所谓的“声誉”而呆在老公司,但是在后期将两者相比较,“呆在老公司”的程序员处理问题的经验和职业发展前景远远不如那些频繁跳槽的。正如我以前曾经说过,有的公司甚至非常愿意在岗位上看到一些积极的人员流动。

2019-11-09 15:11:12 137

原创 瞎说八道之更换手机的成本

现在手机越来越便宜,换手机是比较常见的一件事,所以各大厂商为了降低更换手机的成本,也是各种手段费尽心思:一键换机、云账号。。。但是这些方式都建立在一个基础上,就是同品牌手机才能用。如果是跨品牌换机,那真是要经历九九八十一难,百转千回才能顺利使用新机。像我这种懒人,可能还要在很长一段时间继续使用旧手机。

2019-11-09 14:46:56 215

原创 源码安装NGINX

本文主要记录一次从源码安装Nginx过程,参考的是Nginx官网。

2019-11-09 14:39:00 158

原创 蓝绿部署、金丝雀发布(灰度发布)、AB测试

随着微服务架构的普及,线上服务越来越多,随之而来的就是部署越来越频繁;随着互联网行业的兴旺,产品迭代的频率也是越来越快,服务上线速度逐步提升。有上线、有部署,就有风险。有风险,就对业务有影响,然后就有了一系列减少这种风险的部署方案:蓝绿部署、金丝雀发布(灰度发布),也有适应产品迭代频率的AB测试。

2019-10-26 17:10:02 969

原创 spring-cloud-config 非对称加密 keystore 文件加载异常

因为配置内容可能涉及到某些敏感信息,所以可以简单的在Spring Cloud Config中使用非对称加密实现敏感信息的安全存储。但是在使用过程中,却碰到一些奇葩的问题,无论是官方文档还是一些大神的博文,都没有明确解决。当然,这个问题的出现与我的配置有关,很多人可能并没有碰到。这里把问题描述下,万一有人和我一样配置,也出现问题,就可以帮助别人节省点时间了。

2017-10-12 16:16:19 9875 3

原创 代码质量管理:SonarQube + Jenkins Pipeline配置

本文主要是介绍通过Jenkins Pipeline与SonarQube集成,对代码进行扫描,这里使用的是Jenkins2.19.1,SonarQube6.4。

2017-09-13 15:53:25 10349 5

原创 java.lang.OutOfMemoryError:GC overhead limit exceeded

简单来说,java.lang.OutOfMemoryError: GC overhead limit exceeded发生的原因是,当前已经没有可用内存,经过多次GC之后仍然没能有效释放内存。

2017-09-11 16:36:20 88439 4

原创 中文字节长度引起的数据丢失

最近在写一个应用监控的项目,使用netty作为数据传输。因为刚开始写,没有使用Protobuf之类的作为编码工具,只是使用的是netty自带的`LengthFieldBasedFrameDecoder`作为报文解析工具,自定义编码解码类,实现数据传输。在对中文进行转换字节的时候一定要注意,千万不要想当然的使用`length()`方法。还是要根据具体情况多试试。

2017-08-30 16:18:07 1094

原创 ResourceManager HA 配置

ResourceManager(RM)负责跟踪集群中资源使用情况,调度应用程序(比如MapReduce作业)。在Hadoop 2.4之前,ResourceManager存在单点故障,需要通过其他方式实现HA。官方给出的HA方案是Active/Standby两种状态ResourceManager的冗余方式,类似于HDFS的HA方案,也就是通过冗余消除单点故障。

2017-07-11 16:31:38 4728

原创 YARN 架构

YARN的基本思想是将资源管理和作业调度/监控的功能分为独立的守护进程。这样就出现了一个全局的 ResourceManager(RM) 和每个应用程序的 ApplicationMaster(AM)。应用程序可以是一个job作业或者一组job作业的有向无环图(DAG)。ResourceManager负责系统中的所有应用程序的资源分配。NodeManager负责每台机器中容器代理、资源监控(cpu,内存,磁盘,网络),并

2017-07-11 09:23:45 3077

原创 使用 QJM 实现 HDFS 的 HA

hadoop官方提供了两种HDFS的HA配置方案,两种方案殊途同归,但是需要的钱、精力和技术不同。如果对HDFS架构熟悉的话,就应该知道,NameNode通过FsImage和EditLog两个文件管理DataNode的数据,Secondary NameNode会定期合并EditLog,以减少NameNode启动时的安全检查。EditLog文件存储的是对文件的一条条的操作,也就是说,只要保证有另外一个NameNode的

2017-07-10 11:12:12 1644 2

原创 HDFS 架构

Hadoop文件存储的基础是HDFS(Hadoop Distributed File System),HDFS的实现依赖于NameNode和DataNode,DataNode用来存储具体数据,NameNode用来管理多个DataNode中分别存储的是什么。理解起来也不难,因为HDFS是分布式的文件系统,也就是有很多机器用来存储数据,一个大文件可能分布在多个机器上,也可能是一台机器上,具体分布在哪些或哪个机器上,主文件

2017-07-05 17:05:11 2158

原创 JVM参数优化(基础篇)

文中内容主要是自己关于JVM参数优化的一些总结,参考了网上很多大神的文章,有参数有说明,这里是为了记录下,也是为了可以给别人做个垫脚石。刚入坑不久,很多地方还不是很透彻,之后会继续研究。

2017-06-30 11:27:55 9176

原创 storm笔记:Trident状态

Trident中有对状态数据进行读取和写入操作的一流抽象工具。状态既可以保存在拓扑内部,比如保存在内容中并由HDFS存储,也可以通过外部存储(比如Memcached或Cassandra)存储在数据库中。而对于Trident的API而言,这两种机制没有任何区别。Trident以容错的方式管理状态,以便在重试或失败时的状态更新是幂等的。在大数据处理中,数据处理的幂等性是非常重要的一个指标,这样能够保证每个消息即使处理了多

2017-06-09 22:58:47 3475

Java反射动态加载实例类

Java反射动态加载实例类,动态加载实例类,帮助理解反射

2010-06-28

JSch - Java实现的SFTP(文件上传详解篇)

浏览博客时看到的关于JSCH工具实现文件上传的功能,讲解很详细,文档中也包含了原文章的路径。

2013-08-10

tuxedo详细安装步骤

关于Tuxedo的安装步骤,有过程有实例。

2013-08-10

JSch - Java实现的SFTP(文件下载详解篇)

浏览博客时看到的关于JSCH工具实现文件下载的功能,讲解很详细,文档中也包含了原文章的路径。

2013-08-10

hadoop 2.4.1 64位native库

用于替换32位的Hadoop2.4.1中的native库,是Hadoop可以运行在64位操作系统上。

2014-10-14

Java反射简单小实例

Java反射实例,可以给初学反射的同志们一定帮助。一个简单实例,可以更好的理解反射的规矩。

2010-06-28

设计模式(Java版)

Java版设计模式,提供经典实例,可为初学者提供一定帮助。

2010-06-28

GTK+2.0(中文教程)

GTK+ 2.0 教程 译者: huzheng,konghui,ferry,carton,yang_yi,ddd,tingle 版本号: V_0.1.0 2002年 6 月25 日 本文是有关通过 C 语言接口使用 GTK (the GIMP Toolkit) 的教程。

2011-04-09

Think in C++

英文版Think in C++,是对C语言的一些介绍和帮助提高。英文版,不但可以学习C语言,而且同时可以学一些专业英语。

2010-05-31

job脚本创建程序

定时执行脚本

2016-07-08

Linux常用命令合集

Linux常用命令合集 内含例子 文件管理 文件传输 文档编辑 系统管理 系统设置 网络通讯 磁盘管理 磁盘维护 备份压缩 设备管理

2011-04-09

汇编语言-教程

汇编语言教程,内容还算是比较浅显易懂,适合于初学者。

2013-08-10

UML & Rose教程.pdf

讲解统一建模语言UML与Rational Rose的协作。

2014-06-14

看山的留言板

发表于 2020-01-02 最后回复 2020-01-02

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

TA关注的人 TA的粉丝

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