Kamafeel

求其上,得其中;求其中,得其下,求其下,必败


  • 首页

  • 归档

ES超时的坑

发表于 2020-10-13 | 更新于 2020-10-26 | 分类于 中间件 , ES

不合理的超时设置,最大情况就是拖爆你的服务端

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 不是你想象的那样,没有屁用。

https://www.liangzl.com/get-article-detail-136496.html

https://www.jianshu.com/p/f781e38b3bb8

Java莫名其妙的慢

发表于 2020-10-13 | 更新于 2022-03-05 | 分类于 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占用不高,分析查看线程阻塞的原因。

需求分析

发表于 2020-09-29 | 更新于 2021-11-18 | 分类于 架构 , 基础

需求分析的基本方法

alt

S: Specific(明確)
M: Measurable(可衡量)
A: Achievable(可達成)
R: Relevant(相關)
T: Time-bound(有時限)

线程启动的流程

发表于 2020-09-23 | 分类于 JAVA , 并发

为什么线程启动是调用start方法来启动线程而不能直接调用run方法?
如果多次调用start方法会发生什么?

线程的状态

线程从创建到死亡是会经历多个状态的流转的。它们分别是:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED

alt

start()方法是用来启动线程,真正实现了多线程运行。

run()方法是一个普通方法。

调用start()方法后会先判断线程的状态是否为NEW,所以线程只能启动一次。

时间规划

发表于 2020-09-23 | 分类于 瞎扯蛋

生命是以时间为单位的,浪费别人的时间等于谋财害命;浪费自己的时间,等于慢性自杀。

——鲁迅

使用DDD进行微服务划分

发表于 2020-09-22 | 更新于 2021-11-18 | 分类于 微服务 , DDD

微服务应该怎么弄

微服务的框架有很多 Java侧的dubbo,spring cloud(Netflix,alibaba),再用K8S去调度,扩容。
但这些都只是手段,或者按武侠思维来说,这只是招式。
而如何划分微服务显得更为重要,似乎这是内功。

核心思想

高度内聚(模型不能再拆)

作限界上下文 (清晰的边界)

怎么找–>

事件风暴工作坊,工作坊要求业务需求提出者和技术实施者协作完成领域建模。把系统状态做出改变的事件作为关键点,从系统事件的角度触发,提取能反应系统运作的业务模型。再进一步识别模型之间的关系,划分出限界上下文,可以看做逻辑上的微服务

alt

一个个事件,找到共同作用的主体,把这些主体进行高内聚,抽象为不再划分的模型。

识别模型中的二义性(视角导致主体相似性,需要特别区别),让限界上下文划分更为准确

如何验收

两个目的出发:降低耦合、容易扩展,可以作为限界上下文评审原则

原则1,设计出来的限界上下文之间的互相依赖应该越少越好,依赖的上游不应该知道下游的信息。(被依赖者,例如订单依赖商品,商品不需要知道订单的信息)。
原则2,使用潜在业务进行适配,如果能在一定程度上响应业务变化,则证明用它指导出来的微服务可以在相当一段时间内足以支撑应用开发。

在微服务设计时,如果 domain service 需要通过一个 from 参数,根据不同的渠道做出不同的行为,这对系统的拓展是致命的。例如,用户服务对于访问他的来源不应该知晓;用户服务应该对订单、商品、物流等访问者提供无差别的服务。

因此,微服务的依赖关系可以总结为:上游系统不需要知道下游系统信息,否则请重新审视系统架构。

一些工具

C4 UML
多练习

https://gudaoxuri.gitbook.io/microservices-architecture/wei-fu-wu-hua-zhi-ji-shu-jia-gou/services-division

https://zhuanlan.zhihu.com/p/86346030

https://www.jdon.com/

mybatis-plus基本原理

发表于 2020-09-22 | 更新于 2022-03-08 | 分类于 开源框架 , mybatis-plus

Wrapper 灵活

MybatisMapperProxy 代理执行

MybatisMapperMethod 核心转换方法

this,static,super,final

发表于 2020-09-22 | 更新于 2020-10-20 | 分类于 JAVA , 开发

static

用法
最基本的用法是,static 可以用于修饰成员变量和成员方法,我们将其称之为静态变量和静态方法,直接通过类名来进行访问。

当一个事物为static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起,所以从未创建某个类的任何对象,也可以调用其static方法或访问其static域。

变量
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

static成员变量的初始化顺序按照定义的顺序进行初始化。

this

只能用在构造器或者方法中,用于获得调用当前的构造器方法的对象引用。可以和任何的对象引用一样来处理这个this对象

final

终态

编译器final修饰的变量 放到寄存器(非共享内存)
并发线程安全,程序任何对象的初始化happen-before于程序中任何其他的动作操作行为能够保证不被重排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
public static void main(String[] args) {
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;
// 由于b是常量所以编译期,编译器会直接将b替换为其值,并直接拼接成"Hello2"赋值给c,这又叫做“常量优化”
// 故在编译期就能确定b值
String e = d + 2;
// 由于赋值语句右侧使用的不同类型常量赋值,因此会使用StringBuilder实现字符串拼接
// 会先调用其append方法最后调用toString方法,而toString方法是new String并返回,即在堆中创建对象
// 故e的值需要运行时确定
String f = "hello" + "2";
// 而f的赋值语句右侧也都是字面量,或者说常量,同字符串c的解释,故在编译期就能确定f值
// 故最终的输出结果为:
System.out.println(a == c);// true
System.out.println(a == e);// false
System.out.println(a == f);// true
}


C:\Users\DELL\Desktop>javap -c Solution.class
Compiled from "Solution.java"
public class LeetCodeStudy.Solution {
public LeetCodeStudy.Solution();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return

public static void main(java.lang.String[]);
Code:
0: ldc #2 // String hello2
2: astore_1
3: ldc #3 // String hello
5: astore_2
6: ldc #3 // String hello
8: astore_3
9: ldc #2 // String hello2
11: astore 4
13: new #4 // class java/lang/StringBuilder
16: dup
17: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
20: aload_3
21: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
24: iconst_2
25: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
28: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
31: astore 5
33: ldc #2 // String hello2
35: astore 6
37: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream;
40: aload_1
41: aload 4
43: if_acmpne 50
46: iconst_1
47: goto 51
50: iconst_0
51: invokevirtual #10 // Method java/io/PrintStream.println:(Z)V
54: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream;
57: aload_1
58: aload 5
60: if_acmpne 67
63: iconst_1
64: goto 68
67: iconst_0
68: invokevirtual #10 // Method java/io/PrintStream.println:(Z)V
71: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream;
74: aload_1
75: aload 6
77: if_acmpne 84
80: iconst_1
81: goto 85
84: iconst_0
85: invokevirtual #10 // Method java/io/PrintStream.println:(Z)V
88: return
}

super

super是当前对象里面的父对象的引用,使用super来引用父类的某种东西

Java运算符优先级

发表于 2020-09-21 | 更新于 2020-09-22 | 分类于 JAVA , 开发

alt

  • i++ 先赋值在运算,例如 a=i++,先赋值a=i,后运算i=i+1,所以结果是a==1
    • ++i 先运算在赋值,例如 a=++i,先运算i=i+1,后赋值a=i,所以结果是a==2

UML箭头

发表于 2020-09-20 | 更新于 2021-11-18 | 分类于 架构 , 基础

alt

1…121314…21

Kamafeel

204 日志
57 分类
129 标签
© 2022 Kamafeel
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Pisces v7.1.2