文档章节

EOSPlatform+Dubbo+Zookeeper最佳实践

 如何让他和
发布于 2016/08/13 10:24
字数 1410
阅读 56
收藏 10
点赞 2
评论 1
  • 摘要:随着分布式服务框架的流行,许多公司都引入了业界流行的分布式服务框架,本文介绍如何使用EOSPlatform+Dubbo+Zookeeper实现分布式服务的开发与运行。

    1     环境准备

     

    1.1  环境选择

    EOSPlatform 6.7.1

    Zookeeper 3.4.5

    Dubbo 2.5.3

    Tomcat 5.5.27

     

    1.2  搭建Zookeeper环境

    下载zookeeper-3.4.5.tar.gz解压到自定义目录中,如下图:

     

     

    打开conf目录,将文件zoo_sample.cfg重命名为zoo.cfg。

     

    打开bin目录,用UE打开zkServer.cmd修改如下代码。

     

    setlocal
    call "%~dp0zkEnv.cmd"
    set JAVA_HOME=D:\Primeton\JDK1.6
    set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
    echo on
    %JAVA_HOME%\bin\java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*
    
    endlocal

     

    1.3  搭建服务监控平台环境

    下载dubbo-admin-2.5.3.war,部署到Tomcat5.5.27的应用目录中,路径如下:****\apache-tomcat-5.5.27\webapps\;

     

    1.4  控制台启动运行

    先启动zookeeper,再启动tomcat服务器。

    通过浏览器访问dubbo-admin应用,用户名/密码(root/root)

    如下所示:

     

    内存与注册中心都运行正常说明环境准备完成。

     

    2     EOSPlatform扩展开发

     

    2.1  修复EOS产品中Spring容器的BUG

     

    com.primeton.spring.context.ExtendParentApplicationContext.java中有如下两个方法:
    
       /* (non-Javadoc)
        * @see org.springframework.beans.factory.ListableBeanFactory#getBeansOfType(java.lang.Class)
        */
       public Map getBeansOfType(Class type) throws BeansException
       {
           return new HashMap();//防止空指针异常
       }
    
    
       /* (non-Javadoc)
        * @see org.springframework.beans.factory.ListableBeanFactory#getBeansOfType(java.lang.Class, boolean, boolean)
        */
       public Map getBeansOfType(Class type, boolean includePrototypes,
              boolean allowEagerInit) throws BeansException
       {
             return new HashMap();//防止空指针异常
       }

     

    红色部分为修改内容,原先返回null值,会导致空指针异常。

     

    2.2  增加启动时开启Spring容器

    增加一个启动监听类:SpringContextStartupListener,内容如下:

     

    /**
    *
    * 由于分布式服务框架需要初始化Spring容器用于发布订阅服务,因此加入启动过程
    *
    * @author yujl ( yujl+@primeton.com+)
    */
    public class SpringContextStartupListener implements IRuntimeListener {
    
       /* (非 Javadoc)
        * @see com.eos.runtime.core.IRuntimeListener#start(com.eos.runtime.core.RuntimeEvent)
        */
       public void start(RuntimeEvent arg0)
       {
            ApplicationContextFactory._getContext_();//预先初始化Spring容器
       }
    
    
       /* (非 Javadoc)
        * @see com.eos.runtime.core.IRuntimeListener#stop(com.eos.runtime.core.RuntimeEvent)
        */
       public void stop(RuntimeEvent arg0)
       {
       }
    
    
    }

     

    将SpringContextStartupListener添加到handler-startup.xml文件的结尾部分,如下图所示:

     

       <!- 初始化Spring 容器->

       <handler handle-class="com.primeton.spring.context.runtime.SpringContextStartupListener" />

     

    2.3  补充Zookeeper和Dubbo相关jar文件

    netty-3.2.5.Final.jar

    dubbo-2.5.3.jar

    slf4j-api-1.6.1.jar

    slf4j-log4j12-1.6.1.jar

    zkclient-0.1.jar

    zookeeper-3.4.5.jar

    将上述jar包放入EOS应用的\WEB-INF\lib目录下。

     

    PS:后面提到的服务提供者应用和服务消费者应用都需要添加Jar包和配置启动文件。

     

    此时EOSPlatform扩展开发完毕。

     

    3     服务提供者示例开发

    新建一个EOS项目(项目名称为ProjectProvicer)对应应用为(default_provider);新建一个构件包(名称为:com.primeton.dubbo.provider):

     

    在构件包中新建一个接口示例和一个实现的示例如下:

     

    package com.primeton.dubbo.provider;

    4     服务消费者示例开发

    新建一个EOS项目(项目名称为ProjectConsumer)对应的应用名称为(default_consumer);新建一个构件包(名称为com.primeton.dubbo.consumer),如下图所示:

     

    首先需要引入服务提供方接口DemoService;

     

    然后增加一个SpringBean用于封装DemoService接口,代码如下:

     

    public class TestDubboAction {
    private DemoService demoServiceDL;
    
    public String sayHello(String input){
    if(demoServiceDL != null){
    return demoServiceDL.testHelloWorld(input);
    }
    return "";
    }
    
    public DemoService getDemoServiceDL() {
    return demoServiceDL;
    }
    
    public void setDemoServiceDL(DemoService demoServiceDL) {
    this.demoServiceDL = demoServiceDL;
    }
    
    }

     

    此类不做任何工作,只是调用DemoService接口。

     

    Spring配置文件修改如下:

     

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:sca="http://www.springframework.org/schema/sca" xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
           xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/sca http://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd
    http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="consumer-of-helloworld-app" />
    <!-- 使用multicast广播注册中心暴露发现服务地址  先屏蔽注册中心,通过直连实现
    <dubbo:registry address="multicast://224.5.6.7:1234" />-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="demoService" interface="com.primeton.dubbo.provider.DemoService"/>
    
    <bean id="testDubboAction" class="com.primeton.dubbo.consumer.TestDubboAction"> <!-- 和本地服务一样使用远程服务 -->
    <property name="demoServiceDL" ref="demoService" />
    </bean>
    </beans>

     

    通过Spring配置,将远程服务demoService注入到TestDubboAction中。

     

    然后需要开发两个页面和一个页面流用于调用上述TestDubboAction,具体相关代码参考EOS帮助文档中Spring的配置与开发。

     

    至此,服务消费者也开发完成;通过导出构件包并部署到Tomcat的default_consumer应用当中。

     

    运行服务消费者对应的Tomcat服务器,访问如下页面:

     

    点击 show Greeting按钮,后台通过页面流首先进入TestDubboAction中,如下图所示:

     

     

    此时我们可以看到代码堆栈为:

     

    Dubbo框架通过Spring配置封装了一个DemoService实例,其实这是一个远程调用的代理客户端。

     

    然后通过Dubbo的协议调用了远端服务,服务方的调用栈为:

     

  •  

     

     

    服务方也屏蔽了协议的实现,通过代理间接调用了DemoServiceImple实例的testHelloWorld方法。

     

    如此,Dubbo与EOSPlatform无缝结合完成。

     

    查看控制台可以看到服务消费者信息如下:

     

  • 核心技术:Maven,Springmvc mybatis shiro, Druid, Restful, Dubbo, ZooKeeper,Redis,FastDFS,ActiveMQ,Nginx 
    1.     项目核心代码结构截图

    分布式框架介绍 - kafkaee - kafkaee的博客

       项目模块依赖分布式框架介绍 - kafkaee - kafkaee的博客

    特别提醒:开发人员在开发的时候可以将自己的业务REST服务化或者Dubbo服务化

    2.    项目依赖介绍

       2.1 后台管理系统、Rest服务系统、Scheculer定时调度系统依赖如下图:
     

    分布式框架介绍 - kafkaee - kafkaee的博客

           2.2 Dubbo独立服务项目依赖如下图:

     分布式框架介绍 - kafkaee - kafkaee的博客

    3.  项目功能部分截图:

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客
     

    zookeeper、dubbo服务启动 

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客
     

    dubbo管控台 

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     REST服务平台

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

     

    分布式框架介绍 - kafkaee - kafkaee的博客

