Paxos 的概念我就不在这里啰嗦了,网上有很多优秀的博客,下面是我推荐的一个写的比较好的
https://www.cnblogs.com/linbingdong/p/6253479.html
我们直接上代码吧,代码里面都有注释
先看一下项目结构图
Acceptor类
package com.paxos;
import java.util.Map;
/**
* @author jiezhou
* @CalssName: Acceptor
* @Package com.paxos
* @Description: 接受者
* @date 2020/6/24/16:08
*/
public class Acceptor {
/**
* 接受者的id(唯一标识)
*/
int id;
/**
* 提案Map类型,key 为提案编号,value提案值
*/
private Map<Integer,String> proporsal;
/**
* 接收过的最大提案编号N
*/
int resN;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Map<Integer, String> getProporsal() {
return proporsal;
}
public void setProporsal(Map<Integer, String> proporsal) {
this.proporsal = proporsal;
}
public int getResN() {
return resN;
}
public void setResN(int resN) {
this.resN = resN;
}
/**
* @param proposerN 提案编号
*
*/
public Map<Integer, String> prepareReq(int proposerN ){
if(proposerN<this.resN){ //不响应
System.out.println("proposerN:"+proposerN+",this.resN"+resN);
return null;
}else{
this.resN=proposerN;
//响应pok
return this.proporsal;
}
}
/**
* 第二阶段的 accept请求
*/
public String acceptReq(Map<Integer,String> map){
for (Map.Entry<Integer, String> entry : map.entrySet()) {
if (entry.getKey()>=this.resN){
this.setProporsal(map);
return "aok";
}
}
return "no";
}
}
Common类
package com.paxos;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author jiezhou
* @CalssName: common
* @Package com.paxos
* @Description: 公有的数据类
* @date 2020/6/24/16:18
*/
public class Common {
/**
* 提交者数量
*/
public static final int PROPOSER_COUNT = 2;
/**
* 接受者数量
*/
public static final int ACCEPTOR_COUNT = 3;
/**
* 全局提案编号(初始值为1)
*/
public static AtomicInteger proposerN=new AtomicInteger(0);
}
Proposer类
package com.paxos;
import java.util.Map;
/**
* @author jiezhou
* @CalssName: Proposer
* @Package com.paxos
* @Description: 提议者
* @date 2020/6/24/16:08
*/
public class Proposer {
/**
* 提议者id(唯一标识)
*/
private int id;
/**
* 提案Map类型,key 为提案编号,value提案值
*/
private Map<Integer,String> proporsal;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Map<Integer, String> getProporsal() {
return proporsal;
}
public void setProporsal(Map<Integer, String> proporsal) {
this.proporsal = proporsal;
}
}
RandomUtils类
package com.paxos;
import java.util.Random;
/**
* @author jiezhou
* @CalssName: RandomUtils
* @Package com.paxos
* @Description: 随机数(模拟由于网络通信挂掉的提交者或者接受者的id)
* @date 2020/6/24/16:22
*/
public class RandomUtils {
public static int randomAcceptorId(){
Random random = new Random();
int id = random.nextInt(Common.ACCEPTOR_COUNT)+1;
System.out.println(id);
return id;
}
public static int randomProposerId(){
Random random = new Random();
int id = random.nextInt(Common.PROPOSER_COUNT)+1;
// System.out.p