Hazelcast系列(三):hazelcast集成(服务器/客户端)
系列文章
Hazelcast系列(一):初识hazelcast
Hazelcast系列(二):hazelcast集成(嵌入式)
Hazelcast系列(三):hazelcast集成(服务器/客户端)
Hazelcast系列(四):hazelcast管理中心
Hazelcast系列(五):Auto-Detection发现机制
Hazelcast系列(六):Multicast发现机制
Hazelcast系列(七):TCP-IP发现机制
Hazelcast系列(八):数据结构
目录
前言
环境
服务器
客户端
测试
其他
参考
前言
前面对通过 Hazelcast系列(二):hazelcast集成(嵌入式)已经对 Hazelcast 如何在 Java 中使用,已经有了初步的认识,接下来,咱们研究一下 Hazelcast 集成的另外一种模式:服务器/客户端 。
相较于 嵌入式 的模式,服务器/客户端 模式将 Hazelcast 缓存服务和客户端单独拆分开,方便后期对服务器的单独维护和持续扩展,避免缓存的数据在堆内存中影响到垃圾收集器收集效率和垃圾回收时的应用响应时间。
当前 Hazelcast 服务器版本:4.2.6,客户端版本:5.1.7。
环境
名称 | 版本 |
hazelcast/management-center 管理中心 | 5.3.0 |
hazelcast/hazelcast 服务端 | 4.2.6 |
springboot | 2.7.16 |
hazelcast 客户端 | 5.1.7 |
服务器
服务器端通过 Docker 部署,Docker 的安装和配置可以参照俺的 CentOS 7下安装Docker,部署采用版本 hazelcast/hazelcast:4.2.6。
- 首先拉取 hazelcast 的镜像
docker pull hazelcast/hazelcast:4.2.6
- 添加一个配置文件 hazelcast.yaml,配置服务器集群中成员的相关参数,然后放在某个目录下,这里为 /home/hazelcast/config
hazelcast:cluster-name: hazelcast-clusterinstance-name: hzInstance_141network:port:auto-increment: trueport-count: 100port: 5701outbound-ports:- 0join:auto-detection:enabled: falsemulticast:enabled: falsemulticast-group: 224.2.2.3multicast-port: 54327tcp-ip:enabled: truemember-list:- 192.168.119.141
说明: cluster-name 集群名称,通过名称隔离同网络下的集群
instance-name 服务器节点名称
network.port.auto-increment 成员节点使用的端口是否允许自动增长
network.port.port-count 使用端口增长的范围,例如这里:5701-5801
network.port.port 默认使用的端口,如果 auto-increment 为false,则必须使用 5701
network.outbound-ports 套接字绑定期间使用的临时端口,可以是值和范围,0为没限制
network.tcp-ip.enabled 采用 tcp/ip 的方式,前面两个发现方式必须设置为 false
network.tcp-ip.member-list 集群中能被发现的成员,可以只配置一个,端口可不设置
- 通过 docker run 命令,启动容器名称为 hazecast-node1 的节点1
docker run -d -p 5701:5701
-e JAVA_OPTS="-Dhazelcast.config=/opt/hazelcast/config_ext/hazelcast.yaml"
-e HZ_NETWORK_PUBLICADDRESS=192.168.119.141:5701
-v /home/hazelcast/config:/opt/hazelcast/config_ext
--name hazecast-node1 hazelcast/hazelcast:4.2.6
说明:-e 为添加执行的环境变量
-e JAVA_OPTS="-Dhazelcast.config=/opt/hazelcast/config_ext/hazelcast.yaml" 添加 hazecast 的寻找配置路径
-e HZ_NETWORK_PUBLICADDRESS 添加集群中成员的公共地址,方便私有云映射
-v /home/hazelcast/config:/opt/hazelcast/config_ext 挂载本地 hazelcast.yaml 所在配置 目录到容器中
--name 容器名称,节点名称
另外:192.168.119.141 为虚拟机地址,这里看情况配置对外公共地址
- 接下来,继续通过 docker run 命令,启动容器名称为 hazecast-node2 的节点2
docker run -d -p 5702:5701
-e JAVA_OPTS="Dhazelcast.config=/opt/hazelcast/config_ext/hazelcast.yaml"
-e HZ_NETWORK_PUBLICADDRESS=192.168.119.141:5702
-v /home/hazelcast/config:/opt/hazelcast/config_ext
--name hazecast-node2 hazelcast/hazelcast:4.2.6
说明:参数说明参考上面的
hazecast-node2 和 hazecast-node1 对比,对外端口不同
- 服务器端这样差不多就启动了,通过搭建管理中心Hazelcast系列(三):hazelcast管理中心,我们可连接到对应集群查看,当然查看本地日志和获取本地集群数也可以确认
客户端
客户端配置和前面配置 Hazelcast系列(二):hazelcast集成(嵌入式)大同小异,咱们直接开干。
- 创建一个SpringBoot项目,先添加依赖,这里额外添加 spring-boot-starter-web 依赖方便测试
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.hazelcast</groupId><artifactId>hazelcast</artifactId></dependency>
- 项目 resources 下添加 hazelcast-client.yaml 配置文件,内容如下:
hazelcast-client:cluster-name: hazelcast-clusterinstance-name: hzInstance_clientnetwork:cluster-members:- 192.168.119.141
说明:cluster-name 要连接的集群名称
instance-name 客户端节点名称
network.cluster-members 连接的集群成员,这里可配置一个,但是尽量全部配置
- 对应的 application.yml,内容如下
server:port: 8082
- 添加额外的测试代码
@RestController
@RequestMapping("/data")
public class DataController {@Autowiredprivate HazelcastInstance hazelcastInstance;private ConcurrentMap<String,Long> retrieveMap() {return hazelcastInstance.getMap("map");}@PostMapping("/put")public String put(@RequestParam(value = "key") String key, @RequestParam(value = "value") Long value) {retrieveMap().put(key, value);return "成功";}@GetMapping("/get")public Long get(@RequestParam(value = "key") String key) {Long value = retrieveMap().get(key);return value;}
}
- 接下来,直接启动SpringBoot项目,然后去管理平台查看对应的客户端连接情况(本地查看日志亦可)
测试
前面在客户端已经连接上了服务器,并且客户端已经有了测试代码,下面,开测。
- Postman 发送测试数据 key = test,value = 11111
- Postman 获取数据 key = test
其他
- 服务器端 Docker 启动的时候,-e 添加的 hazelcast 环境变量也可配置在 Hazelcast 中,同理,hazelcast.yaml 的参数也可配置在 -e 环境变量上
- 每个版本的 hazelcast.jar 中,都有完整的或者默认的服务器和客户端参数配置
参考
- Java Client
相关文章:

