开始尝试技术图书翻译

一个月前,我在“图灵教育”的微博上看到《Java Performance, 2nd》这本书正在招募译者,所以我就咨询了下是否可以参与试译,很快小编给了我责编的联系方式,我马上发邮件要来了试译章节,开始动手。

这本书第一版4年前就由图灵出版了,书名是《Java性能权威指南》,如果你是Java老手,大概率看过这本书,Java群体比较大,而且讲性能的书本来就不多。第二版新增了很多Java 11相关的特性和工具等,在这里我当然要建议你在出版后读一读,性能调优在Java进阶的路上必不可少。

(更多…)

继续阅读 →

Spring Boot教程(29) – RabbitMQ必备基础

RabbitMQ是使用最广泛的开源消息队列中间件之一,它是用Erlang写的,并实现了高级消息队列协议AMQP。消息队列可以在应用间交换消息,实现解耦、异步处理、削峰、缓冲等目的,应用场景还是比较丰富的。除了RabbitMQ,还有其他的消息队列可用,比如Kafka、Java写的ActiveMQ和阿里出品的RocketMQ等,现在网上有很多他们的对比,你可以具体分析分析那种可能更适合你。

RabbitMQ现在属于Pivotal公司,而Spring框架也是Pivotal出品,所以两者搭配使用也是顺理成章,Spring Boot也有AMQP Starter以提供支持。在打开IDE演示代码如何编写之前,先说说消息队列以及RabbitMQ具体是怎么工作的。

(更多…)

继续阅读 →

Spring Boot教程(28) – 简单读写Redis

Redis是最流行的key-value数据库,它最常用的功能就是缓存。就算你不是搞后端的,也会不断看到Redis相关的新闻和技术文章等,因为它性能强劲、功能丰富、生态完备,各种“吊打面试”的系列文章肯定少不了它。

如果仅仅是CRUD工程师来使用Redis的话,那需要掌握的东西寥寥几句话就可以概括,简单说就是80%的情况下你只需要用到20%的知识。我想更复杂的地方就是如何针对不同的业务进行数据结构的设计,这个就需要实践和经验了。如果你是在大厂,数据足够多,访问量足够大,可能会需要搭建Redis集群,这也是有现成工具和方案的。

可惜作为一个toB项目的CRUD的工程师,还没有机会将Redis的作用充分发挥出来,只能在这里啰嗦下它的基本使用。轮子丰富的Java生态和Spring全家桶,老早已经为你准备好了工具,Spring Data Redis可以帮你高效使用Redis,而且Spring Boot也提供了starter可以一键接入Redis,“0配置”就可以写代码。在介绍它之前,先复习下Redis的基本概念和命令,然后再来说说它的API的使用。

(更多…)

继续阅读 →

最近股市波动大,入场须谨慎

前两天有个大学同学C,问我有没有兼职项目可以做,我好奇他是不是工作不饱和,他说不是的,炒股亏光了,把买房钱亏进去了。

众所周知,最近美股市场遇到了罕见的大跌,S&P 500指数在一个月内大跌了30%+,直接跌到了2017年的水平。连巴菲特也得感叹自己“太年轻”,见证了短时间内的四次熔断。

要说我也挺惨的,我在2月19号美股历史最高点的时候,入金买股票,然而第二天立马就开始跌跌不休。我不禁感叹,是什么力量让我如此精准把控股市的走向,“我一买入就大跌,我一卖出就大涨”绝对不是什么传说,是昏暗灯光下每个吃面人的真实内心写照。我有时候会想,跌了这么多,要不我清仓试试,看看能不能挽救全世界股民。后来我控制住了自己,没有卖出任何一支股票,因为当时入场时就打算长期持有3到5年,现在清仓我干点啥呢。好在下跌的过程中我慢慢补仓降低了成本,到现在浮亏已经降到了10%以内,还可以接受。

(更多…)

继续阅读 →

Spring Boot教程(27) – 优雅地实现重试逻辑

Spring家族中有一个小项目是Spring Retry,他用来方便地实现重试机制。你的程序在调用远程API的时候,可能因为网络抖动等原因,导致调用失败,这种失败是偶发的,出现了多试几下就行。如果你遇到需要重试多次的情况,倘若只是朴素地写个for循环N次,请求成功就跳出循环返回结果,未免也太粗糙了。Spring已经为这一通用需求造好了轮子。