© 著作权归作者所有

共有 人打赏支持
粉丝 37
博文 72
码字总数 147957
作品 0
深圳
加载中

评论(1)

如何让他和
随着分布式服务框架的流行,许多公司都引入了业界流行的分布式服务框架,本文介绍如何使用EOSPlatform+Dubbo+Zookeeper实现分布式服务的开发与运行。
最佳实践系列:常规项目管理(跨部门项目)的12个最佳实践

常规的项目管理 需求分析 明确原始需求【必须要接触最原始的用户需求】 忽略需求方提出的所谓解决方案——最佳实践1 竞品分析 撰写UseStory 拉FeatureList 分期实现小步快跑 轮询各个系统负责...

陶邦仁 ⋅ 2015/10/03 ⋅ 0

[教程] Android PHP 最佳实践视频教程

这几个月实在太忙了,一直没有时间关顾博客,不过好在日前花费了不少心血的视频教程《Android+PHP最佳实践》已经在华章教育和China-Pub上线了,在这里给大家简短的推荐一下吧:本系列视频教程...

长平狐 ⋅ 2012/11/19 ⋅ 0

[教程] 推荐 Android + PHP 最佳实践视频教程

这几个月实在太忙了,一直没有时间关顾博客,不过好在日前花费了不少心血的视频教程《Android+PHP最佳实践》已经在华章教育和China-Pub上线了,在这里给大家简短的推荐一下吧:本系列视频教程...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

2014Oracle技术嘉年华

作为国内最顶尖的Oracle数据库技术盛会,我们今年荣幸的邀请到Oracle公司副总裁Thomas Kyte,Pythian集团 CTO Alex Gorbachev等Oracle数据库领域国际级专家,特别为中国的数据库爱好者带来他...

harries ⋅ 2014/10/22 ⋅ 0