Hazelcast系列(三):hazelcast集成(服务器/客户端)
系列文章 Hazelcast系列(一):初识hazelcast Hazelcast系列(二):hazelcast集成(嵌入式) Hazelcast系列(三):hazelcast集成(服务器/客户端) Hazelcast系列(四):hazelcast管理中心 …...

vscode 配置默认shell
vscode 配置默认shell 最简单方式 "terminal.integrated.defaultProfile.osx": "zsh", 也可以自定义,参考 https://code.visualstudio.com/docs/terminal/profiles terminal 修改默认shell change your default shell to zsh chsh -s /bin/…...

品牌低价的形式有哪些
线上产品五花八门,价格也有高低,但有时同一款商品,看似页面价一样,计算完促销信息后的到手价都会有所不同,有些店铺甚至会使用隐藏优惠券,如咨询客服领券、新人券等,而这些丰富的优惠方式&#…...

SPA项目之主页面--数据表格的增删改查
SPA项目之主页面--数据表格的增删改查 一.增删改查1.样式准备2.增加3.删除4.修改5.查询二.表单验证1.在表单中使用验证规则 一.增删改查 1.样式准备 <template><div class"books" style"padding: 20px;"><el-form :inline"true"…...

Adobe Premiere Pro:掌控视频剪辑的魔法之手,让你的创作腾飞!
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是尘缘,一个在CSDN分享笔记的博主。📚📚 👉点击这里,就可以查看我的主页啦!👇&#x…...

