Service 层需要实现接口吗

前几天看技术交流群的话题,又刷到了「Service 层和 Dao 层真的有必要每个类都加上接口吗?」这个问题,之前简单回答了一波,给出的观点是「看情况」

现在结合我参与的项目以及阅读的一些项目源码来看,如果项目中使用了像 Spring 这样的依赖注入框架,那可以不用接口

查看更多

分享到

Spring Cloud 终于改了,为什么要用日期来做版本号?

Spring Cloud 终于改了

最近 Spring Cloud 把版本号从 A 到 Z 的伦敦地铁站,改成用日期命名了。

也就是从 Greenwich.SR6, Hoxton.SR9 这样的风格改成了 2020.0.0 的形式。广大人民终于不用为 Spring Cloud 的版本号烦恼了。

Spring Cloud 推广不力,固然有自身复杂的原因,版本号太复杂也是一个坑。

以日期为版本号,即所谓的 Calendar Versioning,可以参考这个网站:

查看更多

分享到

Nacos 集群部署模式最佳实践

1 前言

Nacos 支持两种部署模式:单机模式和集群模式。在实践中,我们往往习惯用单机模式快速构建一个 Nacos 开发/测试环境,而在生产中,出于高可用的考虑,一定需要使用 Nacos 集群部署模式。我的上一篇文章《一文详解 Nacos 高可用特性》提到了 Nacos 为高可用做了非常多的特性支持,而这些高可用特性大多数都依赖于集群部署模式。这篇模式文章便是给大家介绍一下,在实践中可以被采用的几种集群部署模式,无论你是希望自行搭建 Nacos,还是希望对 MSE 商业版 Nacos 有一个更加深刻的理解,我都很乐意跟你分享下面的内容。

由于篇幅限制,本文不会介绍如何将一个多节点的 Nacos 集群启动起来,主要介绍的是一个多节点的 Nacos 集群启动之后,我们的应用如何很好地连接到 Nacos 集群,即客户端视角。这中间我们会引入一些其他组件以解决一些问题,本文标题也可以叫做《Nacos 接入点最佳实践》。我将会介绍以下三种方案:直连模式、 VIP 模式和地址服务器模式,并对它们进行对比。

查看更多

分享到

一文详解 Nacos 高可用特性

前言

服务注册发现是一个经久不衰的话题,Dubbo 早期开源时默认的注册中心 Zookeeper 最早进入人们的视线,并且在很长一段时间里,人们将注册中心和 Zookeeper 划上了等号,可能 Zookeeper 的设计者都没有想到这款产品对微服务领域造成了如此深厚的影响,直到 SpringCloud 开始流行,其自带的 Eureka 进入了人们的视野,人们这才意识到原来注册中心还可以有其他的选择。再到后来,热衷于开源的阿里把目光也聚焦在了注册中心这个领域,Nacos 横空出世。

注册中心

Kirito 在做注册中心选型时的思考:曾经我没得选,现在我只想选择一个好的注册中心,它最好是开源的,这样开放透明,有自我的掌控力;不仅要开源,它还要有活跃的社区,以确保特性演进能够满足日益增长的业务需求,出现问题也能及时修复;最好…它的功能还要很强大,除了满足注册服务、推送服务外,还要有完善的微服务体系中所需的功能;最重要的,它还要稳定,最好有大厂的实际使用场景背书,证明这是一个经得起实战考验的产品;当然,云原生特性,安全特性也是很重要的…

似乎 Kirito 对注册中心的要求实在是太高了,但这些五花八门的注册中心呈现在用户眼前,总是免不了一番比较。正如上面所言,功能特性、成熟度、可用性、用户体验度、云原生特性、安全都是可以拉出来做比较的话题。今天这篇文章重点介绍的是 Nacos 在可用性上体现,希望借助于这篇文章,能够让你对 Nacos 有一个更加深刻的认识。

查看更多

分享到

鱼和熊掌兼得:同时使用 JPA 和 Mybatis

前言

