ITKeyword - 技术文章推荐分享

首页 > RPC框架与Dubbo完整使用

RPC框架与Dubbo完整使用

相关推荐:(一) Thunder分布式RPC框架

Thunder(QQ 群 471164539)发布在淘宝代码基地 http://code.taobao.org/p/Thunder/1. 概要1.1 Thunder是基于Netty + Hessian + Kafka + ActiveMQ + Tibco + Zookeeper(Curator Framework) + Redis + FST + Spring + Spring Web MVC分布式RPC调用框

这并不是原理性的解释文章。而是快速入门,还有一个完整的Java例子。 一篇我觉得不错的文章推荐:深入浅出 RPC - 浅出篇 一、RPC什么是RPC?RPC(Remote Procedure Call)远程过程调用。见名知意 - 从远程主机调用一个过程/函数。RPC的目标是:使得程序调用其它远程主机上的函数,好像调用本程序内的函数一样简单。并且屏蔽编程语言的差异性。要实现上述目标,首先的是设计一种通讯协议,所以RPC还代表着这一类协议(Protocol)RPC不是一个具体的协议,而是一个类型名,代表一类协议,这类协议叫做RPC协议;RPC协议在TCP/UDP之上,广义上可以跨越平台、语言进行应用通讯(说广义是因为可以开发一个协议且不支持跨语言);为什么要用RPC? 其实这是应用开发到一定的阶段的强烈需求驱动的。如果我们开发简单的单一应用,用户不多,流量不大,那我们用不着;当我们的访问量增大,业务增多时,我们可以将业务拆分成几个互不关联的应用,分别部署,以划清逻辑并减小压力。此时我们也不太需要RPC。当我们的业务越来越多,应用也越来越多时,我们会发现应用之间的交互已经不可避免。此时可以将核心业务抽离出来,将之组成独立的服务Service。而原有的、新增的应用都可以与那些独立的基础Service交互。此时,我们就会发现需要一种高效的应用程序之间的通讯手段,所以你看,RPC大显身手的时候来了!其实3的场景描述的就是服务化、微服务和分布式系统架构。RPC框架就是实现这些的有力方式。有哪些RPC? 有很多RPC框架:CORBAR、Thrift、Dubbo等等。基本上他们分为两种类别:一种是跨语言的;一种是同语言的,如果你的分布式应用架构主体都是Java应用,显然我们不应该使用跨语言的RPC来多一层中转浪费效率。就Java来说,我认为其本身API提供的RMI就是一种RPC协议,但是其毕竟太原始,需要自己去添加很多机制才能上生产环境。所以,今天介绍下我最近使用的Dubbo框架。二、Dubbo使用实例什么是Dubbo? Dubbo是阿里巴巴为Java开发的RPC,据网上评价来看,非常不错。在Dubbo开源后很多公司都使用其来构建自己的分布式架构。今天我来做一个使用实例。由于Dubbo官方文档已经把一切都说的很详细了,我就不没意思的摘抄了,放上地址:官网官网上也有详细使用方法,那我为什么还要写个使用实例呢? 是因为,似乎到2012年,Dubbo已经比较稳定的完成了所有开发,所以现在Dubbo其实是在一个松散的维护状态下的。有些文档内容已经失效:地址无法访问,一些错误没有明确说明。 所以参照官网会有一些问题,我就是解决了某些问题完成的一个实例,放在这里供大家参考。建议大家先去看文档,形成一个整体概念再做实例。 所以,我的整体架构是这样的:使用Dubbo来服务化(基于Spring);使用Zookeeper集群作为Dubbo服务的注册中心(Zookeeper简介与安装);使用Dubbo提供的一个JavaWeb项目作为Dubbo服务管理控制台;创建了一个服务提供者项目 - 叫dubbo-practice-provider;创建了一个服务消费者项目 - 叫dubbo-practice-consumer; 另外说一点,这两个只是练习项目,实际上一个项目可以既是提供者也是消费者。步骤首先,要确保Zookeeper的安装和配置正确,可以直接按照我另一篇文章Zookeeper简介与安装来做。我们需要一个Dubbo服务管理控制台: 本身这个项目的war包,Dubbo在其文档中是给出了下载地址的,但是地址已经失效了。所以,现在只能去其GitHub地址上自己下载源码下来打包了。使用Eclipse,用其自带的git插件下载dubbo项目整体,地址是:https://github.com/alibaba/dubbo.git;先将dubbo项目转为Maven项目,然后单独将其中的子Maven项目dubbo-admin导出来,这就是一个JavaWeb项目。但是这个项目,别直接Maven打包,因为它有一些依赖问题需要修改,打开其pom.xml文件:<!-- 修改了两点。

