自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

转载 你需要微服务吗?

最近几年以来,微服务开始大行其道。各种项目都开始采用微服务架构。在此基础上,又诞生了多种服务、框架用来治理、监控微服务。问题是,对于大多数应用,你真的需要微服务吗?微服务相对于传统的单体应用,有以下几个方面的好处:解耦。微服务由于各个服务之间完全独立,仅仅通过远程接口进行访问。这迫使原来单体应用中习惯于通过数据耦合在一起的模块,被分割得相当彻底。这对于原来一些设计复杂、耦合性...

2018-07-30 16:29:00 143

转载 区分重复还是巧合

DRY原则(Don't Repeat Yourself)已经深入人心。重复的代码在不同地方出现,是程序隐患之一。比如你因为某个原因修改了其中一处就提交了,那么就会造成没有修改彻底,进而造成问题。但在按照DRY原则对代码进行重构的时候,要谨慎区分重复和巧合。如果不加以区分,仅仅从代码上看重复,随着业务的推进,可能会给你带来更大的问题。为什么会这样呢?有些时候的代码重复,仅仅是巧合...

2018-07-19 10:21:00 140

转载 从单体应用平滑过渡到微服务

混沌阶段所有功能在一个项目里面项目里面根据功能划分为若干Service实现业务Service通过DAO访问数据库业务逻辑没有清晰地表现出来,和数据库访问、前端接口耦合在一起如果你的项目在这个阶段,你需要做的是:拆分出业务逻辑、业务实体,将业务逻辑、业务实体和数据库访问、对外接口等隔离开。运用DDD编程思维,拆分出业务领域。完成后,你将...

2018-07-06 15:16:00 253

转载 编程常见影响可读性的问题总结

含混不清的命名命名问题是很严重的问题,我见过有些系统用大量拼音缩写命名,有些缩写长达5-6个字母以上,这种除非是长期维护系统的程序员,其他人看了都是一脸懵逼。命名最好用英文加上驼峰命名法,比如getAccount,userName。对于英文单词的选择,由于我们是非英语国家,即使在英语国家里面,同一个含义可能也对应多个单词,最好团队建立一个常用英文单词库,比如性别都叫:gender...

2018-07-06 11:14:00 159

转载 什么是架构

架构是什么?是Spring boot、Spring cloud、Dubbo之类?这些是系统框架。是数据库、缓存、消息队列?这些是工具。是微服务、SOA?这些技术。那么究竟什么是架构?架构师可以类比为城市规划师,用来决定城市哪块是什么功能,如何搭配这些功能。比如工厂附近就不会是居民区,商业中心也不会在污水处理厂附近。在软件系统中,架构的工作就是“拆分业务”。拆分业务可以分为多个维度...

2018-06-26 11:41:00 102

转载 用阿里云的Swarm构建微服务系统

阿里云的Swarm产品,更方便地集成各种异构系统组成微服务集群。利用Docker技术,方便地部署、扩容。进一步简化程序的开发、运维。对Swarm下的每一个应用,阿里云提供两种方式对外暴漏接口。一是通过本地域名,将指定端口暴漏出去,域名必须以.local为结尾,一般我们以服务名+.local组成服务的域名。这个暴漏是负载均衡+健康检查的,因此可以代替服务发现。只要在调用方写死服务的...

2018-06-14 09:24:00 206

转载 模板模式变形

模板模式在有些场景下非常好用,传统的模板模式,一般是声明一个抽象类,在抽象类里面实现一些逻辑,但有些方法声明为抽象,由子类实现。但模板模式有个问题:单元测试比较麻烦。因为用到了继承,不好隔离测试。(据说Java创始人说过最后悔的就是加了抽象类)典型代码如下:public class TemplateMain { public void doSomething() {...

2018-05-09 21:09:00 93

转载 理解volatitle带来的可见性

如下代码:public class VolatileTest { volatile int value1; int value2; public static void main(String[] args) { final VolatileTest main=new VolatileTest(); new T...

2018-05-08 12:02:00 198

转载 数据库隔离级别

数据库具有不同的隔离级别,不同的隔离级别有不同特性,在使用的时候要小心,特别是在Race Condition的情况下。读未提交read uncommited。可以读取到尚未提交的内容,级别最低,会出现脏读。读已提交read commited只有已提交的内容会被读取到,会出现幻读,在同一个事务中,开始读取到的数据,和后面相同条件读取到的数据,可能不一样。...

2018-05-04 11:03:00 65

转载 Spring对POST内容进行处理的坑

有次和某第三方公司调试接口,他们的协议很奇葩:Content-Type用application/x-www-form-urlencoded,然而内容却是把图片内容直接写了进去。在Spring中用@RequestBody byte[] data  去接数据的时候,发现内容都被URLEncode编码了,无法取得原始的流。跟踪源码到:RequestResponseB...

2018-04-28 08:21:00 148

转载 Java内存Happen-Before

在Thread.start之前的操作,hb 线程里面的操作对一个锁的解锁,hb 重新获得锁一个线程里的所有操作,hb其他线程调用这个线程的join返回后。对一个volatile的写入操作,hb读取操作对一个并发集合(CopyOnWriteList等)的写入操作,hb于对他的删除、读取操作  hb的含义,是之前的操作写入的东西,对之后的操作都是可见的 ...

2018-04-27 09:08:00 99

转载 《干净架构读书笔记》——业务驱动编程

  Martin Flower说过,一个Web应用,从一个Controler->Service->DAO->数据库开始是个不错的开始(大意)。我相信很多项目可能都是这样的一个结构(我以前也是)。但这样的结构有个问题:Service层实际上应该是业务逻辑层,他依赖的DAO,这样就和DAO耦合在了一起。同时Service层作为一层,业务逻辑没有清晰剥离。因此有些人有疑问,在...

2018-04-24 11:40:00 89

转载 《干净架构读书笔记》——编程范式

  编程范式就像法律。每个法律条文,都从你手中征收了部分权利,但同时赋予你更好的社会(理论上)。比如法律禁止你杀人,那么也同时保证了你不会被随意谋杀。从计算机软件开始之初,一共诞生了3种重要的编程范式。  一是结构化编程。结构化编程范式把我们直接控制语句的权利给没收了。我们从此不再用Goto直接在语句中跳来跳去,而是采用将大的方法拆分成N多个小方法(单一职责原则)来分解问题。这样带来...

2018-04-24 11:24:00 94

转载 Scrum中的冲刺和迭代

  今天听到有人抱怨Scrum中的迭代。说每个迭代时间固定,所以很难安排Feature,经常要做出选择,决定这个迭代到底放入哪些Feature,有时候又难以割舍。这个在刚开始采用Scrum的时候,我也经常碰到这种问题。现在谈谈我对这个问题的理解。  按我的理解。Scrum中的冲刺,其目的并非为了版本发布;而我们常说的迭代,一般是为了某个产品里程碑。这两个本身就不是一件事儿,因此也不必...

2018-04-24 11:07:00 2296

转载 Spring Cloud中通过Kafka传递自定义Header

缺省情况下,你自己设定的Header会在传递的时候给清空,需要在配置中加上如下spring.cloud.stream.kafka.binder.headers=header_name  如果有多个Header,用逗号隔开。发送方:MessageBuilder .withPayload(message) ...

2018-04-09 14:00:00 4711

转载 领域驱动开发(DDD)Web开发中的典型分层

UI  在典型的Spring Web层中,我们把协议接口这层也定义为UI的一部分,一般来说就是Controller实现的这部分功能。主要作用是从Web接口获取用户传过来的参数,然后发送给业务装饰层进行调用,获取业务装饰层的返回结果并以约定形式返回给浏览器之类。业务装饰  业务装饰层接受UI层的调用,并返回结果给UI层。  业务装饰层通过调用业务层+存储层,...

2018-04-01 20:45:00 189

转载 给开发团队减减负

不必要的文档  在传统的软件开发过程中,文档是非常重要的东西。从需求到概要到详细到测试,覆盖每个环节。这些文档汗牛充栋,浪费大量人力编写、维护。但哪些文档才真正起到作用呢?在我看来,除了用户使用手册(有些产品需要)、业务流程图以外。绝大多数文档除了浪费人力并没有什么帮助。需求文档?谁能一开始写得清清楚楚,以后也不改呢?所以,在Scrum的价值观里面,认为面对面的沟通优于面面俱...

2018-03-15 09:02:00 114

转载 业务实体和用例

业务逻辑包含两个部分:业务实体和用例。业务实体,是指那些业务固有的东西,即使不用计算机,也必须要有的。比如对一个在线考试系统,我们即使不用在线的方式,要实现一个考试的业务,我们也必须拥有题库、考卷这样两个实体。那么在系统里面,我们就有题库和考卷这两个实体:题库。包含有N个可选题目。考卷。包含N个已选题目,当前考试进度,是否结束,得分多少。可以提交答案等。围绕业务实...

2018-03-13 09:08:00 469

转载 什么是好的代码-代码Review要点

自描述命名恰当规范,看名字就知道意思。包括包、类、方法、变量等等,而不是靠注释去理解。当你需要注释才能描述清楚你想干嘛,请思考一下,能否从命名就说清楚?除非是在不行,否则不要依赖注释。注释的一个坏处是,你不能保证注释和代码是同步的。当你由于某些原因改了代码,而没有修改注释,这时候注释是误导人的,还不如没有。注释会带来代码的噪音。遍布代码里的注释,让你无法抓住代码要点,而是要费...

2018-03-13 07:21:00 135

转载 代码Review实践

如何保证代码都被Review?人一是有惰性,二是习惯问题,可能会导致有些代码没有Review而进入了代码库。如果你用Gitlab系统,可以把主分支设置为protected,不准任何人push。开发只能在分支上进行,开发完后,在网页上发一个merge request。请其他人Review后,merge到主分支上。Review的规模多大?代码如果太多,涉及太多特性,Review的时间...

2018-03-06 19:57:00 101

转载 架构师的职责是什么

切分系统。无论是单体应用还是微服务结构,都需要把系统分为若干模块。切分有两个维度。一是从职责上,比如UI、业务逻辑、数据库;二是从业务上,按用例切分。也就是Uncle Bob说的,把相同原因并且相同时间变化的放一起,把不同原因或者不同时间变化的分开。确定模块间依赖。原则是高层不依赖细节,细节依赖高层。比如用户可以修改UI和Controller而不会影响业务,可以更换数据库而不影响...

2018-03-06 15:49:00 84

转载 用例的粒度问题

在Clean Architecture里面,Uncle Bob说我们要把相同原因、相同时间变化的模块放一起,不同原因不同时间变化的分开。除了传统的UI、逻辑、数据库这样的纵向划分以外,还有以用例为单位的横向划分。不同的用例,用该拥有自己的UI、逻辑、数据库等操作单元。那么用例的粒度究竟应该怎么划分合适呢?一种是以功能为粒度。如一个在线考试功能,用户考试分为产生题目、显示当前题目、提交...

2018-03-06 15:00:00 165

转载 REST和RPC最大区别

REST是(Representational State Transfer),面向的是数据,是对象RPC是(Remote Procedure Call),面向的是过程,是业务。简单来说REST比如会实现CURD,然后让调用者组合实现业务。而RPC本身的Call就是业务,你只是调用一个业务的子过程。所以他们最大区别是设计上的理念,用何种方式设计接口。如果你面向数据用RPC,RP...

2018-03-03 21:04:00 120

转载 成功的结对编程要点

经常洗澡,身体无异味,有狐臭尽快治疗。保持口腔卫生,定期看牙医,口腔无异味。没了转载于:https://www.cnblogs.com/bobdeng/p/8502980.html

2018-03-03 20:52:00 46

转载 我认为技术经理应该做的事儿

传统的技术经理,按我理解有如下职责:计划。一般公司都会要求技术经理之类的制定开发计划。我就曾经做过不少,甚为痛苦。很多计划完全就是拍脑袋制定,基本上缺乏可执行性和灵活性。对我来说,从未有过按计划执行的项目。分配任务。根据自己的喜好和对员工的了解,将开发计划分配给Team成员。检查任务。有些Team里面,技术经理是唯一代码Review者,所有人代码都提给他?你看得过来么?...

2018-03-03 20:16:00 237

转载 敏捷测试实践

在绝大部分团队里面,大家遵循的流程都是开发->测试->发布这样的过程。在开发完成后,交给测试进行集成测试,发现Bug后提交给开发,开发再修改这样直到缺陷都被修复。这样的过程导致一个问题:在一个Sprint中,必须留给测试足够的时间,否则会无法交付。而且测试在一开始会比较无所事事,而到了后期又特别忙。我们曾经有个Team,最后采用方法是在一个2周的冲刺内,一周用来测试。这样的过...

2018-03-03 20:04:00 75

转载 DDD-围绕业务逻辑编程

当需求明确后,开始编程第一步是做什么?多年前,我的第一步是设计表结构。当时流行的工具是PowerDesigner,一个表结构设计工具。直到现在,我看到很多架构师、或者是技术Leader,依然是采用这种方式。我们称之为围绕数据库编程。后来出现了RUP,会画出用例图、时序图、类图设计图,这些图有利于理清设计思路。这些图的核心是关注业务逻辑和业务实体,而不是数据库如何实现。我们系统...

2018-03-03 19:51:00 331

转载 依赖反转原则

首先,什么是依赖反转,为什么叫反转?高层不应该依赖细节,细节应该依赖高层。什么是高层?什么是细节?对一个系统来说,业务逻辑是高层,其他是细节。业务逻辑是仅仅包括用例、业务实体部分,不包括任何框架、存储(数据库)、其他系统等部分,是纯粹的。其他细节,包括框架、数据库、消息队列,都是细节。业务逻辑应该不依赖任何细节。细节的实现可以任意替换而不影响业务逻辑。这样的业务逻辑,可以测试、容...

2018-02-27 09:21:00 74

转载 Kafka和Rabbitmq的最大区别

功能上,两者都是实现了AMQP协议。那么在使用上的最大区别是什么呢?如何根据自己的需求进行选型?kafka是严格顺序保证的消息队列。即使在分布式环境下,也保证在同一分区内消息的顺序性。既然是顺序的,那么在同一个Topic下面,如果前面的消息没有消费完毕(收到回应),则不能读取下一条消息。那么在消费端,就变成了一个单线程操作,无法并发。虽然kafka可以通过分区实现并发,不过这个需要用...

2018-02-08 15:42:00 239

转载 Cassandra快速两次写入导致顺序不对的问题

在项目中遇到一个问题,在A服务中,连续两次远程调用B服务B1、B2,两次的服务中,都有对表C的Save操作。结果在一些情况下,后调用的B2服务没有成功,写入的结果是B1的。经过仔细分析后,发现是在B服务有多台的情况下会发生。经分析,两台运行了B服务的机器,时间差了好几秒,怀疑是时间戳问题,在查了相关资料后。发现是Thirft的Driver,为了保证命令的时序,是以客户端时间戳为准的。...

2018-01-17 14:42:00 199

转载 用Sleuth在其他线程里面继承外面的Trace/Span等信息

Sleuth的原理是在Thread里面保存了当前的Trace/Span等信息,通过MDC传给了selfj用来打日志。在调用到Feign、MQ的时候,通过把Thread里面的信息,保存到远程调用的Header里面,传给下一个服务。这在你是一个线程里面执行的时候没有问题。比如你A调用B服务,A是通过Http同步调用,那么没问题。如果A调用B是异步调用,问题就来了:在异步调用的线程里面,并没有...

2018-01-11 15:26:00 892

转载 Spring java web项目的有效测试

单元测试  单元测试应该如何做?这个争论非常大。从极限的TDD到几乎不做单元测试都有。我面试过的程序员,只有不到5%所在公司有比较标准的单元测试。我对单元测试的态度是:要做,但不是什么都要做。我们把单元测试放在协议测试、端到端测试不容易到达、检测的地方。比如一些条件判断、异常检查、复杂的计算等。这些特点是基本上不需要mock就能进行的、可以独立运行的方法。而其他地方的方法,都...

2017-10-11 09:57:00 118

转载 Spring cloud config的使用技巧

Spring cloud 的config server,可以很方便管理各个应用的配置。但我们在每个应用中,可能有大量重复的配置,比如都有相同的数据库、消息队列、redis等。如果放到每个应用的配置文件里面,要改动就要修改很多个配置,非常麻烦。我们可以把各个基础设施,每个基础设置做一个配置。如数据库、消息队列、redis都单独做个配置文件,然后在应用的config里面,指定需要哪几个基础设...

2017-09-08 15:44:00 94

转载 安装Rabbitmq集群需要注意的

两边erlang版本保持一致安装前先设置hostname,起个容易阅读的别名。加入集群前,要先保持两边的.erlang.cookie一致加入集群前,加入的一方先rabbitmqctl stop_app,加入成功后再start_app集群需要4396端口,需要打开。转载于:https://www.cnblogs.com/bobdeng/p/7456486.htm...

2017-08-31 09:10:00 80

转载 Maven库中添加本地第三方库

首先,在工程的根目录创建一个目录用来存放第三方库,如libs,把第三方库都copy进去。然后,在pom.xml里面增加一个本地的respository <repository> <id>local</id> <url>file://${project.basedir}/libs...

2017-08-01 18:43:00 176

转载 Spring Boot中Thymeleaf引擎动态刷新

在Spring 项目中使用thymeleaf引擎,可以很好地解决部署问题,不用再导出jsp文件。真正做到一个jar包即可发布。但Thymeleaf有个缺陷:必须重启工程才能刷新。其实把配置稍微改一下,就可以在开发的时候动态刷新。@Configuration@EnableWebMvcpublic class ThymeleafConfig extends WebMvcAut...

2017-07-11 17:54:00 223

转载 用来在Linux下管理Java进程的脚本

#!/bin/bash# chkconfig: 2345 80 20# description: service namewaittime=0waitExit(){ while true:do if [ ! -d "/proc/$1" ]; then echo "process is finished" br...

2017-07-04 21:49:00 64

转载 没有功能需求文档就拒绝开发吗?

看到热门上编辑推荐了一篇文章,没有功能需求就拒绝开发,地址:http://www.cnblogs.com/charliechu/p/6553988.html ,引来很多人评论,看了评论大多数表示支持,也有少部分反对。我来谈谈我的看法。在软件开发中,产品也不是万能的。对新产品的开发,他们也不能一开始就设计所有细节。比如一个找工作的网站,可能有这样的目标:能让用户在上面找到工作。但具体实...

2017-03-16 09:52:00 228

转载 用Spring cloud Stream来开发基于MQ消息驱动的微服务

Spring boot对MQ类如RabbitMQ、kafka支持都很好,但是仍然要写一些模板代码。Spring cloud stream进一步掩盖了这个差异,仅仅使用配置就可以完成。Spring cloud Stream 用了基于topic-subsriber的模式,虽然不支持全部MQ的特性,但绝大多数应用来说,这样就足够用了,毕竟方便很多。具体用法如下:包含的包   ...

2017-03-15 16:52:00 126

转载 在Linux上讲Java命令行的作为服务运行

现在Spring等框架可以支持别用War发布而是用Jar发布,这样服务器就不用安装容器了,方便不少。但不安装容器就需要自己来写脚本完成服务的启动、停止、重启。脚本如下:#!/bin/bash## chkconfig: 345 70 30# description: ${description}# processname: ${processName}#...

2017-03-09 17:47:00 77

空空如也

空空如也

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

TA关注的人

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