客户端发送DNS访问请求

当客户端需要解析域名时,就会构造一个DNS(应用层的协议)请求,并通过UDP协议将其发送到DNS

服务器进行域名解析。一般是本地的DNS缓存或者配置的比如ISP的DNS服务器或者一些公共DNS服务器

比如google的8.8.8.8

查询请求的构造

DNS请求一般包含什么

标识符:请求唯一ID,由客户端发送,服务端响应时返回

标志:标志字段,包括查询,响应

问题计数:表示查询请求中的问题数

问题区域:查询的域名

客户端发送UDP数据包

早期tomcat采用的网络IO模型:一个连接即一个线程

Java NIO:用尽量少的线程管理尽量多的网络连接(原生的NIO是 单线程管理多个连接)

Reactor响应式编程

单线程Reactor

多线程Reactor

Reactor和Java NIO的关系

1.对NIO进行了扩展,NIO对多线程支持不好,得自己封装

推特两个业务:发布推文和主页时间线

两种方案:

读扩散

不足:读取压力大

写扩散

写要比读的好,因为发推的频率要比主页刷新的频率低很多

不足:有些up的博主粉丝量大。写入的粉丝收件箱的数量很大,写入请求量级巨大

在推特的例子中,粉丝数是一个重要参数,推特采用了两种架构的结合

基于责任链模式实现某跨服活动,依次校验红包、库存、物流等正向触点,基于Spring的Bean发现实现高扩展设计,使用单例模式减少每次执行时的内存开销,线上用户订单留存率提升约4%:

外部actor查询时通过launch()协程来优化handler方法,实现一个actor同时处理多条查询请求。因为actor本

身就只能处理一条命令

  1. SPI机制

  1. Spring Boot @ConditionalOnProperty

  1. Spring AOP

PS:isEnable() 如何感知到配置文件内容的变化

1.结合配置中心

2.将变量的修改应接口的方式暴露出去

  1. 出口网关

  1. API网关配置

  1. 自适应配置

利用Spring validation的分组校验功能可以实现

同一个请求对象,同一份校验注解,不同接口,不同的校验逻辑。

User

1
2
3
4
5
6
7
class User{
//groups 指定适用规则
@Null(groups=Groups.Insert.class)
@NotNull()
private Long ID;
private String name;
}

GROUP

1
2
3
4
interface Groups{
interface Insert{}
interface Update{}
}

Controller

1
2
void methodA(@Validated(Groups.Insert.class) String xx)

gobal exception handler

就是那些灵活变化的字段独立出去变成一张表,主表为固定不变的字段

但ext表的数据增长量会比较大,针对这个情况可做分表(按id键分)

查询的话,基于ES进行全文查询,插入DB后同步到es,这个过程可以异步的(mq,flinkCDC监听binlog)等

方式进行处理