GVKun编程网logo

EOSPlatform+Dubbo+Zookeeper最佳实践

15

本文将介绍EOSPlatform+Dubbo+Zookeeper最佳实践的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于(阿里巴巴dubbo,有数

本文将介绍EOSPlatform+Dubbo+Zookeeper最佳实践的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于(阿里巴巴 dubbo, 有数据库,可执行) dubbo zookeeper spring demo、73.springboot + dubbo + zookeeper、dubbo+zookeeper、Dubbo+Zookeeper (二)Dubbo 架构的知识。

本文目录一览:

EOSPlatform+Dubbo+Zookeeper最佳实践

EOSPlatform+Dubbo+Zookeeper最佳实践

  • 摘要:随着分布式服务框架的流行,许多公司都引入了业界流行的分布式服务框架,本文介绍如何使用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-/>

     

    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;
    
    /**
    *
    * 服务提供方接口
    *
    * @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配置编码如下:

     

    <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="hello-world-app" />
    <!-- 使用multicast广播注册中心暴露服务地址  先不使用注册中心-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.primeton.dubbo.provider.DemoService" ref="demoService" />
    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService"/>
    </beans>

     

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

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

     

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

     

    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"> <!-- 和本地服务一样使用远程服务 -->
    <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的博客

     

  •  

(阿里巴巴 dubbo, 有数据库,可执行) dubbo zookeeper spring demo

(阿里巴巴 dubbo, 有数据库,可执行) dubbo zookeeper spring demo

源码下载  http://download.csdn.net/download/knight_black_bob/9439432

  

windows zookeeper 下载地址 http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.6/
修改zookeeper配置文件zoo-example.cfg改为zoo.cfg,zookeeper默认寻找zoo.cfg配置文件


# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
#dataDir=/tmp/zookeeper
dataDir=F:\\log\\zookeeper\\data  
dataLogDir=F:\\log\\zookeeper\\log
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

启动zookeeper
Window下命令:进入bin目录 ->zkServer.cmd

 

 

配置  <dubbo:registry  id="zk1" address="quickstart.cloudera:2181" protocol="zookeeper" />

测试成功

 

 

  ,provider 发布 后 ,linux 下 zookeeper  path 会增加。 zookeeper 起到 注册中心,服务发现的作用

 
consumer 测试结果:

 

 

provider 发布,(这是一种发布方式)

 

 

 applictionContext-dubbo-provider.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
          http://code.alibabatech.com/schema/dubbo
          http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
              

    <!-- 提供方应用名称信息,这个相当于起一个名字,我们dubbo管理页面比较清晰是哪个应用暴露出来的 -->
	<dubbo:application name="curiousby-dubbo-provider"/>
	<!-- 提供方应用名称信息,这个相当于起一个名字,我们dubbo管理页面比较清晰是哪个应用暴露出来的 -->    
    <!-- 使用zookeeper注册中心暴露服务地址 -->
	<dubbo:registry  id="zk1" address="192.168.16.21:2181,192.168.16.29:2181,192.168.16.30:2181" protocol="zookeeper" /> 
	 <!-- 使用multicast广播注册中心暴露服务地址 -->  
    <!--<dubbo:registry address="multicast://224.5.6.7:1234" /> --> 
     <!-- 用dubbo协议在20886端口暴露服务 -->  
     <dubbo:protocol id="mydubbo"  name="dubbo" port="20886" />   
     <dubbo:provider registry="zk1"  protocol="mydubbo"/>
     
     
     
    <!-- 声明需要暴露的服务接口 -->  
    <dubbo:service interface="com.baoy.service.UserService"   ref="userServiceImpl" />  
			
</beans>

  

 applictionContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:oscache="http://www.springmodules.org/schema/oscache"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	   	 http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
	   	 http://www.springframework.org/schema/context
	   	 http://www.springframework.org/schema/context/spring-context-3.1.xsd 
	   	 http://www.springframework.org/schema/aop 
	   	 http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
	   	 http://www.springframework.org/schema/tx 
	   	 http://www.springframework.org/schema/tx/spring-tx-3.1.xsd 
	   	 http://www.springmodules.org/schema/oscache 
	   	 http://www.springmodules.org/schema/cache/springmodules-oscache.xsd
	   	 http://www.springframework.org/schema/mvc
	   	 http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

	<!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
	<mvc:annotation-driven />
	<!-- 扫描包 -->
	<context:annotation-config />
	<!-- import the properties -->
	<context:property-placeholder location="classpath:jdbc.properties" />
	<context:component-scan base-package="com.baoy" />

	<!-- 配置數據源 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<!-- 连接池启动时的初始值 -->
		<property name="initialSize" value="${jdbc.initialSize}" />
		<property name="maxActive" value="${jdbc.maxActive}" />
		<property name="maxIdle" value="${jdbc.maxIdle}" />
		<property name="minIdle" value="${jdbc.minIdle}" />
	</bean>

	<!-- 配置jdbcTemplate模板 -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<!-- 配置 transactionManager事物管理 -->
	<!-- <bean id="transactionManager"> 
		<property name="dataSource" ref="dataSource" /> </bean> -->


	<!-- Spring AOP config配置切点 -->
	<!-- <aop:config> <aop:pointcut expression="execution(* cmcc.picrepository.service.*.*(..))" 
		id="bussinessService" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="bussinessService" 
		/> </aop:config> -->

	<!-- 配置那个类那个方法用到事务处理 -->
	<!-- <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
		<tx:attributes> <tx:method name="search*" read-only="true" /> <tx:method 
		name="find*" read-only="true" /> <tx:method name="get*" read-only="true" 
		/> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="save*" 
		propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" 
		/> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="*" 
		propagation="REQUIRED" /> </tx:attributes> </tx:advice> -->
</beans>

 

 

 

package com.baoy.service;

import java.util.List;

import com.baoy.bean.User;

/**
 * @author baoyou E-mail:curiousby@163.com
 * @version 2016年2月22日 上午10:24:23
 *
 * desc: ...
 */
public interface UserService {
	public List<User> getAllUsers();
	public void delUserById(int userId);
	public User getUserById(int userId);
	public void updateUser(User user);
	public void addUser(User user);
}

 

 

 

package com.baoy.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

import com.baoy.bean.User;
import com.baoy.dao.UserDao;
import com.baoy.service.UserService;

/**
 * @author baoyou E-mail:curiousby@163.com
 * @version 2016年2月22日 上午10:24:54
 *
 * desc: ...
 */
@Component
public class UserServiceImpl implements UserService {

	@Autowired
	UserDao userDao;
	
	
	
	public List<User> getAllUsers() {
		return userDao.getAllUsers();
	}

	public void delUserById(int userId) {
		userDao.delUserById(userId);
	}

	public User getUserById(int userId) {
		return 	userDao.getUserById(userId);
	}

	public void updateUser(User user) {
		userDao.updateUser(user);
	}

	public void addUser(User user) {
		userDao.addUser(user);
	}

}

 

 provider 发布,上面有一种发布方式

package com.baoy.main;

import java.io.IOException;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author baoyou E-mail:curiousby@163.com
 * @version 2016年2月22日 下午4:44:44
 *
 *          desc: ...
 */
public class Start {

	public static void main(String[] args) throws IOException {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "classpath*:META-INF/spring/applictionContext.xml",
						"classpath*:META-INF/spring/applictionContext-dubbo-provider.xml" });
		context.start();
		System.in.read(); // 按任意键退出
	}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 appliction-dubbo-consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
          http://code.alibabatech.com/schema/dubbo
          http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
              
	<dubbo:application name="curiousby-dubbo-consumer"/>
	 
	<dubbo:registry id="zk1" address="192.168.16.21:2181,192.168.16.29:2181,192.168.16.30:2181" protocol="zookeeper" />  
	
    <dubbo:consumer registry="zk1"/> 
     
    <dubbo:reference id="userService"  interface="com.baoy.service.UserService"/>  
			