JPA 和 Mybatis 的争论由来已久,还记得在 2 年前我就在 spring4all 社区就两者孰优孰劣的话题发表了观点,我当时是力挺 JPA 的,这当然跟自己对 JPA 熟悉程度有关,但也有深层次的原因,便是 JPA 的设计理念契合了领域驱动设计的思想,可以很好地指导我们设计数据库交互接口。这两年工作中,逐渐接触了一些使用 Mybatis 的项目,也对其有了一定新的认知。都说认知是一个螺旋上升的过程,随着经验的累积,人们会轻易推翻过去,到了两年后的今天,我也有了新的观点。本文不是为了告诉你 JPA 和 Mybatis 到底谁更好,而是尝试求同存异,甚至是在项目中同时使用 JPA 和 Mybatis。什么?要同时使用两个 ORM 框架,有这个必要吗?别急着吐槽我,希望看完本文后,你也可以考虑在某些场合下同时使用这两个框架。

ps. 本文讨论的 JPA 特指 spring-data-jpa。

查看更多

分享到

聊聊算法在面试中的地位

前段时间,有一位好友找到我,向我打听阿里社招笔试是否看重算法题的考察,我给予了肯定的答复。他表现的有些沮丧,表示自己工程底子很扎实,框架源码也研究地很透彻,唯独算法能力不行,leetcode 上的简单题做起来都有点吃力。以至于面试一些公司时,基本都是前几面和面试官聊工程,相聊甚欢,一到笔试就 GG。鉴于我个人在学生时代有过 ACM 经历,对算法还是相当感冒的,个人算法能力不算出众,也不算弱,最好成绩是省赛金牌,区域赛铜牌(主要还是抱得队友的大腿),后来实在是写不动 C++ 了,中途转了 Java,借这个机会跟大家聊一聊,分享下个人对算法的一些认识。

查看更多

分享到

gson 替换 fastjson 引发的线上问题分析

前言

Json 序列化框架存在的安全漏洞一直以来都是程序员们挂在嘴边调侃的一个话题,尤其是这两年 fastjson 由于被针对性研究,更是频频地的报出漏洞,出个漏洞不要紧,可安全团队总是用邮件催着线上应用要进行依赖升级,这可就要命了,我相信很多小伙伴也是不胜其苦,考虑了使用其他序列化框架替换 fastjson。这不,最近我们就有一个项目将 fastjson 替换为了 gson,引发了一个线上的问题。分享下这次的经历,以免大家踩到同样的坑,在此警示大家,规范千万条,安全第一条,升级不规范,线上两行泪。

问题描述

线上一个非常简单的逻辑,将对象序列化成 fastjson,再使用 HTTP 请求将字符串发送出去。原本工作的好好的,在将 fastjson 替换为 gson 之后,竟然引发了线上的 OOM。经过内存 dump 分析,发现竟然发送了一个 400 M+ 的报文,由于 HTTP 工具没有做发送大小的校验,强行进行了传输,直接导致了线上服务整体不可用。

查看更多

分享到

三种思维,让我脱胎换骨

闭环思维

闭环思维简而言之就是,如果别人发起一件事,你不管做的如何,最后都要闭环到这个发起者。

我曾经就经历过这样的事:

我让一个实习生写一个问卷。

两个小时过去了,没有反馈,三个小时过去了还是没有反馈,直到中午吃饭的时候,我碰到了他。

我问他,写完了吗?他说写完了。

我说,那你怎么没发给我看,他说,写完直接发出去了。

你会对这个人怎么评价?不靠谱。

有闭环思维的人是怎么做呢?

第一,如果他完成了,那么就要及时反馈,并且说一下当时的情景。

第二,如果他没完成,也要及时反馈,是哪里遇到困难了,需不需要帮助。

以上无论哪一种情况,都有一个闭环,那就是由你本人发起又回到你的身上。

不管做得如何,一定要给出一个反馈,形成闭环,有太多有才华的人就死在这一环节了。

这件事我也没怪他,想想曾经的自己,也是一个“反馈黑洞”,这事交给我了,我最后给你弄完了就行了,老反馈多麻烦啊。最主要的是,减少反馈就多了偷懒的机会,自以为蒙混过关,其实已经被打上了不靠谱的标签。

过去有句话说的分非常好:凡事有交代,件件有着落,事事有回应。这就是闭环思维。

成长型思维

成长型思维的人面对挑战与失败总是能够迎难而上;相反,成长型思维对应的另一种思维是固定型思维,他们面对挑战与失败总会下意识地回避。

曾经的我是一个不折不扣的固定型思维者:

小学时候觉得英语难,逃避,高中英语没及过格,大四才过四级;

中学时候因为一次物理考试没考好,对物理失去了兴趣,大学物理考了3次才过;

