一,zookeeper源码解析
源码流程图:https://www.processon.com/embed/640ec2155476aa23907484f0
1.1 程序入口
Zookeeper 服务的启动命令是 zkServer.sh start
2022/5/28大约 32 分钟
源码流程图:https://www.processon.com/embed/640ec2155476aa23907484f0
Zookeeper 服务的启动命令是 zkServer.sh start
作用:CountDownLatch类能够使一个线程等待其他线程完成各自的工作后再执行。
使用场景:Zookeeper分布式锁,Jmeter模拟高并发等。
工作原理:CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,通过调用``countDown();`方法使计数器的值就会减1,当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。
public class CountDownLatchTest {
private static CountDownLatch countDownLatsh = new CountDownLatch(5);
private static class Player implements Runnable{
private Integer index;
public Player(Integer index){
this.index = index;
}
@Override
public void run() {
System.out.println("玩家"+index+"准备完成");
countDownLatsh.countDown();
}
}
public static void main(String[] args) throws InterruptedException {
for(int i = 0; i < 5; i++){
new Thread(new Player(i)).start();
}
countDownLatsh.await();
System.out.println("玩家准备完毕,开始游戏");
}
}
volatile是Java虚拟机提供的轻量级的同步机制。volatile关键字有如下两个作用
关于volatile的可见性作用,我们必须意识到被volatile修饰的变量对所有线程总数立即 可见的,对volatile变量的所有写操作总是能立刻反应到其他线程中。
装饰者模式上指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式
模式结构成员构成:
| 配置项 | 说明 |
|---|---|
| 资源名:resource | 限流规则的作用对象,最常用的资源是我们代码中的 Java 方法,一段代码,或者一个接口 |
| 针对来源: limitApp | 流控针对的调用来源,填写微服务名,default代表不区分调用来源 |
| 阀值类型: grade | - QPS:每秒请求数,当前调用该api的QPS到达阈值的时候进行限流 - 线程数: 当调用该api的并发线程数到达阈值的时候,进行限流 |
| 单机/均摊/总体阀值:count | 阀值类型是QPS表示每秒的请求数;阀值类型是线程数表示并发线程数 |
| 流控模式:strategy | 直接; 关联; 链路 |
| 流控效果: controlBehavior | 直接拒绝; 排队等待; 慢启动模式 |
| 注意:同一个资源可以设置多个流控规则,我们可以通过代码定义流量控制规则也可以通过在sentinel控制台进行配置,一般我们都是使用控制台进行配置,下面是一个代码配置的方式: |
事件:
public class CustomEvent extends ApplicationEvent {
private String name;
public CustomEvent(Object source,String name) {
super(source);
this.name = name;
}
public String getName() {
return name;
}
}
作用:
JVM Process Status Tool,显示虚拟机进程。
用法:
jps [-qmlvV]
| 修饰符 | 当前类(案例1) | 同一包内(案例2) | 子孙类(案例3) | 子孙类(不同包)(案例4) | 其他包(案例5) |
|---|---|---|---|---|---|
| public | Y | Y | Y | Y | Y |
| protected | Y | Y | Y | Y/N(案例4.1) | N |
| default | Y | Y | Y | N | N |
| private | Y | N | N | N | N |
在开发中,通常需要为方法添加日志打印,能够记录程序的执行过程,以便后续出现异常问题的时候,能更好的排查定位。假设我们现在已经完成了系统用户的增加、删除、修改等功能,这些功能在类UserServiceImpl中已经实现。
public interface UserService {
void add();
void update();
void delete();
}
public class UserServiceImpl implements UserService{
public void add() {
System.out.println("添加用户");
}
public void update() {
System.out.println("修改用户");
}
public void delete() {
System.out.println("删除用户");
}
}