不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

安装wireshark

1
2
3
4
5
6
7
8
9
10
11
12
# 添加wireshark 下载链接地址,然后更新软件源
sudo apt-add-repository ppa:wireshark-dev/stable
sudo apt-get update

# 在命令行安装wireshark
sudo apt-get install wireshark

# 续配置,新建wireshark 用户组,把当前用户加入wireshark 用户组
sudo groupadd wireshark
sudo chgrp wireshark /usr/bin/dumpcap
sudo chmod 4755 /usr/bin/dumpcap
sudo gpasswd -a your_username wireshark

TCP协议

概念

TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。

阅读全文 »

如何理解“接口隔离原则”?

接口隔离原则的英文翻译是“ Interface Segregation Principle”,缩写为 ISP。
Robert Martin 在 SOLID 原则中是这样定义它的:“Clients should not be forced to depend upon interfaces that they do not use。”直译成中文的话就是:客户端不应该强迫依赖它不需要的接口。其中的“客户端”,可以理解为接口的调用者或者使用者。

理解接口隔离原则的关键,就是理解其中的“接口”二字。在这条原则中,我们可以把“接口”理解为下面三种东西:

  • 一组 API 接口集合
  • 单个 API 接口或函数
  • OOP 中的接口概念

把“接口”理解为一组 API 接口集合

阅读全文 »

如何理解“里式替换原则”?

里式替换原则的英文翻译是:Liskov Substitution Principle,缩写为 LSP。
这个原则最早是在 1986 年由 Barbara Liskov 提出,他是这么描述这条原则的:

If S is a subtype of T, then objects of type T may be replaced with objects of type S, without breaking the program。

在 1996 年,Robert Martin 在他的 SOLID 原则中,重新描述了这个原则,英文原话是这样的:

Functions that use pointers of references to base classes must be able to use objects of derived classes without knowing it。

阅读全文 »

如何理解“对扩展开放、修改关闭”?

开闭原则的英文全称是 Open Closed Principle,简写为 OCP。
它的英文描述是:software entities (modules, classes, functions, etc.) should be open for extension ,but closed for modification。我们把它翻译成中文就是:软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭”。

详细描述:添加一个新的功能应该是,在已有代码基础上扩展代码(新增模块、类、方法等),而非修改已有代码(修改模块、类、方法等)。

例如:这是一段 API 接口监控告警的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Alert {
private AlertRule rule; //存储告警规则,可以自由设置。
private Notification notification; //告警通知类,支持邮件、短信、微信、手机等多种通知渠道。
public Alert(AlertRule rule, Notification notification) {
this.rule = rule;
this.notification = notification;
}

public void check(String api, long requestCount, long errorCount, long durati) {
long tps = requestCount / durationOfSeconds;
if (tps > rule.getMatchedRule(api).getMaxTps()) {
//NotificationEmergencyLevel 表示通知的紧急程度,包括 SEVERE(严重)、URGENCY(紧急)、NORMAL(普通)、TRIVIAL(无关紧要),不同的紧急程度对应不同的发送渠道。
notification.notify(NotificationEmergencyLevel.URGENCY, "...");
}
if (errorCount > rule.getMatchedRule(api).getMaxErrorCount()) {
notification.notify(NotificationEmergencyLevel.SEVERE, "...");
}
}
}
阅读全文 »

如何理解单一职责原则(SRP)?

单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP。
这个原则的英文描述是这样的:A class or module should have a single reponsibility。如果我们把它翻译成中文,那就是:一个类或者模块只负责完成一个职责(或者功能)。

简单理解,就是不要设计大而全的类,要设计粒度小、功能单一的类。
换个角度来讲就是,一个类包含了两个或者两个以上业务不相干的功能,那我们就说它职责不够单一,应该将它拆分成多个功能更加单一、粒度更细的类。

例如:一个类里既包含订单的一些操作,又包含用户的一些操作。而订单和用户是两个独立的业务领域模型,我们将两个不相干的功能放到同一个类中,那就违反了单一职责原则。为了满足单一职责原则,我们需要将这个类拆分成两个粒度更细、功能更加单一的两个类:订单类和用户类。

如何判断类的职责是否足够单一?

阅读全文 »

为什么要使用单例?

单例的定义

一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。

单例的用处

从业务概念上,有些数据在系统中只应该保存一份,就比较适合设计为单例类。比如,系统的配置信息类。除此之外,我们还可以使用单例解决资源访问冲突的问题。

阅读全文 »

10月份面试偶然遇见一个做基础架构的实验室的招聘,意外结识了三位面试官,上周去了这家公司所在的位置,与负责人S老哥做了一次长达三个小时的谈话,我将内容分块提炼了出来。

你到底想要做什么

这是一个很简单的问题,却有很多人想不明白,包括我在内。

谈话结束后,我想了想,放佛找不到到底想要做什么,本科毕业工作三年,我只能说,我不想做频繁的CRUD工作,我想做有深度、有成长、有成就感的工作,但我现在还没有找到这个工作是什么。

以终为始

阅读全文 »