高中时候因为被喜欢的女生拒绝了,失去了追求异性的勇气,此后一段时间不敢和女生说话;

工作之后,领导交代一件事,我第一反应就是这个我不会,我做不了;

……

为什么会这样?

归根结底是因为我害怕失败,害怕被否定,错误的把别人对某件事的否定当成了对自己这个人的否定。而不被否定的唯一方法就是不去做那件事。所以自己的能力圈就越来越小,进步的脚步也戛然而止。

后来我转变态度,我承认自己害怕失败,但我不服,越怕什么我就越做什么。

当初不是觉得自己学不好英语吗?我就去考研,虽然没考上,但我英语分数却不低,而且明显感觉英语并没有那么难学。

当初不是怕物理吗?我就去读物理相关的读物,我竟然还觉得很有意思,经常给人科普,别人经常会说:你怎么什么都知道啊?

当初不是不敢跟女生说话吗?我就疯狂和女生聊,线下搭讪,线上社交软件,虽然聊死了很多女生,但我却练就了和任何女生都能聊得来的能力。

……

做完之后我发现,失败是一件再正常不过的事,你能把它当成一座挡住你的大山,就可以做一个勇敢的登山人。

批判性思维

所谓批判性思维,并不是指:

凡事先推翻立论,从反面去证明别人是错的;

以怀疑论者的思维方式,认为谁都是错的,谁说的都不在理;

传说中的杠精?怼天怼地怼空气。

而是对自己的批判

我们无法避免遇事时,总会以自己为标准去评判事物的正确性。这是与生俱来的惰性思维,却也总能通过自身的努力去降低偏见。

凡事要习惯回过头来三思。比如某个人和你讲一件事,你第一感觉可能觉得他完全在胡说八道,但是,一定要想第二遍,是否我错了,他对了?这一遍思考,一定不能假设自己是对的;

如果又想了第二遍,还是觉得自己对,对方错,

要想第三遍,是否是我的境界不够,不能理解他?为什么要想第三遍呢?因为任何一个想要精进的人,都要承认自己的无知,挑战自己的固有观念,拥抱新的观点。这就是批判性思维的真谛。

对于自身的批判,最实用的,就是每日对自身的复盘。推敲一天内的工作生活是否符合自己的目标状态,是否还有遗漏或可以改进的地方。

作者:风茧
链接:https://www.zhihu.com/question/23913984/answer/754533449

分享到

lambda 表达式导致 Arthas 无法 redefine 的问题

原文出处:https://m.jb51.net/article/188155.htm

作者:鲁严波

这篇文章主要介绍了 lambda 表达式导致 Arthas 无法 redefine 的问题,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。

通过 arthas 的 redefine 命令,可以做到不用重新发布,就可以改变程序行为。

但是用多了,发现很多时候,我们就改了几行代码,甚至有的时候就添加了一行日志,就无法 redefine 了。提示:

redefine error! java.lang.UnsupportedOperationException: class redefinition failed: attempted to add a method

查看更多

分享到

Dubbo 迈向云原生的里程碑 | 应用级服务发现

1 概述

社区版本 Dubbo 从 2.7.5 版本开始,新引入了一种基于应用粒度的服务发现机制,这是 Dubbo 为适配云原生基础设施的一步重要探索。版本发布到现在已有近半年时间,经过这段时间的探索与总结,我们对这套机制的可行性与稳定性有了更全面、深入的认识;同时在 Dubbo 3.0 的规划也在全面进行中,如何让应用级服务发现成为未来下一代服务框架 Dubbo 3.0 的基础服务模型,解决云原生、规模化微服务集群扩容与可伸缩性问题,也已经成为我们当前工作的重点。

既然这套新机制如此重要,那它到底是怎么工作的,今天我们就来详细解读一下。在最开始的社区版本,我们给这个机制取了一个神秘的名字 - 服务自省,下文将进一步解释这个名字的由来,并引用服务自省代指这套应用级服务发现机制。

熟悉 Dubbo 开发者应该都知道,一直以来都是面向 RPC 方法去定义服务的,并且这也是 Dubbo 开发友好性、治理功能强的基础。既然如此,那我们为什么还要定义个应用粒度的服务发现机制那?这个机制到底是怎么工作的?它与当前机制的区别是什么?它能给我们带来哪些好处那?对适配云原生、性能提升又有哪些帮助?

带着所有的这些问题,我们开始本文的讲解。

查看更多

分享到