Spring Retry现在被Spring BatchSpring Integration等项目引用,在Spring Boot项目中,我一般直接引入spring-boot-start-batch来间接引入Spring Retry(Spring Batch是个批处理工具库,你也许会用得到其中的类,我们有机会再具体研究下),另外它还要配合AOP Starter才能使用,后者你的项目里一般都有。引入Spring Retry后,可以用加注解声明的方式,或者编码的方式来使用。

(更多…)

继续阅读 →

找工作失败

在1月初的时候,我决定再找找工作试试看,没想到刚准备没几天,疫情爆发,打乱了原有的节奏。窝在家里的时间多了,那我就多准备准备好了。年后很多公司都是远程办公,远程面试,我不太乐意远程面试,因为有时候话都说不清楚。三月初的时候,杭州这边的情况有所好转,我就试着投了投简历。

(更多…)

继续阅读 →

大家最近还好么

最近新型冠状病毒肺炎已经影响了所有人的生活,大家都憋在家里。我当然也不例外,每天醒来第一件事就是打开丁香园看看现在各种数据增加了多少,再刷刷微博,看看武汉和各地的防疫工作都有哪些进展。说实话,消极信息实在是太多,尤其是肺炎患者求助超话,看了一些求助的文字,整个人都不好了。网上的信息真假混杂,仅凭一个手机获取消息的我无法去验证真假,也帮不上什么忙。

(更多…)

继续阅读 →

我又动了找工作的心了

最近又在考虑找工作了。

虽然这两年不在职场,但是我还是很关注的。经常会打开拉勾和BOSS直聘,看看有哪些公司在大力招人。很可惜,我住在城东,互联网公司洼地,杭州的很多公司都在滨江、城西和余杭,动不动单程十几二十公里让我很有畏惧感,一想到要每天开车穿越杭州城就有点头疼。

当然距离只是一方面原因,另外一个原因是没有找到合适的公司。自从转到Java Web方向之后,在招聘网站搜索职位的时候出现的都是一大串阿里的公司,比如淘宝天猫、蚂蚁金服、菜鸟、盒马,倒不是嫌钱少或者对阿里有什么意见,只是因为之前的工作经历让我少了一丝憧憬。接下来还有一些公司,比如网易、华为、海康威视、滴滴、有赞,都是比较成熟的公司,另外还有一些大厂在杭州有分部的,比如vivo、头条、京东数科等等,剩下的是一些中小型公司和非互联网公司的技术部门。

(更多…)

继续阅读 →

Spring Boot教程(26) – 如何发送邮件

发送邮件的需求很常见,找回密码啦,推广产品啦等等。在演示如何写代码之前,我先来说说,常见的邮件发送方式有哪些,以及我们应该如何做选择。

大体上来说,发送的方式有两种,一种是使用SMTP协议,连上SMTP服务器发送邮件,一种是使用第三方的邮件发送服务,调调API就行。我们先来说说前者。

SMTP是“简单邮件传输协议”的简称,是用来邮件的,与之对应的是用来邮件的IMAP和POP3协议,后俩协议暂且不提。现在各大邮件服务商比如Gmail,网易邮箱,QQ邮箱等都有提供SMTP服务器方便你发送邮件,比如你本地的邮件客户端,在添加你的邮箱的时候就需要提供SMTP服务器的地址和端口。同时还需要提供的,就是你的邮箱和密码,这个密码通常不是你的登陆密码,而是一个授权码,类似于token的东西,你需要在后台生成,在账户出现安全问题的时候这个授权码是有办法revoke的。有了SMTP服务的地址、端口、邮箱和密码,你就能在邮件客户端上或者编写代码来发送邮件了。

(更多…)

继续阅读 →

Spring Boot教程(25) – 状态码和错误码的一种最佳实践

前两天在V2EX上看到一个帖子,有人吐槽公司项目所有的接口请求都返回200状态码,再在body里加入code进行业务区分的做法不合理,帖子引起了程序员们激烈的讨论。左耳朵耗子(陈皓)之前也发微博讨论过这个问题,不同意见的两方人数都挺多的,各有各的道理。

“200一把梭”的人会采用类似如下的JSON响应:

{ 
   "code":123,
   "message":"OK",
   "data":{ ... }
}

即所有的请求状态码都是200,业务根据body中的code字段判断请求的状态,需要时会从data字段中拿出数据。这种方式的使用者,大概理由是,业务的状态码足够多,如果对应成HTTP状态码根本不够用。

而另一堆人对于这种做法十分反对,认为这相当于抛弃了HTTP协议的状态码,抛弃了普遍认可的共识。

(更多…)

继续阅读 →