2018

2016年,我在博客中发表过一篇《微服务架构的基础框架选择:Spring Cloud还是Dubbo?》获得了很大的阅读量和转载量。在这篇文章中,我主要对比了Spring Cloud与Dubbo所具备的能力,并阐述了个人推崇Spring Cloud的原因。但是,最近各大技术社区出现了不少类似的文章,观点比较激进,对于Spring Cloud的褒扬远胜于Dubbo,但是这些评价很多都忽略了Spring Cloud与Dubbo在设计视角上的不同。其实在前文中我也说明了Dubbo与Spring Cloud的对比本身就不公平,因为两者产出的目标格局是不一样的。所以,就目前阶段来说,大家对于框架的选择上,还是要综合考虑自身团队与遗留业务系统的特点来确定更合适的技术栈,而不是盲从于“时髦”的架构体系。 昨天看到了开源中国对Dubbo社区维护者的访谈,内容非常不错。所以这里分享给大家。其实,在最近...

MySQL 是世界上最流行的开源数据库系统,MariaDB(一个 MySQL 分支)是世界上增长最快的开源数据库系统。在安装 MySQL 服务器之后,在默认配置下是不安全的,确保数据库安全通常是通用数据库管理的基本任务之一。 这将有助于增强和提升整个 Linux 服务器的安全性,因为攻击者总是扫描系统任意部分的漏洞,而数据库在过去是重点目标区域。一个常见的例子是对 MySQL 数据库的 root 密码的强制破解。 在本指南中,我们将会讲解对开发者有帮助的 MySQL/MariaDB 的 Linux 最佳安全实践。 1. 安全地安装 MySQL这是安装 MySQL 服务器后第一个建议的步骤,用于保护数据库服务器。这个脚本可以帮助您提高 MySQL 服务器的安全性: 如果您在安装期间没有设置 root 帐户的密码,马上设置它 通过删除可从本地主机外部访问的 root 帐户来禁用远程 r...

如果在诸多热门云计算技术中,诸如容器、微服务、DevOps等,找出一个最火的方向,那么非微服务莫属。在小数推荐的这篇文章里,做与不做微服务好像理由都很充分。另外,诞生几十年的康威定律,在组织结构调整和变革方面,依然神采奕奕。 创建一种新的软件项目架构,来封装离散服务,对于全新的项目来说,这是非常简单的。但是,对于大多数软件开发者来说,谁又有大把的奢侈时间一直用在全新项目上呢? 大多数软件开发人员职责更多是维护或增加现有软件系统的功能。但是,如果问开发人员究竟是愿意构建全新的项目,还是维护一个现有的系统,那么支持新项目的呼声肯定会成为压倒性的声音。事实上,希望与新技术或新项目合作也是开发人员离职的原因之一。为什么呢? 1. 识别问题容易,但修复很难维护现有系统时,很容易识别架构的问题。为什么?因为基于良好的架构,系统很容易调整。 当需要去调整一个没有设计封装波动的已有系统时,架构的...

2017

