归档

Java|使用 Optional 更好地处理 null 返回值

刘启春

Optional 是一个容器类,是 JDK 8 提供的一个防止引起空指针异常的工具类,可以更好地封装处理返回值。

为什么更推荐使用 Optional 类封装可能为 null 的返回值?在项目开发过程中,没人绝对清楚调用方法的返回值一定存在,开发者也只是尽力保证返回值不为 null,比如查询用户列表没用户时我们就返回长度为 0 的 ArrayList,有种对任何值都不信任的编程方式,但这种方式会形成许多冗余代码,让开发者也很累,不这样做会带来讨厌的 Null Pointer Exception(NPE)问题;其次是在多层次取成员变量时,程序员能判断到吐。Optional 的出现很好的改观了这个问题,一两行代码就能代替繁琐的判空。

本文对 Optional 工具的使用技巧进行总结。

灰度发布介绍

灰度发布介绍

刘启春

今年八月份,我们部门发布“禁止未经测试验证、不具备观测能力、未经灰度发布、不具备应急止损能力的服务进行上线变更”红线,目的是为了降低线上故障率,线上故障是个很玄乎的玩意,你觉得没问题这次稳了,啪说不定它就跳出来了,在公司里故障是与绩效挂钩的,出问题要有人担责。我曾经请教过一位大佬,他是做游戏开发的,我曾问他“您认为软件开发中最重要的技术能力是什么”,他答:“软件开发需要细心,不出问题比性能更重要”,大佬的话很实在。

灰度发布在大厂中是重要的功能组件,关乎软件的稳定性,作为一个开发我们如何去使用这个功能,或者怎么去实现简单的灰度功能呢,本文将尝试回答这些问题。

随笔|治疗犯困

刘启春

治疗犯困

长时间坐在家里容易犯困,似乎看几十分钟视频就要打哈欠,我想了个办法,去超市买点吃的,酸些的零食,乌梅、蓝莓之类的,在不在状态时就吃点,像喝了脉动似的,虽然不太清楚喝脉动对我提神的效果,但是我知道我爱吃酸的,伴随着味蕾的刺激,精神又从八千里外拉扯回来了。

昨天买的热水壶今天到了,准备尝试一下花茶,我在朋友圈发了一个说说让大家给我推荐写花茶,多数人给我推荐枸杞,哈,虽然这是个好东西貌似我还不需要,还有些推荐的不错的我准备尝试一下,今天在买了大朵的贡菊尝试一下还不错。

老弟的弱点

我在家里的小群里发了个消息,我爸立刻在群里发了语音,谈我弟的校招,我跟他说明后我弟就从潜水状态出来了,他说在看设计模式准备投递简历,我听到这里就没有太多担忧了,老爸继续道:“要多听听你哥的,向他请教请教,别太拗你的脾气”,之后老弟服服帖帖的连连答应,我一听乐了,看来还是老爸的话管用。下午我跟老弟视频通话,详细了解了他近期的情况并给他一些建议。

浏览器父子窗口通讯之 postMessage

刘启春

在浏览器中,postMessage() 函数是用来实现安全跨网站通讯,可以是另一个浏览器的 tab 或者嵌入页面的 iframe。这个接口可以让浏览器的页面协作起来,实现更丰富的功能,例如我们准备开发一个可能重用的页面组件,便可以将页面通过 iframe 嵌入然后通过 postMessage() 进行通讯。

Linux|生成 SSH 密钥登陆教程

刘启春

使用非对称密钥登陆 Linux

1、使用 ssh-keygen 生成公私钥

2、服务器(Linux)端 ~/.ssh/authorized_keys 文件存放公钥,保证 SSH 服务开启,默认端口 22。

3、自己保存私钥,登陆时使用 ssh 命令

命令和参数解释

# 生成密钥
ssh-keygen -t rsa -b 4096 -f ~/data/key/id_test_rsa -C "xxxxxx@163.com"

-t 密钥类型, dsa | ecdsa | ed25519 | rsa
-b RSA类型密钥的大小(长度),通常至少应该是 2048,默认 3096
-f 指定私钥的文件名,e.g. ~/.ssh/private_key_name
-C 指定一个注释

# 登录
ssh user@host/ip[:port] -i [identity_file]

e.g. root@106.14.23.168 -i ~/.ssh/id_rsa

-i identity_file 指定私钥文件

# 将公钥放到 .ssh/authorized_keys 文件中
echo id_rsa.pub >> authorized_keys

Spring|Bean的初始化、作用域

刘启春

BeanDefaintion 保存 Bean 的元信息,是 Bean 的“配料表”。

Bean 初始化的方式:

1、通过构造器除时候( 不可变对象)

public class SimpleMovieLister {

    // the SimpleMovieLister has a dependency on a MovieFinder
    private MovieFinder movieFinder;

    // a constructor so that the Spring container can inject a MovieFinder
    public SimpleMovieLister(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // business logic that actually uses the injected MovieFinder is omitted...
}

在学长的公司做面试官的问题

刘启春

我返校后就去了学长的公司,在学习期间也帮忙招一些有经验有能力的软件开发人员。我主要负责后端的面试,期间参与制定了面试的标准,出了一些公司面试问题。我们面试的人有一两年工作经验的,有实习生,还有一些刚才培训机构培训完的,也许有些人会奇怪 “怎么还面试从培训机构出来的?“,因为公司小且地理又处在三线城市,资源和吸引力不能和一线大厂比。

我们的面试流程简单,主要有以下内容:

操作系统环境变量原理

刘启春

环境变量一般指的是操作系统中一些可以变的参数,在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等。在学 Java 时,安装 JDK 后总要配置环境变量,目的是告诉操作系统我们输入命令后到底要从哪里寻找命令,因为操作系统默认只会在当前目录搜索。

由环境变量我想到了项目启动的配置,例如 Spring 中的 xml、properties、yml 类型的文件,或者使用在启动时通过配置中心(e.g. nacos、zookeeper 作配置存储的中间件),这些在项目启动后的配置都不能变更,这样导致的是修改配置必须重启项目。