ES知识点全面整理
● 我们从很多年前就知道 ES6, 也就是官方发布的 ES2015 ● 从 2015 年开始, 官方觉得大家命名太乱了, 所以决定以年份命名 ● 但是大家还是习惯了叫做 ES6, 不过这不重要 ● 重要的是, ES6 关注的人非常多, 大家也会主动去关注 ● 但是从 2016 年以后, 每年官方都会出现新…...

【电商API封装接口】电商百万商品资源一键导入,助力企业流量变现
电商API接口是淘宝开放平台提供的一组数据接口,供开发者使用来获取淘宝平台上商品、店铺、订单等相关信息。根据功能和分类,淘宝API主要包括以下几个方面: 1. 商品API:提供了搜索、详情、评价等与商品相关的接口,可以…...

bootz启动 Linux内核过程中涉及的全局变量images
一. bootz启动Linux uboot 启动Linux内核使用bootz命令。当然还有其它的启动命令,例如,bootm命令等等。 本文只分析 bootz命令启动 Linux内核的过程。 本文具体分析 bootz启动 Linux内核过程涉及的一个重要的全局变量 images。 二. bootz 启动 Linux…...

Vuex的使用,详细易懂
目录 一.前言 二.Vuex的简介 三.vuex的使用 3.1 安装Vuex 3.2 使用Vuex的步骤: 四.vuex的存值取值(改变值) 五.vuex的异步请求 好啦,今天的分享就到这啦!!! 一.前言 今天我们继续前面的E…...

基于多线程的Reactor模式的 回声服务器 EchoServer
记录下 一个线程专门用来接受accept获取客户端的fd 获取fd之后 从剩余的执行线程中 找到一个连接客户端数量最少的线程 然后将客户端的fd加入到这个线程中并通过EPOLL监听这个fd 线程之间通过eventfd来通信 将客户端的fd传到 对应的线程中 参考了MediaServer 引入…...

《TWS蓝牙耳机通信原理与接口技术》
+他V hezkz17进数字音频系统研究开发交流答疑群(课题组) 耳机BT与手机BT通信 主耳与从耳通信 耳机BLE盒手机BLE通信 充电盒与耳机通信 上位机与耳机通信 上位机与充电盒通信 1 耳机BT与手机BT通信 传输音频数据传递控制信息 (3) 耳机BLE与手机BLE通信 安卓/苹果app-耳机…...

敏捷开发使用
1.敏捷开发 敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就…...

cdsn目录处理:```,```# 目录校正
原标题 <small> cdsn目录处理: ,中间添加 # 空格 空行后 遇到的底部空行出错,书接上回,处理空行【python查找替换:查找空行,空行前后添加,中间添加 # 空格 空行后遇到的第1行文字&am…...

前端TypeScript学习day03-TS高级类型
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 TypeScript 高级类型 class 类 class继承 extends implements 类成员可见性 public protected …...

LeetCode-101-对称二叉树
题目描述: 给你一个二叉树的根节点 root , 检查它是否轴对称。 题目链接:LeetCode-101-对称二叉树 解题思路:判断2个二叉树是否可以相互翻转,考察同时处理2个二叉树的遍历情况。 代码实现: class Solution …...

9-AJAX-上-原理详解
一、定义 1、什么是Ajax Ajax:即异步 JavaScript 和XML。Ajax是一种用于创建快速动态网页的技术。通过在后台与进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。而传统的…...

Python3操作Redis最新版|CRUD基本操作(保姆级)
Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 Win11查看安装的Python路…...

微信又被吐槽了,委屈啊
昨天的时候,一打开微博热搜榜,一看,微信又被吐槽了,微信占用存储这件事几乎年年会被骂,几乎也会年年被吐槽。 这次的起因呢,是一个人整理了一个方法:「微信内存从 126G 清理到 75G 我是怎么做到…...