</beans>

 

 appliction.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:oscache="http://www.springmodules.org/schema/oscache"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	   	 http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
	   	 http://www.springframework.org/schema/context
	   	 http://www.springframework.org/schema/context/spring-context-3.1.xsd 
	   	 http://www.springframework.org/schema/aop 
	   	 http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
	   	 http://www.springframework.org/schema/tx 
	   	 http://www.springframework.org/schema/tx/spring-tx-3.1.xsd 
	   	 http://www.springmodules.org/schema/oscache 
	   	 http://www.springmodules.org/schema/cache/springmodules-oscache.xsd
	   	 http://www.springframework.org/schema/mvc
	   	 http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
  
	<context:annotation-config />
	<context:component-scan base-package="com.baoy.test" />

</beans>

 

 

package com.baoy.test;
 

import java.util.List;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.baoy.bean.User;
import com.baoy.service.UserService;

/**
 * @author baoyou E-mail:curiousby@163.com
 * @version 2016年2月22日 下午1:48:37
 *
 * desc: ...
 */

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:appliction.xml","classpath:appliction-dubbo-consumer.xml"})
public class ConsumerTest {

	 @Resource
	UserService userService; 
	
	@Test
	public  void allUsersTest() { 
		 List<User> allUsers = userService.getAllUsers();
		System.out.println("\r\n\r\n\r\n"+allUsers.toString()+"\r\n\r\n\r\n"); 
	}
	
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和 PayPal 捐助),没钱捧个人场,谢谢各位。



 
 
 谢谢您的赞助,我会做的更好!

 

 

