zookeeper实战:master选举

依赖

        <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>

选举类

@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);
    }
}

测试类

@RestController
public class IndexController {

    @Autowired
    private NodeVote nodeVote;

    // 获取服务信息
    @GetMapping("/getServerInfo")
    public String getServerInfo(HttpServletRequest request) {
        nodeVote.vote(request);
        return NodeVote.isMatser ? "当前服务器为主节点" : "当前服务器为从节点";
    }
}

启动类

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}


测试结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_28822933/article/details/85939918
今日推荐