1. 原本的version是${project.parent.version},其值在pom.xml上方有配置,实际上就是2.5.4-SNAPSHOT,但是经过查看发现在MAVEN库中,Dubbo团队只更新到了2.5.3。这个2.5.4-SNAPSHOT实际上是当前我们下载的这个源码的版本,我们不想自己打包使用这个版本。所以就使用MAVEN上的2.5.3.

2. 另一个是增加了<exclusions>spring,这是因为dubbo缺省会依赖Spring,版本为2.5.6.SEC03。但是下面一个依赖配置com.alibaba.citrus.citrus-webx-all却也缺省依赖Spring,版本为3.2.16.RELEASE。

--><dependency>

<groupId>com.alibaba</groupId>

<artifactId>dubbo</artifactId>

<version>2.5.3</version>

<exclusions>

<exclusion>

<groupId>org.springframework</groupId>

<artifactId>spring</artifactId>

</exclusion>

</exclusions></dependency>如果使用Spring的2.5.6.SEC03版本直接打包,就会有如下错误:ERROR context.ContextLoader - Context initialization failedorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'uriBrokerService': Cannot create inner bean '(inner bean)' of type [com.alibaba.citrus.service.uribroker.impl.URIBrokerServiceImpl$URIBrokerInfo] while setting bean property 'brokers' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#25': Cannot create inner bean 'server' of type [com.alibaba.citrus.service.uribroker.uri.GenericURIBroker] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'server': Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'URIType' of bean class [com.alibaba.citrus.service.uribroker.uri.GenericURIBroker]: Bean property 'URIType' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:230)at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:122)at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:287)at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:126)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245)接着,如果此项目你不打算部署到与任意一个Zookeeper一个机器的话,就需要修改/dubbo-admin/src/main/webapp/WEB-INF/dubbo.properties文件,在其中指定你的Zookeeper地址(要保证这些机器能互相通讯)。没有要修改的了。可以使用Maven的package命令打包了。之后部署war项目,可以按照官网的部署方式,也就是将之部署为ROOT应用,官网地址点这里。服务提供者项目 源码地址:dubbo-practice-provider 其中有两个子项目:dubbo-practice-provider-api:暴漏接口和JavaBeans,让实现项目引用然后去实现、让消费者引用然后调用。这个比较简单,一看就懂就不展开讲了。dubbo-practice-provider-impl:上面api项目的实现项目,是一个普通Java项目;dubbo-practice-provider-impl项目主要内容就是Dubbo的使用了,说一下:首先是依赖关系,pom.xml中<!-- 上一个API项目 --><dependency>

<groupId>dubbo-practice-provider-api</groupId>

<artifactId>dubbo-practice-provider-api</artifactId>

<version>0.0.1-SN

相关推荐:(九) Thunder分布式RPC框架

Thunder(QQ 群 471164539)发布在淘宝代码基地 http://code.taobao.org/p/Thunder/1. 介绍治理中心是基于Nepxion Swing Repository组件,Java Desktop版的服务治理系统,计划用基于Ebay Jetstream框架做个Web版。它的主要功能包括1.1 登录需要填入

APSHOT</version></dependency><!-- 本项目用的Spring,版本4.2.2.RELEASE --><dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${spring.version}</version></dependency><!-- dubbo,版本2.5.3 --><dependency>

<groupId>com.alibaba</groupId>

<artifactId>dubbo</artifactId>

<version>${dubbo.version}</version></dependency><!-- dubbo使用的zookeeper,版本3.4.8 --><dependency>

<groupId>org.apache.zookeeper</groupId>

<artifactId>zookeeper</artifactId>

<version>${zookeeper.version}</version></dependency><!-- zookeeper的一种客户端zkclient,版本0.1 --><dependency>

<groupId>com.github.sgroschupf</groupId>

<artifactId>zkclient</artifactId>

