Java源码示例:io.atomix.cluster.Node

示例1
@VisibleForTesting
void initTestCluster(String clusterAddrList, String host, int port) {
  isTest = true;
  this.serverHost = host;
  this.raftServerPort = port;

  // clear
  clusterNodes.clear();
  raftAddressMap.clear();
  clusterMemberIds.clear();

  String cluster[] = clusterAddrList.split(",");
  for (int i = 0; i < cluster.length; i++) {
    String[] parts = cluster[i].split(":");
    String clusterHost = parts[0];
    int clusterPort = Integer.valueOf(parts[1]);

    String memberId = clusterHost + ":" + clusterPort;
    Address address = Address.from(clusterHost, clusterPort);
    Node node = Node.builder().withId(memberId).withAddress(address).build();
    clusterNodes.add(node);
    raftAddressMap.put(MemberId.from(memberId), address);
    clusterMemberIds.add(MemberId.from(memberId));
  }
}
 
示例2
public void broadcastClusterEvent(String topic, String msg) {
  if (LOG.isDebugEnabled()) {
    LOG.debug("send broadcastClusterEvent message {}", msg);
  }
  for (Node node : clusterNodes) {
    if (StringUtils.equals(node.address().host(), serverHost)
        && node.address().port() == raftServerPort) {
      // skip myself
      continue;
    }

    CompletableFuture<byte[]> response = messagingService.sendAndReceive(node.address(),
        topic, msg.getBytes(), Duration.ofSeconds(2));
    response.whenComplete((r, e) -> {
      if (null == e) {
        LOG.error(e.getMessage(), e);
      } else {
        LOG.info("broadcastClusterNoteEvent success! {}", msg);
      }
    });
  }
}
 
示例3
@Override
public CompletableFuture<Void> join(BootstrapService bootstrap, Node localNode) {
  if (nodes.putIfAbsent(localNode.id(), localNode) == null) {
    this.bootstrap = bootstrap;
    post(new NodeDiscoveryEvent(NodeDiscoveryEvent.Type.JOIN, localNode));
    bootstrap.getBroadcastService().addListener(DISCOVERY_SUBJECT, broadcastListener);
    broadcastFuture = broadcastScheduler.scheduleAtFixedRate(
        () -> broadcastNode(localNode),
        config.getBroadcastInterval().toMillis(),
        config.getBroadcastInterval().toMillis(),
        TimeUnit.MILLISECONDS);
    broadcastNode(localNode);
    LOGGER.info("Joined");
  }
  return CompletableFuture.completedFuture(null);
}
 
示例4
/**
 * Creates an Atomix instance.
 */
protected static AtomixBuilder buildAtomix(int id, List<Integer> memberIds, Properties properties) {
  Collection<Node> nodes = memberIds.stream()
      .map(memberId -> Node.builder()
          .withId(String.valueOf(memberId))
          .withAddress(Address.from("localhost", BASE_PORT + memberId))
          .build())
      .collect(Collectors.toList());

  return Atomix.builder()
      .withClusterId("test")
      .withMemberId(String.valueOf(id))
      .withHost("localhost")
      .withPort(BASE_PORT + id)
      .withProperties(properties)
      .withMulticastEnabled()
      .withMembershipProvider(!nodes.isEmpty() ? new BootstrapDiscoveryProvider(nodes) : new MulticastDiscoveryProvider());
}
 
示例5
protected ClusterManager() {
  try {
    this.serverHost = NetworkUtils.findAvailableHostAddress();
    String clusterAddr = sconf.getClusterAddress();
    LOG.info("clusterAddr = {}", clusterAddr);
    if (!StringUtils.isEmpty(clusterAddr)) {
      String cluster[] = clusterAddr.split(",");

      for (int i = 0; i < cluster.length; i++) {
        String[] parts = cluster[i].split(":");
        String clusterHost = parts[0];
        int clusterPort = Integer.valueOf(parts[1]);
        if (this.serverHost.equalsIgnoreCase(clusterHost)) {
          raftServerPort = clusterPort;
        }

        String memberId = clusterHost + ":" + clusterPort;
        Address address = Address.from(clusterHost, clusterPort);
        Node node = Node.builder().withId(memberId).withAddress(address).build();
        clusterNodes.add(node);
        raftAddressMap.put(MemberId.from(memberId), address);
        clusterMemberIds.add(MemberId.from(memberId));
      }
    }
  } catch (UnknownHostException | SocketException e) {
    LOG.error(e.getMessage(), e);
  }
}
 
