如非授权,禁止用于商业用途,转载请注明出处
作者: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个方式进行配置。

【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微服务-配置管理

【12】JMicro微服务-Zookeeper的更多相关文章

  1. 【13】JMicro微服务-ID生成与Redis

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到12小节 1. 微服务中ID地位 如果说前面小节的功能点是微服务的大脑,那么全局唯一ID则是微服务 ...

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

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到10小节 JMicro目前仅支持基于Zookeeper做配置管理,全部配置信息可以在ZK做增删改查 ...

  3. 【10】JMicro微服务-API网关

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到9小节 1. Api网关基本特性: Api网关作为对外网提供服务的基本入口,地位类似于NGINX, ...

  4. 【8】JMicro微服务-JMicro ZKUI

    ZKUI是一个开源项目,是一个查看,修改ZK数据非常方便的工具.JMicro基于ZK做服务治理,配置管理,因此使用ZKUI会提供非常大的方便. Github地址:https://github.com/ ...

  5. 【2】JMicro微服务-Hello World

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. 首先完成 JMicro微服务-RPC体验 的1到5步. 按默认方式启动ZK及Redis: JDK需要Java8及以上. ...

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

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 接下来的内容都基于[2]JMicro微服务-Hello World做Demo 微服务中,超时和重试是一个最基本问题下面Dem ...

  7. Oracle GoldenGate 12.3微服务架构指北

    Microservices Architecture introduction Microservices Architecture is a method or approach to develo ...

  8. JMicro微服务之超时&重试

    JMicro是本人开发的基于Java实现的微服务框架,当前正式版本为0.0.3,并已发布到maven中央仓库.项目源码github:https://github.com/mynewworldyyl/j ...

  9. GoldenGate 12.3微服务架构与传统架构的区别

    随着Oracle GoldenGate 12c(12.3.0.1.0)的发布,引入了可用于复制业务数据的新架构. 多年来,这种架构有着不同的称谓,Oracle终于在最后GA发布的版本中,以“Micro ...

随机推荐

  1. devexpress v14.2.3 发布

    补丁而已. New Major Features in 14.2 What's New in VCL Products 14.2 Breaking Changes To learn about bre ...

  2. 2018.10.02 NOIP模拟 矩阵分组(二分答案)

    传送门 考场上并不会写二分的check函数,下来看了看题解发现真是妙极. 不难想到每次直接从四个角各按阶梯状拓展出合法区域A,再检验B是否合法就行了.(然而考场上写的弃疗了) 于是题解用了一些小技巧优 ...

  3. gj4 深入类和对象

    4.1 鸭子类型和多态 当看到一只鸟走起来像鸭子.游永起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子 只要利用Python的魔法函数,就能实现某些Python数据类型的类似的方法. class ...

  4. python pip国内源

    pip国内的这个源最快   清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 修改源方法: 临时使用: 可以在使用pip的时候在后面加上-i参数,指定pip ...

  5. HDU 3361 ASCII (水题,不说什么了)

    题意:给你n个十进制数,让你输出相应的ASCII. 析:无,没说的,直接输出就好了. 代码如下: #include <iostream> #include <cstdio> # ...

  6. 17)maven-surefire-plugin

    http://maven.apache.org/surefire/maven-surefire-plugin/ Goals Overview The Surefire Plugin has only ...

  7. 信息管理代码分析<一>登录密码

    题解:这段代码的要求如下,输入一段字符密码(长度<=8)以二进制的形式存放在磁盘中,在输入时需要验证两次输入是否正确.第二个,登录.从磁盘中读取这个文件,然后再输入密码,看两者是否相同. 登录密 ...

  8. Java(Android)线程池[转]

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  9. Codeforces777B Game of Credit Cards 2017-05-04 17:19 29人阅读 评论(0) 收藏

    B. Game of Credit Cards time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  10. PriorityQueue源码分析

          PriorityQueue其实是一个优先队列,和先进先出(FIFO)的队列的区别在于,优先队列每次出队的元素都是优先级最高的元素.那么怎么确定哪一个元素的优先级最高呢,jdk中使用堆这么一 ...