刷题笔记27——并查集
很长一段时间,我的生活看似马上就要开始了。但是总有一些障碍阻挡着,有些事得先解决,有些工作还有待完成,时间貌似不够用,还有一笔债务8要去付清,然后生活就会开始。最后我终于明白,这些障碍&am…...

Python 模拟类属性
文章目录 模拟类属性的原因模拟类属性的可能解决方案使用 PropertyMock 模拟类属性在不使用 PropertyMock 的情况下模拟类属性Python 模拟类构造函数使用 patch.object 装饰器来修补构造函数本文的主要目的是介绍如何使用 python 单元测试模块 unittest 操作类属性以进行测试和…...

面试算法24:反转链表
题目 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。例如,把图4.8(a)中的链表反转之后得到的链表如图4.8(b)所示。 分析 由于节点j的next指针指向了它的前一个节…...

【论文阅读】面向抽取和理解基于Transformer的自动作文评分模型的隐式评价标准(实验结果部分)
方法 结果 在这一部分,我们展示对于每个模型比较的聚合的统计分析当涉及到计算特征和独立的特征组(表格1),抽取功能组和对齐重要功能组(表格2),并且最后,我们提供从模型比较&#x…...

VueRouter与expres/koa中间件的关联
ueRouter: runQueue 路由守卫都是有三个参数to,from,next。其中next就是下方的fn执行时候传入的第二个参数(回调函数),只有该回调执行后才会挨个遍历queue内的守卫。 中间件的作用 隔离基础设施与业务逻辑之间的细节。详细的内容位于《深入浅出Node.js》P210 另外一…...

二十、SpringCloud Alibaba Seata处理分布式事务
目录 一、分布式事务问题1、分布式之前2、分布式之后 二、Seata简介1、Seata是什么?2、Seata能干嘛?3、去拿下?4、怎么玩 三、Seata-server安装四、订单、库存、账户业务数据库准备五、订单、库存、账户业务微服务准备六、Seata原理介绍 一、…...

标准误与聚类稳健标准误的理解
1 标准误 1.1 定义 标准误(Standard Error)是用来衡量统计样本估计量(如均值、回归系数等)与总体参数之间的差异的一种统计量。标准误衡量了样本估计量的变异程度,提供了对总体参数的估计的不确定性的度量。标准误越…...

【Github】将本地仓库同步到github上
许久没有用GitHub了,怎么传仓库都忘记了。在这里记录一下 If you have a local folder on your machine and you want to transform it into a GitHub repository, follow the steps below: 1. Install Git (if not already installed) Make sure you have Git in…...

c++视觉--通道分离,合并处理,在分离的通道中的ROI感兴趣区域里添加logo图片
c视觉–通道分离,合并处理 通道分离: split()函数 #include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg");// 检查图像是否成功加载if (image.empty()) {std::cerr << "Error: Could not read the…...

python爬虫:多线程收集/验证IP从而搭建有效IP代理池
目录 一、前言 二、IP池的实现 1. 收集代理IP 2. 验证代理IP可用性 3. 搭建IP代理池 三、多线程实现 四、代理IP的使用 五、总结 一、前言 在网络爬虫中,IP代理池的作用非常重要。网络爬虫需要大量的IP地址来发送请求,同时为了降低被封禁的风险…...

阻塞队列以及阻塞队列的一个使用
阻塞队列以及阻塞队列的一个使用 阻塞队列简介 阻塞队列(Blocking Queue)是一种常见的队列数据结构,它具有特殊的行为,可以用于多线程编程中,以协调不同线程之间的任务执行和数据传递。阻塞队列在多线程环境中非常有…...

kafka的请求处理机制
目录 前言: kafak是如何处理请求的? 控制请求与数据类请求 参考资料 前言: 无论是 Kafka 客户端还是 Broker 端,它们之间的交互都是通过“请求 / 响应”的方式完成的。比如,客户端会通过网络发送消息生产请求给 B…...