示例6
public static void main(String[] args) {
    List<Node> members = Lists.newArrayList();
    members.add(Member.builder().withId("gateway1").withAddress("127.0.0.1", 6001).build());
    members.add(Member.builder().withId("gateway2").withAddress("127.0.0.1", 6002).build());
    members.add(Member.builder().withId("gateway3").withAddress("127.0.0.1", 6003).build());

    Member member = Member.builder().withId("store").withAddress("localhost", 7001).build();
    Atomix atomix = Atomix.builder()
            .withMemberId(member.id())
            .withAddress(member.address())
            .withMembershipProvider(BootstrapDiscoveryProvider.builder()
                    .withNodes((Collection) members)
                    .build())
            .withProfiles(Profile.client())
            .build();

    atomix.start().join();


    AtomicMap<String, String> a = atomix.getAtomicMap("store-info");

    a.put("a", "test");
    try {
        Thread.sleep(1000 * 60 * 60 * 24);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}
 
示例7
/**
 * Creates an Atomix instance.
 */
private Atomix createAtomix(int id, int... ids) {
  Collection<Node> nodes = IntStream.of(ids)
      .mapToObj(memberId -> Node.builder()
          .withId(String.valueOf(memberId))
          .withAddress(Address.from("localhost", BASE_PORT + memberId))
          .build())
      .collect(Collectors.toList());

  return Atomix.builder()
      .withClusterId("test")
      .withMemberId(String.valueOf(id))
      .withHost("localhost")
      .withPort(BASE_PORT + id)
      .withMembershipProtocol(SwimMembershipProtocol.builder()
          .withBroadcastDisputes(true)
          .withBroadcastUpdates(true)
          .withProbeInterval(Duration.ofMillis(100))
          .withNotifySuspect(true)
          .withFailureTimeout(Duration.ofSeconds(3))
          .build())
      .withMembershipProvider(new BootstrapDiscoveryProvider(nodes))
      .withManagementGroup(RaftPartitionGroup.builder("system")
          .withNumPartitions(1)
          .withPartitionSize(ids.length)
          .withMembers(nodes.stream().map(node -> node.id().id()).collect(Collectors.toSet()))
          .withDataDirectory(new File("target/test-logs/" + id + "/system"))
          .build())
      .withPartitionGroups(RaftPartitionGroup.builder("test")
          .withNumPartitions(3)
          .withPartitionSize(ids.length)
          .withMembers(nodes.stream().map(node -> node.id().id()).collect(Collectors.toSet()))
          .withDataDirectory(new File("target/test-logs/" + id + "/test"))
          .build())
      .build();
}
 
示例8
protected Atomix buildAtomix(int memberId) {
  return Atomix.builder()
      .withClusterId("test")
      .withMemberId(String.valueOf(memberId))
      .withHost("localhost")
      .withPort(5000 + memberId)
      .withMulticastEnabled()
      .withMembershipProvider(new BootstrapDiscoveryProvider(
          Node.builder()
              .withId("1")
              .withHost("localhost")
              .withPort(5001)
              .build(),
          Node.builder()
              .withId("2")
              .withHost("localhost")
              .withPort(5002)
              .build(),
          Node.builder()
              .withId("3")
              .withHost("localhost")
              .withPort(5003)
              .build()))
      .withManagementGroup(PrimaryBackupPartitionGroup.builder("system")
          .withNumPartitions(1)
          .build())
      .addPartitionGroup(PrimaryBackupPartitionGroup.builder("data")
          .withNumPartitions(3)
          .build())
      .build();
}
 
示例9
/**
 * Creates an Atomix server node.
 */
private Atomix createServer(Member member, List<Node> members) {
  Atomix atomix = Atomix.builder()
      .withMemberId(member.id())
      .withAddress(member.address())
      .withMembershipProvider(BootstrapDiscoveryProvider.builder()
          .withNodes(members)
          .build())
      .withManagementGroup(managementGroup.apply(member))
      .withPartitionGroups(dataGroup.apply(member))
      .build();
  servers.add(atomix);
  return atomix;
}
 
示例10
/**
 * Handles a node join event.
 */
private void handleJoinEvent(Node node) {
  GossipMember member = new GossipMember(MemberId.from(node.id().id()), node.address());
  if (!members.containsKey(member.id())) {
    sendHeartbeat(member);
  }
}
 
示例11
/**
 * Handles a node join event.
 */
private void handleJoinEvent(Node node) {
  SwimMember member = new SwimMember(MemberId.from(node.id().id()), node.address());
  if (!members.containsKey(member.id())) {
    probe(member.copy());
  }
}
 
示例12
/**
 * Handles a node leave event.
 */
private void handleLeaveEvent(Node node) {
  SwimMember member = members.get(MemberId.from(node.id().id()));
  if (member != null && !member.isActive()) {
    members.remove(member.id());
  }
}
 
示例13
private void handleBroadcastMessage(byte[] message) {
  Node node = SERIALIZER.decode(message);
  Node oldNode = nodes.put(node.id(), node);
  if (oldNode != null && !oldNode.id().equals(node.id())) {
    post(new NodeDiscoveryEvent(NodeDiscoveryEvent.Type.LEAVE, oldNode));
    post(new NodeDiscoveryEvent(NodeDiscoveryEvent.Type.JOIN, node));
  } else if (oldNode == null) {
    post(new NodeDiscoveryEvent(NodeDiscoveryEvent.Type.JOIN, node));
  }
  updateTimes.put(node.id(), System.currentTimeMillis());
}
 
示例14
private void expireNodes() {
  Iterator<Map.Entry<NodeId, Node>> iterator = nodes.entrySet().iterator();
  while (iterator.hasNext()) {
    Map.Entry<NodeId, Node> entry = iterator.next();
    if (System.currentTimeMillis() - updateTimes.get(entry.getKey()) > config.getFailureTimeout().toMillis()) {
      iterator.remove();
      post(new NodeDiscoveryEvent(NodeDiscoveryEvent.Type.LEAVE, entry.getValue()));
    }
  }
}
 
示例15
@Override
public CompletableFuture<Void> leave(Node localNode) {
  if (nodes.remove(localNode.id()) != null) {
    post(new NodeDiscoveryEvent(NodeDiscoveryEvent.Type.LEAVE, localNode));
    bootstrap.getBroadcastService().removeListener(DISCOVERY_SUBJECT, broadcastListener);
    ScheduledFuture<?> broadcastFuture = this.broadcastFuture;
    if (broadcastFuture != null) {
      broadcastFuture.cancel(false);
    }
    LOGGER.info("Left");
  }
  return CompletableFuture.completedFuture(null);
}
 
示例16
@Override
public CompletableFuture<Void> join(BootstrapService bootstrap, Node localNode) {
  LOGGER.info("Joined");
  resolverScheduler.scheduleAtFixedRate(
      this::resolveNodes, 0, resolutionInterval.toMillis(), TimeUnit.MILLISECONDS);
  return CompletableFuture.completedFuture(null);
}
 
示例17
/**
 * Sets the bootstrap nodes.
 *
 * @param nodes the bootstrap nodes
 * @return the location provider builder
 */
public BootstrapDiscoveryBuilder withNodes(Address... nodes) {
  return withNodes(Stream.of(nodes)
      .map(address -> Node.builder()
          .withAddress(address)
          .build())
      .collect(Collectors.toSet()));
}
 
示例18
@Override
public CompletableFuture<NodeDiscoveryService> start() {
  if (started.compareAndSet(false, true)) {
    provider.addListener(discoveryEventListener);
    Node node = Node.builder().withId(localNode.id().id()).withAddress(localNode.address()).build();
    return provider.join(bootstrapService, node).thenApply(v -> this);
  }
  return CompletableFuture.completedFuture(this);
}
 
示例19
private Collection<Node> buildBootstrapNodes(int nodes) {
  return IntStream.range(1, nodes + 1)
      .mapToObj(id -> Node.builder()
          .withId(String.valueOf(id))
          .withAddress(Address.from("localhost", id))
          .build())
      .collect(Collectors.toList());
}
 
示例20
private Collection<Node> buildBootstrapNodes(int nodes) {
  return IntStream.range(1, nodes + 1)
      .mapToObj(id -> Node.builder()
          .withId(String.valueOf(id))
          .withAddress(Address.from("localhost", id))
          .build())
      .collect(Collectors.toList());
}
 
示例21
/**
 * Creates a Raft server.
 */
private RaftServer createServer(Member member, List<Node> members) {
  RaftServerProtocol protocol;
  ManagedMessagingService messagingService;
  if (USE_NETTY) {
    messagingService = (ManagedMessagingService) new NettyMessagingService("test", member.address(), new MessagingConfig())
        .start()
        .join();
    messagingServices.add(messagingService);
    protocol = new RaftServerMessagingProtocol(messagingService, PROTOCOL_SERIALIZER, addressMap::get);
  } else {
    protocol = protocolFactory.newServerProtocol(member.id());
  }

  BootstrapService bootstrapService = new BootstrapService() {
    @Override
    public MessagingService getMessagingService() {
      return messagingService;
    }

    @Override
    public UnicastService getUnicastService() {
      return new UnicastServiceAdapter();
    }

    @Override
    public BroadcastService getBroadcastService() {
      return new BroadcastServiceAdapter();
    }
  };

  RaftServer.Builder builder = RaftServer.builder(member.id())
      .withProtocol(protocol)
      .withThreadModel(ThreadModel.SHARED_THREAD_POOL)
      .withMembershipService(new DefaultClusterMembershipService(
          member,
          Version.from("1.0.0"),
          new DefaultNodeDiscoveryService(bootstrapService, member, new BootstrapDiscoveryProvider(members)),
          bootstrapService,
          new HeartbeatMembershipProtocol(new HeartbeatMembershipProtocolConfig())))
      .withStorage(RaftStorage.builder()
          .withStorageLevel(StorageLevel.DISK)
          .withDirectory(new File(String.format("target/perf-logs/%s", member.id())))
          .withNamespace(STORAGE_NAMESPACE)
          .withMaxSegmentSize(1024 * 1024 * 64)
          .withDynamicCompaction()
          .withFlushOnCommit(false)
          .build());

  RaftServer server = builder.build();
  servers.add(server);
  return server;
}
 
示例22
/**
 * Handles a node leave event.
 */
private void handleLeaveEvent(Node node) {
  members.compute(MemberId.from(node.id().id()), (id, member) -> member == null || !member.isActive() ? null : member);
}
 
示例23
@Override
public Set<Node> getNodes() {
  return ImmutableSet.copyOf(nodes.values());
}
 
示例24
private void broadcastNode(Node localNode) {
  bootstrap.getBroadcastService().broadcast(DISCOVERY_SUBJECT, SERIALIZER.encode(localNode));
  expireNodes();
}
 
示例25
public BootstrapDiscoveryProvider(Node... bootstrapNodes) {
  this(Arrays.asList(bootstrapNodes));
}
 
示例26
public BootstrapDiscoveryProvider(Collection<Node> bootstrapNodes) {
  this(new BootstrapDiscoveryConfig().setNodes(bootstrapNodes.stream()
      .map(node -> new NodeConfig().setId(node.id())
          .setAddress(node.address()))
      .collect(Collectors.toList())));
}
 
示例27
BootstrapDiscoveryProvider(BootstrapDiscoveryConfig config) {
  this.config = checkNotNull(config);
  this.bootstrapNodes = ImmutableSet.copyOf(config.getNodes().stream().map(Node::new).collect(Collectors.toList()));
}
 
示例28
@Override
public Set<Node> getNodes() {
  return bootstrapNodes;
}
 
示例29
@Override
public CompletableFuture<Void> join(BootstrapService bootstrap, Node localNode) {
  LOGGER.info("Joined");
  return CompletableFuture.completedFuture(null);
}
 
示例30
@Override
public CompletableFuture<Void> leave(Node localNode) {
  LOGGER.info("Left");
  return CompletableFuture.completedFuture(null);
}