73.springboot + dubbo + zookeeper

73.springboot + dubbo + zookeeper

1. doubbo 管理台  搭建  https://my.oschina.net/springMVCAndspring/blog/2050933

2.zookeeper安装   https://my.oschina.net/springMVCAndspring/blog/2050353   

1.效果

 

 

2. 生产者

2.1 pom.xml

<!--7.dubbo依赖-->
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba.spring.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>
<!--8.zkclient依赖-->
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
</dependency>

2.2 配置文件

server.port=6666

dubbo.application.name=dubbo-producer
dubbo.registry.address=zookeeper://localhost:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.scan.basePackages=cn.ma.scz.service
#dubbo.monitor.protocol=registry

 

 

2.3  3 层代码

2.3.1 controller

2.3.2 service

  接口还是原来那样,实现类的注解用dubbo的

 

2.3.3 mapper

略.....

 

3.消费者

3.1 导入jar

<!--7.dubbo依赖-->
    <dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>
    <dependency>
        <groupId>com.alibaba.spring.boot</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.0.0</version>
    </dependency>
    <!--8.zkclient依赖-->
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.10</version>
    </dependency>

 

3.2  配置文件

## Dubbo 服务消费者配置
dubbo.application.name=order-service-consumer
dubbo.registry.address=zookeeper://localhost:2181
#dubbo.monitor.protocol=registry

 

 

3.3 代码

3.3.1 controller

3.3.2   (重要) service层

4.代码

链接:https://pan.baidu.com/s/1N0B-Z2_DmKmqK7WnDTI-Bw 
提取码:ksue 

dubbo+zookeeper

dubbo+zookeeper

zookeeper 安装

单击模式

集群模式

dubbo demo

Consumer

registry 配置

输入图片说明

Pom配置 输入图片说明

运行配置 输入图片说明

Provider

同Consumer

链接

Zookeeper 安装

Zookeeper 官网

官网

Dubbo 教程

Dubbo+Zookeeper (二)Dubbo 架构

Dubbo+Zookeeper (二)Dubbo 架构

dubbo 架构

上次更新博客已经是一年前,这一年发生了很多事,并不顺利,甚至有些痛苦,不过不管怎样,不要停止学习,只有学习才能让你变强,应对更多不安定。

一、RPC 概念

Dubbo 服务是一个 RPC 框架,那我们首先就要先理解什么叫做 RPC, Remote Procedure Call 即远程过程调用。

