rely
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
Election
@Component
public class NodeVote implements InitializingBean, DisposableBean {
// 创建zk连接
//ZooKeeper服务地址
private static final String SERVER = "127.0.0.1:2181";
private static ZkClient zkClient = null;
private final String PATH = "/election";
@Value("${server.port}")
private String serverPort;
public static volatile boolean isMatser = true;
private AtomicReference<HttpServletRequest> request = null;
public void vote(HttpServletRequest request) {
createNode(request);
ScheduledExecutorService scheService = Executors.newScheduledThreadPool(1);
//监听节点
zkClient.subscribeDataChanges(PATH, new IZkDataListener() {
@Override
public void handleDataChange(String s, Object o) throws Exception {
}
@Override
public void handleDataDeleted(String s) throws Exception {
//防止假死情况,所以需要定时PING,心跳检测
scheService.schedule(new Runnable() {
@Override
public void run() {
//被删除的时候创建新节点
createNode(request);
}
}, 5, TimeUnit.SECONDS);
}
});
}
//创建节点
public void createNode(HttpServletRequest request) {
try {
zkClient.createEphemeral(PATH, "test");
if (this.request == null) {
this.request = new AtomicReference<>(request);
} else {
this.request.set(request);
}
} catch (Exception e) {
if (this.request.get() == request) {
isMatser = true;
} else {
isMatser = false;
}
}
}
@Override
public void destroy() throws Exception {
zkClient.close();
}
@Override
public void afterPropertiesSet() throws Exception {
zkClient = new ZkClient(SERVER);
}
}
Test class
@RestController
public class IndexController {
@Autowired
private NodeVote nodeVote;
// 获取服务信息
@GetMapping("/getServerInfo")
public String getServerInfo(HttpServletRequest request) {
nodeVote.vote(request);
return NodeVote.isMatser ? "当前服务器为主节点" : "当前服务器为从节点";
}
}
Start class
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Test Results