<version>${zkclient.version}</version></dependency>其次是dubbo配置,配置在Spring配置文件中,我这里起名叫spring-dubbo.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 提供方应用信息,用于计算依赖关系 --><dubbo:application name="dubbo-practice-provider" /><!-- 使用Zookeeper集群注册中心暴露服务地址 --><dubbo:registry protocol="zookeeper" address="192.168.157.130:2181,192.168.157.129:2181" /><!-- 用dubbo协议在20880端口暴露服务,一个项目需要一个端口 --><dubbo:protocol name="dubbo" port="20880" /><!-- Service 提供者 --><!-- 声明需要暴露的服务接口,interface指定接口,ref指定真正的实现者 --><dubbo:service interface="com.ddup.dubbo.service.api.PersonService" ref="personService" /></beans>做好之后就可以运行了,我写了一个类/dubbo-practice-provider-impl/src/main/java/com/ddup/dubbo/service/impl/Main.java,运行这个就行。服务消费者项目 源码地址:dubbo-practice-consumer; 主要就是Dubbo服务的调用了,见spring-dubbo.xml:<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --><dubbo:application name="dubbo-practice-consumer" /><!-- 使用Zookeeper集群注册中心暴露服务地址 --><dubbo:registry protocol="zookeeper" address="192.168.157.130:2181,192.168.157.129:2181" /><!-- 生成远程服务代理,可以和本地bean一样使用demoService --><dubbo:reference id="personService" interface="com.ddup.dubbo.service.api.PersonService" />然后,运行/dubbo-practice-consumer/src/main/java/com/ddup/dubbo/consumer/Main.java,看到调用成功啦!上面2说的管理控制台上,现在你就可以看到服务了,能看到服务者以及每个服务的消费者等等信息;登录 查看Dubbo服务 以上!TIPS:dubbo-admin项目的tomcat启动后无法访问:打开catalina.out查看错误[root@localhost logs]# vim catalina.out如果发现如下错误,是因为Zookeeper没有成功启动,可以去检查Zookeeper的状态。INFO velocity.VelocityEngine - SpringResourceLoaderAdapter : initialization starting.INFO velocity.VelocityEngine - SpringResourceLoaderAdapter : set path '/templates/common/'INFO velocity.VelocityEngine - SpringResourceLoaderAdapter : initialization complete.INFO rule.ExtensionMappingRule - Initialized extension.input:ExtensionMappingRule with cache disabledINFO rule.ExtensionMappingRule - Initialized extension.output:ExtensionMappingRule with cache disabledINFO rule.DirectModuleMappingRule - Initialized action:DirectModuleMappingRule with cache disabledINFO rule.DirectModuleMappingRule - Initialized screen.notemplate:DirectModuleMappingRule with cache disabledINFO rule.FallbackModuleMappingRule - Initialized screen:FallbackModuleMappingRule with cache enabledINFO rule.DirectTemplateMappingRule - Initialized screen.template:DirectTemplateMappingRule with cache disabledINFO rule.FallbackTemplateMappingRule - Initialized layout.template:FallbackTemplateMappingRule with cache enabledINFO rule.DirectModuleMappingRule - Initialized control.notemplate:DirectModuleMappingRule with cache disabledINFO rule.FallbackModuleMappingRule - Initialized control:FallbackModuleMappingRule with cache enabledINFO rule.DirectTemplateMappingRule - Initialized control.template:DirectTemplateMappingRule with cache disabledINFO zkclient.ZkEventThread - Starting ZkClient event thread.

$(function () {

$('pre.prettyprint code').each(function () {

var lines = $(this).text().split('\n').length;

var $numbering = $('<ul/>').addClass('pre-numbering').hide();

$(this).addClass('has-numbering').parent().append($numbering);

for (i = 1; i <= lines; i++) {

$numbering.append($('<li/>').text(i));

};

$numbering.fadeIn(1700);

});

});

相关推荐:(十五) Thunder分布式RPC框架

Thunder(QQ 群 471164539)发布在淘宝代码基地 http://code.taobao.org/p/Thunder/框架支持两种方式的序列化,Java对象和字节数组的序列化和反序列化,Java对象和Json字符串的转换1)binary - Java实体类和字节数组的序列化/反序列化2)compression -

这并不是原理性的解释文章。而是快速入门,还有一个完整的Java例子。 一篇我觉得不错的文章推荐:深入浅出 RPC - 浅出篇 一、RPC什么是RPC?RPC(Remote Procedure Call)远程过程调用...

------分隔线----------------------------