上次我说了一些 “复杂的重构技巧” ,讲的是一些使用 IntelliJ 的简单功能实现复杂的重构需求的技巧。 看到大家的反响之后我就感觉那个可能不大亲民,因为很多人连 inline 这功能都不知道(那岂不是把 IntelliJ 用成了记事本), 于是我决定再写一篇讲讲 IntelliJ 已经提供好了的一些复杂的重构功能。 这就不再是需要自己进行奇奇怪怪的操作的教程了,就会亲民得多。 从方法中提取方法这是用来快速复用一段代码的功能,名叫 “Extract Method” 。比如,我现在有这么一段业务代码(顺带一提,这是在 Java 调用动态语言 API 时能使用的最健壮的处理数值类型的方法): liceEnv.defineFunction("run-later", ((metaData, nodes) -> { Number time = (Number) nodes...

一、前言我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 缓存穿透 注: 上面三个图会有什么问题呢? 我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了。那这种问题有什么好办法解决呢? 要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。 有一个比较巧妙的作法是,可以将这个不存在的key预先设定一个值。 比如,”key” , “&&”。 在返回这个&&值的时候,我们的应用就可以认为这是不存在的key,那我们的应用就可以决定是否继续等待继续访问,还是放弃掉这次操作。...

久违了的Spring Boot系列,今天抽空更新一篇。去年写过很多篇关于数据访问的文章了,比如下面这些: 使用JdbcTemplate 使用Spring-data-jpa简化数据访问层(推荐) 多数据源配置(一):JdbcTemplate 多数据源配置(二):Spring-data-jpa 使用NoSQL数据库(一):Redis 使用NoSQL数据库(二):MongoDB 整合MyBatis MyBatis注解配置详解 使用事务管理 如果没有读过上面内容的读者,有兴趣的可以一阅。在上面的使用JdbcTemplate一文中,主要通过spring提供的JdbcTemplate实现对用户表的增删改查操作。在实现这个例子的时候,我们事先在MySQL中创建了用户表。创建表的过程我们在实际开发系统的时候会经常使用,但是一直有一个问题存在,由于一个系统的程序版本通过git得到了很好的版本控...

导读: 程序员你为什么这么累? 我的编码习惯 - 接口定义 我的编码习惯 - Controller规范 我的编码习惯 - 日志建议 我的编码习惯 - 异常处理 我的编码习惯 - 参数校验和国际化规范 我的编码习惯 - 工具类规范 我的编码习惯 - 函数编写建议 我的编码习惯 - 配置规范 一个项目不可能没有工具类,工具类的初衷是良好的,代码重用,但到了后面工具类越来越乱,有些项目工具类有几十个,看的眼花缭乱,还有不少重复。如何编写出好的工具类,我有几点建议: 隐藏实现就是要定义自己的工具类,尽量不要在业务代码里面直接调用第三方的工具类。这也是解耦的一种体现。如果我们不定义自己的工具类而是直接使用第三方的工具类有2个不好的地方: 不同的人会使用不同的第三方工具库,会比较乱。 将来万一要修改工具类的实现逻辑会很痛苦。 以最简单的字符串判空为例,很多工具库都有 StringUtil...

重构是 IDE 给人类生活带来便利的一个重要方面。但是 IDE 永远不是我们肚子里的蛔虫,有时我们会有复杂到 IDE 不可能直接提供的重构需求。下面我来告诉大家怎么利用有限的 IDE 重构功能, 创造无限的价值 处理复杂的情况。 复习一下快捷键先复习一下快捷键吧,我们这次就看两个就好。 inline这个叫 inline 的东西快捷键是 Ctrl+Alt+n。这个东西的作用是把当前光标上的东西,在代码级别内联掉。 按下这个快捷键后,会看到一个弹窗(这个是 inline 一个 Kotlin 方法的弹窗,对于 Java 还多几个选项。 不过这都不是重点啦): 我们都默认选第一个,就是在 inline 之后删除被 inline 的东西,第二个是 inline 后保留。如果你是在调用处而不是定义处这么搞,第三个选项就可以选,是只 inline 这一处。 我们一般不管,使用第一个。 renam...

关于人工智能的项目,相信大家都看过或者用过不少了,但它们的大多数看上去都十分“高大上”,让人感觉要掌握他们犹如习屠龙之术一样。事实上,有很多关于人工智能的项目还是十分实用的,而且用途还十分有趣,下面就简单为大家盘点 10 个功能独特的开源人工智能项目。 1. STYLE2PAINTS:强大的为线稿上色的 AI推荐理由:新一代的强大线稿上色 AI,可根据用户上传的自定义色彩给线稿进行上色。项目提供了在线使用网站,十分方便使用。 2. SerpentAI:基于 Python 的教 AI 打游戏的学习框架推荐理由:SerpentAI 旨在为机器学习和 AI 研究提供一个有价值的工具。但同时,对于爱好者来说,它也是非常有趣的。 Serpent.AI 中包含大量支持模块,在以游戏为开发环境时经常遇到的场景提供解决方案,同时也提供加速开发的 CLI 工具。支持 Linux、Windows ...

之前介绍了关于Intellij IDEA的插件和快捷键内容,非常受欢迎: 最好用的 IntelliJ 插件 Top 10 我最常用的Intellij IDEA快捷键昨天正好看到卓凡分享的这几个装逼利器,推荐给大家平时把玩。 TOP 5 stackoverflow排在第五位的是来自brucege的stackoverflow。 评委点评:这一看似平淡的右键stackoverflow,却把其中的闷骚体现的淋漓尽致:我就这么叼,我就不去浏览器里查,只有右键才和我的右手匹配。 逼气指数:☆☆ TOP 4 Sudoku Plugin排在第四位的是来自jaypeevoss的Sudoku Plugin。 评委点评:在idea中想到集成自己喜欢的游戏进去,也是没谁了。 逼气指数:☆☆☆ TOP 3 Nyan progress bar排在第三位的是来自daddy-bear的Nyan p...

之前在写Spring Boot基础教程的时候写过一篇《Spring Boot中使用RabbitMQ》。在该文中,我们通过简单的配置和注解就能实现向RabbitMQ中生产和消费消息。实际上我们使用的对RabbitMQ的starter就是通过Spring Cloud Stream中对RabbitMQ的支持来实现的。下面我们就通过本文来了解一下Spring Cloud Stream。 Spring Cloud Stream是一个用来为微服务应用构建消息驱动能力的框架。它可以基于Spring Boot来创建独立的、可用于生产的Spring应用程序。它通过使用Spring Integration来连接消息代理中间件以实现消息事件驱动的微服务应用。Spring Cloud Stream为一些供应商的消息中间件产品提供了个性化的自动化配置实现,并且引入了发布-订阅、消费组以及消息分区这三个核心概念...

你是否在寻找更有效率的编程方法? 使用键盘来代替鼠标执行操作并不是一个秘密,这将节省您大量的时间。 如果你只是想执行一次操作,那么这不是什么大不了的事情。但是如果你每天多次使用相同的操作呢?如果将所有这些操作都加起来,就将会对您的生产力产生很大的影响。 我几乎用键盘快捷键来完成我的大部分操作。在我年轻的时候,玩了半职业的实时战略电脑游戏,包括星际争霸和魔兽争霸III。 星际争霸中流行APM(每分钟操作数) ,它计算了玩家每分钟执行的动作数量。 通过使用工具,可以通过记录APM来判断玩家是使用鼠标操作还是使用键盘和鼠标的操作组合。 通常,使用键盘和鼠标组合玩法的玩家获得游戏胜利的概率要比仅通过鼠标点击的玩家获胜概率要高。 那么这和代码以及IntelliJ有什么关系呢?通过上面的例子,我相信你可以联想到,通过学习和使用键盘快捷键来执行所需要的操作,可以有效地提高代码开发的效率。 您可以...

IntelliJ的十大插件?相信每个人都有自己的选择。我们也同样如此。在这里,我们为您带来我们认为的十大IntelliJ插件。 如果你还是不知道什么是IntelliJ插件,请先阅读our page about plugins。或者访问plugins.jetbrains.com获取更多信息。 1. Grep Console允许您定义一系列的正则表达式,利用它们来对控制台的输出或文件进行测试。每一个表达式匹配的行都会被整行的应用某个样式,或者播放声音。例如,你可以将错误消息设置为以红色的背景来显示。 官方网站 点击这里. 2. JRebel for IntelliJJRebel是一个提升生产力的工具,它可以帮助开发人员快速的重新加载更改的代码。 它跳过了Java开发中常见的重新构建,重启以及重新部署的循环操作。 JRebel使开发人员能够在相同的时间内完成更多的工作,让开发人员的编码过...

Jenkins Pipeline 插件对于 Jenkins 用户来说可以让用户能够改变游戏规则。基于 Groovy 中的领域特定语言(DSL),Pipeline 插件使 Pipelines 可以有脚本来定义,并且提供了非常强大的方法来开发复杂的、多步 DevOps Pipeline 。本文记录了编写 Jenkins Pipeline 的一些的最佳实践和不推荐的代码示例和说明。 1. 要使用真正的 Jenkins Pipeline不要使用像 Build Pipeline 插件或者 Buildflow 插件这样的旧插件。而是使用真正的 Jenkins Pipiline 插件套装。 这是因为 Pipeline 插件是底层工作自身的一个改变和提升的 Step。与 Freestyle 任务不同,Pipeline 对 Jenkins 主机重新启动具有适应能力,并且有可以替代以前用于构建多步、...

通常微服务架构中的依赖通过远程调用实现,而远程调用中最常见的问题就是通信消耗与连接数占用。在高并发的情况之下,因通信次数的增加,总的通信时间消耗将会变的不那么理想。同时,因为对依赖服务的线程池资源有限,将出现排队等待与响应延迟的情况。为了优化这两个问题,Hystrix提供了HystrixCollapser来实现请求的合并,以减少通信消耗和线程数的占用。 HystrixCollapser实现了在HystrixCommand之前放置一个合并处理器,它将处于一个很短时间窗(默认10毫秒)内对同一依赖服务的多个请求进行整合并以批量方式发起请求的功能(服务提供方也需要提供相应的批量实现接口)。通过HystrixCollapser的封装,开发者不需要去关注线程合并的细节过程,只需要关注批量化服务和处理。下面我们从HystrixCollapser的使用实例,对其合并请求的过程一探究竟。 Hystr...