十个JDBC的最佳实践

JDBC是Java为多种关系型数据库提供的统一的访问接口,以下是我长期使用JDBC总结的十个最佳实践。 JDBC最佳实践1:使用PrearedStatement 任何一个使用过JDBC的Java程序员几乎都知道这个,Pre...

王振威 ⋅ 2012/09/08 ⋅ 12

PostgreSQL 恢复大法 - 恢复部分数据库、跳过坏块、修复无法启动的数据库

标签 PostgreSQL , 恢复部分数据库 , 跳过坏块 , 修复无法启动的数据库 , 时间点恢复 , 逻辑备份 , 连续备份 背景 一个较大的数据库,如何只恢复一部分数据(例如只恢复某个DB)。 如果访问有...

德哥 ⋅ 04/18 ⋅ 0

云上企业数据库最佳实践

云上企业数据库最佳实践 一个故事@MySQL DBA2017-12-303 阅读 数据库 这是一个PPT,是我在12月20日北京云栖大会上做的分享,介绍了云上企业数据库常见的挑战和对应的策略和产品。云上企业数据...

一个故事@MySQL DBA ⋅ 2017/12/30 ⋅ 0

JDBC十佳实践

Java程序员的JDBC十佳实践 Java JDBC 最佳实践 JDBC Best Practices are some coding practices which Java programmer should follow while writing JDBC code. As discussed in how to co......

YuanyuanL ⋅ 2014/09/18 ⋅ 0

运行无间:阿里巴巴运维保障体系的一种最佳实践

运行无间:阿里巴巴运维保障体系的一种最佳实践 运维派2018-01-021 阅读 阿里巴巴 本文根据 GOPS2017·上海站演讲《阿里巴巴运维保障体系的一种最佳实践》整理发布 前言 阿里巴巴全球运行指 ...

运维派 ⋅ 01/02 ⋅ 0

OpenStack荣获核心基础设施计划颁发的最佳实践徽章,

2016年7月26日- 北京- OpenStack?日前宣布其开源云软件项目荣获Linux基金会核心基础设施计划(简称CII)颁发的最佳实践徽章。CII由Linux基金会发起,计划将数百万美元的资金用于资助全球信息...

玄学酱 ⋅ 05/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MySQL主从复制原理、半同步操作步骤及原理

1.1 企业Linux运维场景数据同步方案 1.1.1 文件级别的异机同步方案 1、scp/sftp/nc 命令可以实现远程数据同步。 2、搭建ftp/http/svn/nfs 服务器,然后在客户端上也可以把数据同步到服务器。...

xiaomin0322 ⋅ 8分钟前 ⋅ 0

Oracle10g 数据及文件迁移过程[原]

QL*Plus: Release 10.2.0.1.0 - Production on 星期三 5月 11 10:22:35 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. 连接到: Oracle Database 10g Enterprise Edition Re......

harrypotter ⋅ 14分钟前 ⋅ 0

nginx安装

1:安装工具包 wget、vim和gcc yum install -y wget yum install -y vim-enhanced yum install -y make cmake gcc gcc-c++ 2:下载nginx安装包 wget http://nginx.org/download/nginx-1......

壹丶贰 ⋅ 17分钟前 ⋅ 0

ideaVim安装及配置

1.安装插件 File-Settings-Plugins,Browse Repositories,输入ideavim,安装。 重启后,在Tools-Vim Emulator启用。 2.快捷键设置 ideaViim键与idea快捷键有冲突,可以在Settings-Other Se...

Funcy1122 ⋅ 21分钟前 ⋅ 0

MySQL中B+Tree索引原理

B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B...

浮躁的码农 ⋅ 35分钟前 ⋅ 0

两道面试题,带你解析Java类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{ static { System.out.println("爷爷在静态代码块"); }} cl...

1527 ⋅ 39分钟前 ⋅ 0

SpringCloud(Data Flow)

dataflow-server

赵-猛 ⋅ 50分钟前 ⋅ 0

深入理解Java虚拟机

这本书我读到第8章,之后就是在读不下去了。 读到后面是一种痛苦的体验,太多的东西是不全面的,大量的专有名词是没有解释的,读到最后很多东西仅仅是一个侧面,所以我觉得,这本书不适合初学...

颖伙虫 ⋅ 55分钟前 ⋅ 0

NanoPi NEO core/ Ubuntu16.04单网卡配置3个IP地址(2个静态,1个动态)

配置 root@NanoPi-NEO-Core:/etc/network# cat interfacesauto loiface lo inet loopbackallow-hotplug eth0iface eth0 inet static address 172.31.188.249 netmask 255.......

SamXIAO ⋅ 今天 ⋅ 0

三步为你的App集成LivePhoto功能

摘要:LivePhoto是iOS9新推出的一种拍照方式,类似于拍摄Gif图或录制视频片段生成图片。如果没有画面感,可以联想《哈利波特》霍格沃茨城堡的壁画,哈哈,很炫酷有木有,但坑爹的是只有iphone6S以...

壹峰 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部