Spring Boot集成Hazelcast实现集群与分布式内存缓存 (2)

创建了一个名为instruments的分布式map数据结构,并设置了该map的最大容量200/逐出策略LRU/有效期20000ms等信息,当集群启动后,我们可以在任一成员节点上通过HazelcastInstance读写该map。

完整代码:

@SpringBootApplication public class StartUp { private Logger LOGGER = LoggerFactory.getLogger(StartUp.class); public static void main(String[] args) { SpringApplication.run(StartUp.class, args); } @Bean public Config hazelCastConfig() { //如果有集群管理中心,可以配置 ManagementCenterConfig centerConfig = new ManagementCenterConfig(); centerConfig.setUrl("http://127.0.0.1:8200/mancenter"); centerConfig.setEnabled(true); return new Config() .setInstanceName("hazelcast-instance") .setManagementCenterConfig(centerConfig) .addMapConfig( new MapConfig() .setName("instruments") .setMaxSizeConfig(new MaxSizeConfig(200, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE)) .setEvictionPolicy(EvictionPolicy.LRU) .setTimeToLiveSeconds(20000)); } }

下面我们通过修改server.port分别启动端口为8080和8081的成员服务
当启动完8080成员的时候,可以在8080控制台看到如下日志:

Members [1] { Member [172.17.42.1]:5701 - 0d39dd66-d4fb-4af4-8ddb-e9f4c7bbe5a1 this }

因我们使用的是组播传播模式,5701为节点在组播网络中分配的端口
当启动完8081成员的时候,可以在8081控制台看到如下日志:

Members [2] { Member [172.17.42.1]:5701 - 0d39dd66-d4fb-4af4-8ddb-e9f4c7bbe5a1 Member [172.17.42.1]:5702 - a46ceeb4-e079-43a5-9c9d-c74265211bf7 this }

回到8080控制台,发现多了一行日志:

Members [2] { Member [172.17.42.1]:5701 - 0d39dd66-d4fb-4af4-8ddb-e9f4c7bbe5a1 this Member [172.17.42.1]:5702 - a46ceeb4-e079-43a5-9c9d-c74265211bf7 }

发现8081成员也加入进来了。两个控制台都能看到成员列表。集群就已经搭建成功。

为了验证结果,上面我们在集群中已经创建了一个名为instruments的分布式map数据结构,现在我们通过写个接口证明:

@GetMapping("/greet") public Object greet() { Object value = Hazelcast.getHazelcastInstanceByName("hazelcast-instance").getMap("instruments").get("hello"); if (Objects.isNull(value)) { Hazelcast.getHazelcastInstanceByName("hazelcast-instance").getMap("instruments").put("hello", "world!"); } LOGGER.info("从分布式缓存获取到 key=hello,value={}", value); return value; }

首先通过访问8080服务的/greet,第一次访问instruments中是没有key为hello的键值对,会往里面塞入{"helo":"world!"},然后访问8081服务的/greet,这个时候应该是能取得改键值对的。

完整代码:

@RestController @SpringBootApplication public class StartUp { private Logger LOGGER = LoggerFactory.getLogger(StartUp.class); public static void main(String[] args) { SpringApplication.run(StartUp.class, args); } @Bean public Config hazelCastConfig() { //如果有集群管理中心,可以配置 ManagementCenterConfig centerConfig = new ManagementCenterConfig(); centerConfig.setUrl("http://127.0.0.1:8200/mancenter"); centerConfig.setEnabled(true); return new Config() .setInstanceName("hazelcast-instance") .setManagementCenterConfig(centerConfig) .addMapConfig( new MapConfig() .setName("instruments") .setMaxSizeConfig(new MaxSizeConfig(200, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE)) .setEvictionPolicy(EvictionPolicy.LRU) .setTimeToLiveSeconds(20000)); } @GetMapping("/greet") public Object greet() { Object value = Hazelcast.getHazelcastInstanceByName("hazelcast-instance").getMap("instruments").get("hello"); if (Objects.isNull(value)) { Hazelcast.getHazelcastInstanceByName("hazelcast-instance").getMap("instruments").put("hello", "world!"); } LOGGER.info("从分布式缓存获取到 key=hello,value={}", value); return value; } }

重启8080和8081服务
通过浏览器请求:8080/greet
查看8080控制台日志:
2017-10-23 13:52:27.865 INFO 13848 --- [nio-8080-exec-1] com.hazelcast.StartUp: 从分布式缓存获取到 key=hello,value=nul

通过浏览器请求:8081/greet
查看8081控制台日志:
2017-10-23 13:52:40.116 INFO 13860 --- [nio-8081-exec-2] com.hazelcast.StartUp: 从分布式缓存获取到 key=hello,value=world

Spring Boot为Hazelcast提供了明确的缓存支持。如果启用缓存, HazelcastInstance则会自动包含在CacheManager实现中。所以完全可以支持Spring Cache。

以往我们用Spring Cache都是基于Redis做存储后端,现在我们使用Hazelcast来尝试一下 首先在启动类上开启缓存
@EnableCaching

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjwgy.html