1、使用Zookeeper实现服务Master选举(哨兵机制):
    多个服务器在启动的时候,会在Zookeeper上创建相同的临时节点,谁如果能创建成功,谁就为主节点(因为节点保证唯一),如果主服务器宕机之后,因为有节点的删除事件监听机制,则会话连接消失的同时,其他服务器就开始重新选举;
    Zookeeper实现Master选举.png

    1. package zk_day_64_;
    2. import org.I0Itec.zkclient.IZkDataListener;
    3. import org.I0Itec.zkclient.ZkClient;
    4. import org.springframework.beans.factory.annotation.Value;
    5. import org.springframework.boot.ApplicationArguments;
    6. import org.springframework.boot.ApplicationRunner;
    7. import org.springframework.stereotype.Component;
    8. @Component
    9. public class MyApplicationRunner implements ApplicationRunner {
    10. private ZkClient zkClient = new ZkClient("127.0.0.1:2181");
    11. private String path = "/election";
    12. @Value("${server.port}")
    13. private String serverPort;
    14. // 启动后执行方法
    15. public void run(ApplicationArguments args) throws Exception {
    16. System.out.println("项目启动成功...");
    17. // 1.项目启动的时候会在zk上创建一个相同的临时节点
    18. // 2.谁能够创建成功谁就是为主服务器
    19. createEphemeral();
    20. // 3.使用服务监听节点是否被删除,如果接受到节点被删除的话,重新开始选举(重新开始创建节点)
    21. zkClient.subscribeDataChanges(path, new IZkDataListener() {
    22. // 节点如果被删除后 ,返回通知
    23. public void handleDataDeleted(String dataPath) throws Exception {
    24. System.out.println("开始重新选举策略。。。");
    25. createEphemeral();
    26. }
    27. /// 当节点值发生变化的之后,事件通知
    28. public void handleDataChange(String dataPath, Object data) throws Exception {
    29. }
    30. });
    31. }
    32. private void createEphemeral() {
    33. try {
    34. zkClient.createEphemeral(path);
    35. System.out.println("serverPort:" + serverPort + ",选举成功....");
    36. ElectionMaster.isSurvival = true;
    37. } catch (Exception e) {
    38. System.out.println("该节点已经存在");
    39. ElectionMaster.isSurvival = false;
    40. }
    41. }
    42. }

    代码.zip分布式协调工具-ZooKeeper.docx