EOSPlatform+Dubbo+Zookeeper最佳实践

Stella981
• 阅读 546
  • 摘要:随着分布式服务框架的流行,许多公司都引入了业界流行的分布式服务框架,本文介绍如何使用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解压到自定义目录中,如下图:

    EOSPlatform+Dubbo+Zookeeper最佳实践

    打开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)

    如下所示:

    EOSPlatform+Dubbo+Zookeeper最佳实践

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

    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 容器->

       

    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):

    EOSPlatform+Dubbo+Zookeeper最佳实践

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

    package com.primeton.dubbo.provider;

    /** * * 服务提供方接口 * * @author yujl (mailto:yujl@primeton.com) */ public interface DemoService {

    /** * 这是一个测试 * @param input * @return */ String testHelloWorld(String input);

    } 接口类DemoService:

    package com.primeton.dubbo.provider.impl;

    import org.apache.commons.lang.StringUtils;

    import com.primeton.dubbo.provider.DemoService;

    /** * * 服务提供方实现 * * @author yujl (mailto:yujl@primeton.com) */ public class DemoServiceImpl implements DemoService {

    /* (非 Javadoc) * @see com.primeton.dubbo.provider.DemoService#testHelloWorld(java.lang.String) */ public String testHelloWorld(String input) { if(StringUtils.isBlank(input)){ return "input must not null"; } return "Hello " + input; }

    }

    SpringBean配置编码如下:

    <dubbo:application name="hello-world-app" />

    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <dubbo:protocol name="dubbo" port="20880" />

    <dubbo:service interface="com.primeton.dubbo.provider.DemoService" ref="demoService" />

    到此,服务提供者就开发完成了,此时通过导出构件包并部署到Tomcat的default_provider应用当中。

    启动服务提供者所在的Tomcat,访问服务监控平台会看到如下界面:

    EOSPlatform+Dubbo+Zookeeper最佳实践

    如此, 服务提供者就将服务发布到Zookeeper注册中心当中管理起来了。

    4     服务消费者示例开发

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

    EOSPlatform+Dubbo+Zookeeper最佳实践

    首先需要引入服务提供方接口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配置文件修改如下:

    <dubbo:application name="consumer-of-helloworld-app" />

    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <dubbo:reference id="demoService" interface="com.primeton.dubbo.provider.DemoService"/>

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

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

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

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

    EOSPlatform+Dubbo+Zookeeper最佳实践

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

    EOSPlatform+Dubbo+Zookeeper最佳实践

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

    EOSPlatform+Dubbo+Zookeeper最佳实践

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

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

    EOSPlatform+Dubbo+Zookeeper最佳实践

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

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

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

    EOSPlatform+Dubbo+Zookeeper最佳实践

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

    EOSPlatform+Dubbo+Zookeeper最佳实践

       项目模块依赖EOSPlatform+Dubbo+Zookeeper最佳实践

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

    2.    项目依赖介绍

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

    EOSPlatform+Dubbo+Zookeeper最佳实践

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

     EOSPlatform+Dubbo+Zookeeper最佳实践

    3.  项目功能部分截图:

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践    

    zookeeper、dubbo服务启动 

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践    

    dubbo管控台 

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     REST服务平台

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

     

    EOSPlatform+Dubbo+Zookeeper最佳实践

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这