远程过程调用相对的是本地过程调用,本地过程调用就不用说了,简单理解成本地方法调用函数即可,而远程调用是指调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数。而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。

RPC 的基本架构图如下:

 

 RPC 框架就是图中的 client stub 和说 server stub,服务间要相互调用,需要先建立连接。当客户端调用 client stub,可能需要传递参数,而在网络间传递,需要进行序列化,序列化完全后将需要调用的消息发送给 server stub,服务端收到信息后,先反序列化,然后再调用本地服务,调用完本地服务后,返回处理结果,结果也需要进行序列化,序列化完成之后再返回消息,而 client stub 收到消息,也需要再次反序列化,再转换成调用结果,这就是一个完整的 RPC 过程,如图所示:

 

 

RPC 框架就是要实现像那小助手一样的东西,目的就是让我们使用远程调用像本地调用一样简单方便,并且解决一些远程调用会发生的一些问题 ,对于我们来说是无感知的。

在示例图中我们也可以看出,RPC 的核心模块就是通讯,序列化

那如果让我们来设计一个 RPC 框架,我们的设计思路应该是怎么样的呢?

首先从服务调用者开始,这是一个消费方,我们要消费一个服务,那么这种服务应该是一个接口形式的,这个接口一般是一个公用 jar 包来定义,当我知道需要调用什么接口时,具体的实现不需要清楚,这些都应该是框架代理来做的,我只需要带接口和参数即可。

消费方不需要知道其中细节,不需要知道要调用那台服务器上的服务,这个时候应该有一个注册中心,这个注册中心有点类似公司大楼的前台物业,他负责指引来客人找到找入驻本栋大楼的公司,每个公司类似服务提供者,公司入驻大大楼后,将自己的楼层和门牌号告诉前台,前台把公司的情况贴在前台指引,那么当有人要找到公司提供服务时,可以直接通过门牌找到想要去的公司,而这个公司搬走后,前台物业又将此公司去掉,消费者需要的服务器是可以直接找到对应公司。

当然,如果你直接告诉了客户你的具体位置,那么客户可以不需要去注册中心找你,也就是注册中心可以不需要

那作为服务提供者,你要告诉别人你公司能提供的服务器,去实现对应的接口 ,然后暴露出去,也就是去向注册中心注册自己,暴露自己所能提供的服务。 然后有消费者请求过来需要处理,提供者需要用和消费者协商好的协议来处理这个请求,然后做反序列化

面对众多的服务,精细化的监控和方便的运维必不可少。 这个时候我们需要监控运维 ,也就是监控中心,当然如果你要这么莽,就是不需要监控,当然也是可以的。

到此,我们能想到的架构就是如此,接下里我们就来看看 dubbo 设计(当然,我是通过实际架构反推出来,手动狗头)

二、Dubbo 核心概念

Dubbo 是阿里巴巴 2011 年开源的一个基于 Java 的 RPC 框架,中间沉寂了一段时间,不过其他一些企业还在用 Dubbo 并自己做了扩展,比如当当网的 Dubbox,还有网易考拉的 Dubbok。

在 2018 年和 Dubbox 进行了合并,并且进入 Apache 孵化器,在 2019 年正式成为 Apache 顶级项目。

学习一门技术,如果有官网的话我们尽量从官网上学习:首先我们要知道 Dubbo 有哪些特性:

  • 面向接口代理的高性能 RPC 调用: 提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。

  • 智能负载均衡: 内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。

  • 服务自动注册与发现: 支持多种注册中心服务,服务实例上下线实时感知。

  • 高度可扩展能力: 遵循微内核 + 插件的设计原则,所有核心能力如 Protocol、Transport、Ser.........

今天的关于EOSPlatform+Dubbo+Zookeeper最佳实践的分享已经结束,谢谢您的关注,如果想了解更多关于(阿里巴巴 dubbo, 有数据库,可执行) dubbo zookeeper spring demo、73.springboot + dubbo + zookeeper、dubbo+zookeeper、Dubbo+Zookeeper (二)Dubbo 架构的相关知识,请在本站进行查询。

本文标签: