文档章节

【12】JMicro微服务-Zookeeper

o
 osc_w9s1w4o0
发布于 2019/04/01 09:13
字数 1308
阅读 11
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

如非授权,禁止用于商业用途,转载请注明出处
作者: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行)

 1     private RouteRule updateOne(String c) {
 2         String p = RULE_DIR+"/"+c;
 3         String data = this.dataOperator.getData(p);
 4         RouteRule rule = JsonUtils.getIns().fromJson(data, RouteRule.class);
 5         rule.setId(c);
 6         rule.check();
 7         watchRule(p);
 8         return rule;
 9     }
10 
11     private void watchRule(String p) {
12         this.dataOperator.addDataListener(p, dataListener);
13     }

同一个监听器如果增加了多次,效果相同。但是ZK原生实现会增加多个监听,并且收到多个通知,而JMIcro实现则不会。

 

以下代码做熔断服务操作(第11行),第9行设置熔断标记

 1 public void breakService(ServiceMethod sm) {
 2         String path = ServiceItem.pathForKey(sm.getKey().getUsk().toKey(true, true, true));
 3         ServiceItem item = this.path2SrvItems.get(path);
 4         if(item == null) {
 5             logger.error("Service [{}] not found",path);
 6             return;
 7         }
 8         ServiceMethod sm1 = item.getMethod(sm.getKey().getMethod(), sm.getKey().getParamsStr());
 9         sm1.setBreaking(sm.isBreaking());
10         if(dataOperator.exist(path)){
11             dataOperator.setData(path,JsonUtils.getIns().toJson(item));
12         } 
13     }

 

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个方式进行配置。 

 

【1】JMicro微服务-RPC体验

【2】JMicro微服务-Hello World

【3】JMicro微服务-服务超时,重试,重试间隔

【4】JMicro微服务-服务限流

【5】JMicro微服务-熔断降级

【6】JMicro微服务-服务日志监控

【7】JMicro微服务-服务路由,负载均衡

【8】JMicro微服务-JMicro ZKUI

【9】JMicro微服务-发布订阅消息服

【10】JMicro微服务-API网关

【11】JMicro微服务-配置管理

【11】JMicro微服务-配置管理

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Apache Curator

zookeeper 的客户端调用过于复杂,Apache Curator 就是为了简化zookeeper客户端调用而生,利用它,可以更好的使用zookeeper。

李旸
2012/11/27
9.8K
0
高性能跨语言 RPC--Hprose

Hprose 是高性能远程对象服务引擎(High Performance Remote Object Service Engine)的缩写 —— 微服务首选引擎。 它是一个先进的轻量级的跨语言跨平台面向对象的高性能远程动态通讯中间件...

andot
2012/12/27
6.1W
28
疯狂Spring Cloud连载(29)微服务跟踪概述

本文节选自《疯狂Spring Cloud微服务架构实战》 京东购买地址:https://item.jd.com/12256011.html 当当网购买地址:http://product.dangdang.com/25201393.html Spring Cloud教学视频:htt...

杨大仙的程序空间
2018/01/09
539
0
J360-cloud SpringCloud系列一:分布式配置服务器ConfigServer

j360开源博客之 ---------------------------------------------------------- J360-Cloud系列 spring-cloud快速入门工程之j360-cloud-all:(欢迎star、fork) https://github.com/xuminwl......

Hi徐敏
2015/10/08
4K
14
Spark Streaming使用Kafka保证数据零丢失

源文件放在github,随着理解的深入,不断更新,如有谬误之处,欢迎指正。原文链接https://github.com/jacksu/utils4s/blob/master/spark-knowledge/md/spark_streaming使用kafka保证数据零丢...

jacksu
2016/01/16
945
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在IntelliJ中永久启用行号? - How can I permanently enable line numbers in IntelliJ?

问题: 如何在IntelliJ IDEA中永久启用行号? 解决方案: 参考一: https://stackoom.com/question/3Zn/如何在IntelliJ中永久启用行号 参考二: https://oldbug.net/q/3Zn/How-can-I-permane...

法国红酒甜
18分钟前
3
0
Docker镜像加速

vim /etc/docker/daemon.json # 将"registry-mirrors": ["https://......com"] (对应自己的加速地址)复制到文件中 # 重新加载文件和重启dockersudo systemctl daemon-reloadsudo syst......

codeccb
29分钟前
12
0
Android Studio使用lombok

参考:https://github.com/mplushnikov/lombok-intellij-plugin 使用@Setter/@Getter时,刚开始在Structure的函数列表里没有生成响应的函数,且调用set/get的地方也报红,但编译OK。 按网上的...

大熊猫
30分钟前
7
0
Stream数据流

Stream类基础操作 从JDK1.8开始提供了java.yitl.stream数据流的开发板,而Stream就是这个包中提供的一个接口,这个接口主要是通过函数式编程结构实现集合数据的分析,所以在Collection接口张...

哼着我的小调调
35分钟前
13
0
在视图控制器之间传递数据 - Passing Data between View Controllers

问题: I'm new to iOS and Objective-C and the whole MVC paradigm and I'm stuck with the following: 我是iOS和Objective-C以及整个MVC范例的新手,但我坚持以下几点: I have a view th......

fyin1314
48分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部