Spring Boot集成Atomix快速入门Demo

1.什么是Atomix?

Atomix是一个能用的Java框架,用来构建高可用的分布式系统。它是基于RAFT协议的实现,为用户提供了各种原子数据结构,比如map/set/integer等,这些数据结构都可以在整个集群中共享并保证一致性,同时也提供了LeaderElection的原子对象,用来注册候选主结点、监听相关事件等的功能。

大多数分布式应用都需要一些有状态的组件来实现一致性和容错性。Atomix是一个可嵌入的库,有助于实现分布式资源的容错和一致性。

它提供了一套丰富的API,用于管理其资源,如集合、组和并发的工具。

2.代码工程

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>springboot-demo</artifactId>        <groupId>com.et</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>
<artifactId>atomix</artifactId>
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <atomix.version>3.1.12</atomix.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>

<dependency> <groupId>io.atomix</groupId> <artifactId>atomix</artifactId> <version>${atomix.version}</version> </dependency> <dependency> <groupId>io.atomix</groupId> <artifactId>atomix-raft</artifactId> <version>${atomix.version}</version> </dependency>
</dependencies></project>

建立集群

private static Atomix buildAtomix() {    List<String> raftMembers = Collections.singletonList("node1");    //创建atomix    return Atomix.builder(AtomixCluster.class.getClassLoader())            .withClusterId("my-cluster")            .withMemberId("node1")            .withHost("127.0.0.1")            .withPort(6789)            .withMembershipProvider(BootstrapDiscoveryProvider.builder().build())            .withManagementGroup(RaftPartitionGroup.builder("system")                    .withNumPartitions(1)                    .withDataDirectory(new File(LOCAL_DATA_DIR, "system"))                    .withMembers(raftMembers)                    .build())            .addPartitionGroup(RaftPartitionGroup.builder(groupName)                    .withNumPartitions(raftMembers.size())                    .withDataDirectory(new File(LOCAL_DATA_DIR, "data"))                    .withMembers(raftMembers)                    .build())            .build();}

分布式Map存储

Atomix atomix = buildAtomix();//atomix启动并加入集群atomix.start().join();
//创建atomixMapAsyncAtomicMap<Object, Object> asyncAtomicMap = atomix.atomicMapBuilder("myCfgName") .withProtocol(MultiRaftProtocol.builder(groupName) .withRecoveryStrategy(Recovery.RECOVER) .withMaxRetries(MAX_RETRIES) .build()) .withReadOnly(false) .build() .async();//进行数据存储asyncAtomicMap.put("HBLOG", "http://www.liuhaihua.cn");//进行查询CompletableFuture<Versioned<Object>> myBlog = asyncAtomicMap.get("HBLOG");Versioned<Object> objectVersioned = myBlog.get();System.out.printf("value:%s version:%s%n", objectVersioned.value(), objectVersioned.version());

选举

//ElectorAsyncLeaderElector leaderElector = atomix.leaderElectorBuilder("leader")      .withProtocol(MultiRaftProtocol.builder(groupName)            .withRecoveryStrategy(Recovery.RECOVER)            .withMaxRetries(MAX_RETRIES)            .withMaxTimeout(Duration.ofMillis(15000L))            .build())      .withReadOnly(false)      .build()      .async();//获取出当前节点Member localMember = atomix.getMembershipService().getLocalMember();System.out.println("localMember:" + localMember.toString());String topic = "this is a topic";//根据某一topic选举出leader,返回的是选举为leader的节点Leadership leadership = (Leadership) leaderElector.run(topic, localMember.toString()).get();System.out.println("==========" + leadership);//get leadershipLeadership topicLeadership = (Leadership) leaderElector.getLeadership(topic).get();System.out.println("------------>" + topicLeadership);//输出所有的topic对应的leaderMap topicLeadershipMaps = (Map) leaderElector.getLeaderships().get();System.out.println("++++++++++++" + topicLeadershipMaps.toString());

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springboot-demo

3.总结

atomix的api远不止本例中的两个,还有其他很多的api。如分布式锁、分布式事务、分布式自增id、分布式队列、分布式信息号等,这些在atomix中都有实现,详细可见atomix的类方法!更多关于atomix的相关介绍,可以在对应的github中找到: https://github.com/atomix/atomix-archive

需要注意的是:基于java的atomix现已停止维护,这里仅用作学习目的,在分布式系统中体验一下。

4.引用

  • https://raft.github.io/

  • https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md

  • http://atomix.io/atomix/

  • https://raft.github.io/raft.pdf

  • http://colobu.com/2016/02/29/Java-CompletableFuture/

相关推荐

  • 工控5年!!!只会给RS232接三根线???
  • 62.2K Star 6万人关注!!!文件同步神器,从未如此简单
  • 3人团队年入1000万,本地生活还能这么玩?
  • 百度文心旗舰模型全线降价,价格战能持续多久?哪些企业先淘汰?
  • 阿尔特曼20年:从“硅谷地下国王”到黯然离场
  • 10年砸下650亿美元,硅谷最疯狂的元宇宙投资故事揭秘
  • 通用机器人是 AI 时代的新 "iPhone" 吗?
  • 奇舞周刊第533期:单点登录(SSO)实现详解
  • 曾炒到 10 万一台的苹果 Vision Pro,IDC 预测:年销量不超过 50 万台,低配版或明年发布
  • 相见恨晚的《新程序员》 AI 专辑
  • 月薪集中在8k-17k、近六成的人一年没跳槽、AI可减少20%-40%工作量,2024中国开发者调查报告来了!
  • “我的代码被微软和 OpenAI 抄了,维权后被他们耗了两年”
  • 小程序如何开通流量主赚钱呢?
  • 微软中国员工被禁止使用安卓手机,只能用 iPhone
  • 华为专家:你管这破玩意叫 AI Agent?!
  • 博士创业,上海浦东的明星公司要IPO了
  • 程序员这样自学,效率翻倍!
  • MySQL 中 DATETIME 和 TIMESTAMP 有什么区别?
  • 用开源项目去参赛?别搞!
  • 一句慢 SQL 执行 600 秒?!你咋不上天呢