不合理的超时设置,最大情况就是拖爆你的服务端
SetTimeout方法是不可靠的,解释如下:
Sadly, it is a best effort timeout, its not being checked on all places. Specifically, if you send a query that ends up being rewritten into many terms (fuzzy, or wildcard), that part (the rewrite part) does not check for a timeout.SetTimeout 不是你想象的那样,没有屁用。
Java莫名其妙的慢
随机数
file:/dev/random方法是阻塞的,如果嫡池为空
file:/dev/urandom启动参数加上
-Djava.security.egd=file:/dev/./urandom或者直接修改
$JAVA_HOME/jre/lib/security/java.security
https://hongjiang.info/jvm-random-and-entropy-source/
网关配置错误
/etc/hosts 是否配置正确,是否配置本机IP,本机机器名
磁盘性能
dd if=/dev/zero of=sun.txt bs=1M count=1
多次测试,观察磁盘速度是否存在速度下降。
jstack分析线程堆栈信息
jstack -l PID
如果发现没任何日志输出,CPU占用不高,分析查看线程阻塞的原因。
使用DDD进行微服务划分
微服务应该怎么弄
微服务的框架有很多 Java侧的dubbo,spring cloud(Netflix,alibaba),再用K8S去调度,扩容。
但这些都只是手段,或者按武侠思维来说,这只是招式。
而如何划分微服务显得更为重要,似乎这是内功。
核心思想
高度内聚(模型不能再拆)
作限界上下文 (清晰的边界)
怎么找–>
事件风暴工作坊,工作坊要求业务需求提出者和技术实施者协作完成领域建模。把系统状态做出改变的事件作为关键点,从系统事件的角度触发,提取能反应系统运作的业务模型。再进一步识别模型之间的关系,划分出限界上下文,可以看做逻辑上的微服务
一个个事件,找到共同作用的主体,把这些主体进行高内聚,抽象为不再划分的模型。
识别模型中的二义性(视角导致主体相似性,需要特别区别),让限界上下文划分更为准确
如何验收
两个目的出发:降低耦合、容易扩展,可以作为限界上下文评审原则
原则1,设计出来的限界上下文之间的互相依赖应该越少越好,依赖的上游不应该知道下游的信息。(被依赖者,例如订单依赖商品,商品不需要知道订单的信息)。
原则2,使用潜在业务进行适配,如果能在一定程度上响应业务变化,则证明用它指导出来的微服务可以在相当一段时间内足以支撑应用开发。
在微服务设计时,如果 domain service 需要通过一个 from 参数,根据不同的渠道做出不同的行为,这对系统的拓展是致命的。例如,用户服务对于访问他的来源不应该知晓;用户服务应该对订单、商品、物流等访问者提供无差别的服务。
因此,微服务的依赖关系可以总结为:上游系统不需要知道下游系统信息,否则请重新审视系统架构。
一些工具
C4 UML
多练习
mybatis-plus基本原理
Wrapper 灵活
MybatisMapperProxy 代理执行
MybatisMapperMethod 核心转换方法
this,static,super,final
static
用法
最基本的用法是,static 可以用于修饰成员变量和成员方法,我们将其称之为静态变量和静态方法,直接通过类名来进行访问。当一个事物为static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起,所以从未创建某个类的任何对象,也可以调用其static方法或访问其static域。
变量
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。static成员变量的初始化顺序按照定义的顺序进行初始化。
this
只能用在构造器或者方法中,用于获得调用当前的构造器方法的对象引用。可以和任何的对象引用一样来处理这个this对象
final
终态
编译器final修饰的变量 放到寄存器(非共享内存)
并发线程安全,程序任何对象的初始化happen-before于程序中任何其他的动作操作行为能够保证不被重排序
1 | public static void main(String[] args) { |
super
super是当前对象里面的父对象的引用,使用super来引用父类的某种东西
Java运算符优先级
- i++ 先赋值在运算,例如 a=i++,先赋值a=i,后运算i=i+1,所以结果是a==1
- ++i 先运算在赋值,例如 a=++i,先运算i=i+1,后赋值a=i,所以结果是a==2