如非授权,禁止用于商业用途,转载请注明出处
作者: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. 2018.10.20 NOIP模拟 面包(数学期望)

    传送门 把方差的式子拆开. 方差=平方的期望-期望的平方. 显然只用维护点对的个数和总方案数就行了. 利用分步的思想来统计. 要统计覆盖一个矩形(x1,y1,x2,y2)(x1,y1,x2,y2)(x ...

  2. 2018.09.28 牛客网contest/197/C期望操作数(状态转移+前缀和递推)

    传送门 比赛手动打了四项感觉有规律,调了40min+之后重新手算了后面几项发现只有前四项满足规律233. 首先这道题只跟q−xq-xq−x有关. 我们尝试找找递推关系. 我们令f[i]f[i]f[i] ...

  3. Django-组件

    https://www.cnblogs.com/yuanchenqi/articles/8034442.html

  4. Excel获得焦点变色

    1.  点击 Sheet 2. 右键菜单  查看代码 3. 复制如下代码 Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Ran ...

  5. IntelliJ IDEA 2017版 spring-boot与Mybatis简单整合

    一.编译器建立项目 参考:http://www.cnblogs.com/liuyangfirst/p/8372291.html 二.代码编辑 1.建立数据库 /* Navicat MySQL Data ...

  6. Java源码更改的方式

    1.找到要改的类所在包名地址. 比如标签名的更改: <s:debug></s:debug> (1)ctril+鼠标左键========双击标签,就会弹出标签所在的类的文本 (2 ...

  7. HDU 2844 Coins (多重背包问题DP)

    题意:给定n种硬币,每种价值是a,数量是c,让你求不大于给定V的不同的价值数,就是说让你用这些硬币来组成多少种不同的价格,并且价格不大于V. 析:一看就应该知道是一个动态规划的背包问题,只不过是变形, ...

  8. 机器学习 数据预处理之独热编码(One-Hot Encoding)

    问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male", "female"] ["from ...

  9. C++ 11可变参数接口设计在模板编程中应用的一点点总结

    概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量 ...

  10. Necklace

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...