【12】JMicro微服务-Zookeeper
如非授权,禁止用于商业用途,转载请注明出处
作者:mynewworldyyl
往下看前,建议完成前面1到11小节
1. CuratorFramework支持
JMicro目前基于Zookeeper实现统一配置和服务注册两个微服务核心功能。
应用中可以直接使用org.apache.curator.framework.CuratorFramework操作ZK,获取CuratorFramework实例方式如下:
@Inject
private CuratorFramework curator;
通过CuratorFramework获取ZK路径为path的值如下:
public String getData(String path){
//init();
GetDataBuilder getDataBuilder = this.curator.getData();
try {
byte[] data = getDataBuilder.forPath(path);
return new String(data,Constants.CHARSET);
} catch (KeeperException.NoNodeException e) {
logger.error(e.getMessage());
}catch(Exception e){
logger.error("",e);
}
return "";
}
2. JMicro对配置管理和服务注册接口的进一步封装
JMicro目前使用ZK做配置管理和服务注册,但并不是唯一选择,将来根据需求很可能选择更合适的实现,如ETCD凭借其强劲的性能,更简单易用的HTTP API接口,应该是一个比ZK更好的选择。
JMicro配置管理和服务注册都基于IDataOperator接口实现,代码如下:
public interface IDataOperator {
void addListener(IConnectionStateChangeListener lis);
void addDataListener(String path,IDataListener lis);
void addChildrenListener(String path,IChildrenListener lis);
void addNodeListener(String path,INodeListener lis);
void removeNodeListener(String path,INodeListener lis);
void removeDataListener(String path,IDataListener lis);
void removeChildrenListener(String path,IChildrenListener lis);
boolean exist(String path);
String getData(String path);
void setData(String path,String data);
Set<String> getChildren(String path);
void createNode(String path,String data,boolean elp);
void deleteNode(String path);
void init();
void objectFactoryStarted(IObjectFactory of);
}
如果对Raft原理及实现有基本了解,相信大家很容易能理解以上除init和objectFactoryStarted之外的其他方法。分别抽像对结点,结点数据,子结点的基本操作。
init方法对实现做初始化,如org.jmicro.zk.ZKDataOperator中的实现如下:
public void init(){
if(isInit){
return;
}
isInit = true;
propes = new Properties();
curator = createCuratorFramework();
}
创建CuratorFramework实例。
而objectFactoryStarted则在IObjectFactory实例启动时,将CuratorFramework实例注册到IObjectFactory中,以方便需要直接操作ZK的模块实现。代码如下:
@Override
public void objectFactoryStarted(IObjectFactory of) {
of.regist(CuratorFramework.class, curator);}
正因为有以上代码,才使得
@Inject
private CuratorFramework curator;
通过@Inject注解注入CuratorFramework实例得以实现。
3. org.jmicro.api.raft.IDataOperator基本使用
过通IDataOperator接口,将来无论底层Raft实现怎么改变,应用都不需要修改。但是如果应用依赖于CuratorFramework操作ZK,并且Raft切换到Etcd,则实现代码需要同步调整,所以在JMicro环境下做应用,如果能用IDataOperator实现的功能,不建议使用CuratorFramework。
完整的实现代码请参数org.jmicro.zk.ZKDataOperator。
IDataOperator实现特性:
a. 监听器只需要设置一次,就可以对结点做永久监听,除非用户主动删除监听器,如果使用CuratorFramework或ZK原生客户端,则需要重复设置监听器;
b. CuratorFramework或ZK原生客户端取数据时,得到的是byte数组,而IDataOperator得到的是UTF8编码的字符串;
c. 数据缓存功能,如判断某个结点是否存在,不会每次都去请求查询ZK,只要本地缓存能查询到即说明结点存在,只有结点不存时,才会去ZK中查询;
d. 创建结点时,首先判断结点是否已经存在,如果已经存在,则直接设置结点数据,但如果结点是瞬时结点,则会抛出异常,而不是设置其为最新数据;
e. 创建结点时,如果叶子结点的父背结点还不存在,则会先创建父背结点,最后才创建叶子结点及其数据。
样例:
如下代码获取一个路由规则(第3行)并监听这个路由规则变化(第7,12行)
private RouteRule updateOne(String c) {
String p = RULE_DIR+"/"+c;
String data = this.dataOperator.getData(p);
RouteRule rule = JsonUtils.getIns().fromJson(data, RouteRule.class);
rule.setId(c);
rule.check();
watchRule(p);
return rule;
}
private void watchRule(String p) {
this.dataOperator.addDataListener(p, dataListener);
}
同一个监听器如果增加了多次,效果相同。但是ZK原生实现会增加多个监听,并且收到多个通知,而JMIcro实现则不会。
以下代码做熔断服务操作(第11行),第9行设置熔断标记
public void breakService(ServiceMethod sm) {
String path = ServiceItem.pathForKey(sm.getKey().getUsk().toKey(true, true, true));
ServiceItem item = this.path2SrvItems.get(path);
if(item == null) {
logger.error("Service [{}] not found",path);
return;
}
ServiceMethod sm1 = item.getMethod(sm.getKey().getMethod(), sm.getKey().getParamsStr());
sm1.setBreaking(sm.isBreaking());
if(dataOperator.exist(path)){
dataOperator.setData(path,JsonUtils.getIns().toJson(item));
}
}
4. JMicro配置ZOOKEEPER连接信息
JMicro默认只支持ZK本地单机模式,主机是127.0.0.1或localhost,端口是2181。
可以通过命令行参数,环境变量,/META-INF/jmicro/*.properties配置,命令行参数方式如下:
java -jar target/jmicro.example.provider-0.0.1-SNAPSHOT-jar-with-dependencies.jar -DregistryUrl=zookeeper://127.0.0.1:2181,zookeeper://127.0.0.1:2182,zookeeper://127.0.0.1:2183
properties配置方式如下:
registryUrl=zookeeper://127.0.0.1:2181,zookeeper://127.0.0.1:2182,zookeeper://127.0.0.1:2183
windows环境变量配置方式如下:

应用可以根据需要通过以上3个方式进行配置。
【12】JMicro微服务-Zookeeper的更多相关文章
- 【13】JMicro微服务-ID生成与Redis
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到12小节 1. 微服务中ID地位 如果说前面小节的功能点是微服务的大脑,那么全局唯一ID则是微服务 ...
- 【11】JMicro微服务-配置管理
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到10小节 JMicro目前仅支持基于Zookeeper做配置管理,全部配置信息可以在ZK做增删改查 ...
- 【10】JMicro微服务-API网关
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到9小节 1. Api网关基本特性: Api网关作为对外网提供服务的基本入口,地位类似于NGINX, ...
- 【8】JMicro微服务-JMicro ZKUI
ZKUI是一个开源项目,是一个查看,修改ZK数据非常方便的工具.JMicro基于ZK做服务治理,配置管理,因此使用ZKUI会提供非常大的方便. Github地址:https://github.com/ ...
- 【2】JMicro微服务-Hello World
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. 首先完成 JMicro微服务-RPC体验 的1到5步. 按默认方式启动ZK及Redis: JDK需要Java8及以上. ...
- 【3】JMicro微服务-服务超时,重试,重试间隔
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 接下来的内容都基于[2]JMicro微服务-Hello World做Demo 微服务中,超时和重试是一个最基本问题下面Dem ...
- Oracle GoldenGate 12.3微服务架构指北
Microservices Architecture introduction Microservices Architecture is a method or approach to develo ...
- JMicro微服务之超时&重试
JMicro是本人开发的基于Java实现的微服务框架,当前正式版本为0.0.3,并已发布到maven中央仓库.项目源码github:https://github.com/mynewworldyyl/j ...
- GoldenGate 12.3微服务架构与传统架构的区别
随着Oracle GoldenGate 12c(12.3.0.1.0)的发布,引入了可用于复制业务数据的新架构. 多年来,这种架构有着不同的称谓,Oracle终于在最后GA发布的版本中,以“Micro ...
随机推荐
- 2018.09.29 bzoj3039: 玉蟾宫(悬线法)
传送门 悬线法的板子题. 悬线法只需要保存当期点向下最多多少个,把这个当成一条线,再处理出线绷直之后最多能向左右延展多少就行了. 代码: #include<bits/stdc++.h> # ...
- 2018.06.29 NOIP模拟 1807(简单递推)
1807 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出一个由数字('0'-'9')构成的字符串.我们说一个子序列是好的,如果他的每一位都是 1.8.0.7 ,并且这四个数字按照 ...
- java,arduino,C#之间的一些编码转换
1.C#-> Encoding.UTF8.GetBytes( "abc中") ->[97,98,99,228,184,173] java->byte[] bs= ...
- 电信网上营业厅-客户充值缴费时间段数据挖掘--spss
最近研究分析了“云南电信网上营业厅”e9宽带续约缴费的数据,目前宽带续约量为171人,今天需要谈论的是:如何利用SPSS挖掘出“客户充值缴费的时间段”客户喜欢在哪个时间段来网厅进行充值缴费 云南电信网 ...
- Global Mapper
https://blog.csdn.net/mrib/article/details/75116373 http://www.bluemarblegeo.com/products/global-map ...
- H3C交换机流量镜像
今天需要对交换机进行本地流量镜像,在此记录: 交换机:H3C S5120 配置本地端口镜像时,用户首先要创建一个本地镜像组,然后为本地镜像组配置源端口和目的端口. 表1-1 配置本地端口镜像 操作 命 ...
- ActiveMQ5.0实战三:使用Spring发送,消费topic和queue消息
实战一 , 实战二 介绍了ActiveMQ的基本概念和配置方式. 本篇将通过一个实例介绍使用spring发送,消费topic, queue类型消息的方法. 不懂topic和queue的google 之 ...
- 8086汇编语言(1)虚拟机安装ms-dos 7.1
8086汇编语言(1)虚拟机安装ms-dos 7.1 文/玄魂 前言 在开始这一系列文章之前,我想先说下,对于古董级的8086汇编到底还以有没有学习的必要.这里我说下我要从8086开始学习,而不是从w ...
- Replication--对发布修改的一些小总结
--==================================================== --在华丽分割线下,是我对肖磊--大菠萝的崇高地敬意和婶婶地感谢,本文乃肖兄表述我执笔而来 ...
- 解决使用ICsharpCode解压缩时候报错Size MisMatch4294967295;的错误
如果是一个文件夹生成的zip文件,解压缩时候不会报错. 如果是一个文件夹里面包含着两个子文件夹,而且每个子文件夹里面都有着文件.生成的zip文件在解压时候就出报这个错误. 具体的解决办法,通过网上搜索 ...