高性能的分布式服务框架 Dubbo
- #remoting:远程通讯基础,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。
- #cluster: 服务框架核心,提供基于接口方法的远程过程调用,包括多协议支持,并提供软负载均衡和容错机制的集群支持。
- #registry: 服务注册中心,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。 

当服务调用失败时(比如响应超时),根据我们的业务不同,可以使用不同的策略来应对这种失败。比如我们调用的服务是一个查询服务,不会修改数据库,那么可以给该服务设置容错方式为failover <失败重试方式>,当调用失败时,自动切换到其他服务提供者去调用,当失败次数超过指定重试次数,那么就抛出错误。如果服务是更新数据的服务,那就不能使用失败重试的方式了, 因为这样可能产生数据重复修改的问题,比如调用提供者A的插入用户方法,但是该方法业务逻辑复杂,执行过程很慢,导致响应超时,那么此时如果再去调用另外一个服务提供者的插入用户方法,将会又重复插入同一个用户。对于这种类型的服务,可以使用容错方式为failfast,如果第一次调用失败,立即报错,不需要重试。
另外还有下面几种容错类型,failsafe 出现错误,直接忽略,不重试也不报错; failback 失败后不报错,会将该失败请求,定时重发,适合消息通知类型的服务。forking,并行调用多个服务器,只要在某一台提供者上面成功,那么方法返回,适合实时性要求较高的查询服务,但是要牺牲性能。因为每台服务器会做同一个操作;broadcast 广播调用所有服务提供者,逐个调用,任意一台报错则报错。适合与更新每台提供者上面的缓存,这种类型的服务。
案例:我们在点我吧的APP消息推送就是采用的failback方式,点我吧的短信通知则采用的是failover方式。
如上图所示,是环形的hash空间,按照常用的hash算法来将对应的key哈希到一个具有2^32次方个桶的空间中,即0~(2^32)-1的数字空间中。现在我们可以将这些数字头尾相连,想象成一个闭合的环形。我们把数据通过hash算法处理后映射到环上,现在我们将object1、object2、object3、object4四个对象通过特定的Hash函数计算出对应的key值,然后散列到Hash环上。Hash(object1) = key1;Hash(object2) = key2;Hash(object3) = key3;Hash(object4) = key4;

 public interface SolrSearchService {
     String search(String collection, String q, ResponseType type, int start, int rows);
     public enum ResponseType {JSON, XML}
 }

package org.shirdrn.platform.dubbo.service.rpc.server; import java.io.IOException;
import java.util.HashMap;
import java.util.Map; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.shirdrn.platform.dubbo.service.rpc.api.SolrSearchService;
import org.shirdrn.platform.dubbo.service.rpc.utils.QueryPostClient;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class SolrSearchServer implements SolrSearchService { private static final Log LOG = LogFactory.getLog(SolrSearchServer.class);
private String baseUrl;
private final QueryPostClient postClient;
private static final Map<ResponseType, FormatHandler> handlers = new HashMap<ResponseType, FormatHandler>(0);
static {
handlers.put(ResponseType.XML, new FormatHandler() {
public String format() {
return "&wt=xml";
}
});
handlers.put(ResponseType.JSON, new FormatHandler() {
public String format() {
return "&wt=json";
}
});
}
public SolrSearchServer() {
super();
postClient = QueryPostClient.newIndexingClient(null);
}
public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
}
public String search(String collection, String q, ResponseType type,
int start, int rows) {
StringBuffer url = new StringBuffer();
url.append(baseUrl).append(collection).append("/select?").append(q);
url.append("&start=").append(start).append("&rows=").append(rows);
url.append(handlers.get(type).format());
LOG.info("[REQ] " + url.toString());
return postClient.request(url.toString());
}
interface FormatHandler {
String format();
}
public static void main(String[] args) throws IOException {
String config = SolrSearchServer.class.getPackage().getName().replace('.', '/') + "/search-provider.xml";
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
context.start();
System.in.read();
}
}
<?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-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="search-provider" />
<dubbo:registry address="zookeeper://slave1:2188?backup=slave3:2188,slave4:2188" />
<dubbo:protocol name="dubbo" port="20880" />
<bean id="searchService" class="org.shirdrn.platform.dubbo.service.rpc.server.SolrSearchServer">
<property name="baseUrl" value="http://nginx-lbserver/solr-cloud/" />
</bean>
<dubbo:service interface="org.shirdrn.platform.dubbo.service.rpc.api.SolrSearchService" ref="searchService" />
</beans>
上面,Dubbo服务注册中心指定ZooKeeper的地址:zookeeper://slave1:2188?backup=slave3:2188,slave4:2188,使用Dubbo协议。配置服务接口的时候,可以按照Spring的Bean的配置方式来配置,注入需要的内容,我们这里指定了搜索集群的Nginx反向代理地址http://nginx-lbserver/solr-cloud/。

/*
* 使用Dubbo服务接口
*/ // 首先,在API包中定义服务接口,同时部署于Provider端和Consumer端
public interface HelloService {
public String sayHello();
} // 其次,在服务端的Provider实现代码
public class HelloServiceImpl implements HelloService {
public String sayHello() {
return "Welcome to dubbo!";
}
} // 配置:提供者暴露服务;消费者消费服务 /*provider端服务实现类*/
<bean id="helloService" class="com.alibaba.hello.impl.HelloServiceImpl" /> /*provider端暴露服务*/
<dubbo:service interface="com.alibaba.hello.HelloService" version="1.0.0" ref="helloService"/> /*consumer端引入服务*/
<dubbo:reference id="helloService" interface="com.alibaba.hello.HelloService" version="1.0.0" /> /*consumer端使用服务*/
<bean id="xxxAction" class="com.alibaba.xxx.XxxAction" ><property name="helloService" ref="helloService" /></bean>

高性能的分布式服务框架 Dubbo的更多相关文章
- 阿里巴巴分布式服务框架dubbo学习笔记
		Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的 ... 
- 阿里巴巴分布式服务框架Dubbo介绍(1)主要特色
		引言 互联网服务和BS架构的传统企业软件相比,系统规模上产生了量级的差距.例如 传统BS企业内部门户只需要考虑数百人以及几千人的访问压力,而大型互联网服务有时需要考虑的是千万甚至上亿的用户: 传统企业 ... 
- java分布式服务框架Dubbo的介绍与使用
		1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ... 
- 阿里巴巴分布式服务框架 Dubbo 介绍
		Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点.Dubbo自2011年开源后, ... 
- 阿里分布式服务框架Dubbo的架构总结
		Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模 ... 
- 高性能优秀的服务框架-dubbo介绍
		先来了解一下这些年架构的变化,下面的故事是我编的.... "传统架构":很多年前,刚学完JavaWeb开发的我凭借一人之力就开发了一个网站,网站 所有的功能和应用都集中在一起,方便 ... 
- 转载:java分布式服务框架Dubbo的介绍与使用
		1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ... 
- Java分布式服务框架Dubbo初探(待实践)
		Dubbo是什么? Dubbo[]是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封 ... 
- 【转】阿里巴巴分布式服务框架 Dubbo 团队成员梁飞专访
		原文链接:http://www.iteye.com/magazines/103 Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ ... 
随机推荐
- Atitit截屏功能的设计解决方案
			Atitit截屏功能的设计解决方案 自己实现.... 使用快捷键.. 弹出自己的win,,背景是屏幕快照 点击鼠标光标变成十字状态 出现截屏窗口调整截屏窗口位置与大小 释放鼠标,三个btn,, 复制 ... 
- 《Wireshark数据包分析实战》 - http背后,tcp/ip抓包分析
			作为网络开发人员,使用fiddler无疑是最好的选择,方便易用功能强. 但是什么作为爱学习的同学,是不应该止步于http协议的,学习wireshark则可以满足这方面的需求.wireshark作为抓取 ... 
- 【管理心得之三十二】PMP杂谈---------爱情必胜术
			这次一反常态,没有场景设计,我想借此文普及一下PMP是什么? 但我不知道这样枯燥的话题能否能引起你的兴趣,我不得不套用“标题党”<爱情必胜术>来博你眼球. 我真没有说谎,此文是献给那些孤身 ... 
- CKFinder_AspDotNet_2.4 破解方法   去版权
			CKFinder是一个比较好用的Web端文件管理器,虽然UI不是很好看,但是因为能搞到源码,所以比起网上那些只有付费之后才能下载到源码的Web端文件管理器要好许多,至少你可以在确定该控件是否能用在你的 ... 
- bootstrap实现嵌入的button
			bootstrap实现嵌入的button 如下的效果: <div class="form-inline"> <div class="input-grou ... 
- IOS开发之控件篇UICollectionViewControllor第一章 - 普通介绍
			1.介绍 UICollectionView和UICollectionViewControllor是IOS6.0后引入的新控件 使用UICollectionView必须实现三个接口: UICollect ... 
- Windows Azure Web Site (15) 取消Azure Web Site默认的IIS ARR
			<Windows Azure Platform 系列文章目录> 我们知道,Azure Web Site (改名为Azure Web App)默认是可以保留Session的.Azure We ... 
- 理解SQL Server是如何执行查询的 (3/3)
			页并发访问的保护:闩锁 在多线程并发情况下,需要防止读线程读到写线程正在写的资源,在编程中,通过使用互斥器(Mutexes), 信号量(Semaphore), 临界区(Critical Section ... 
- 用Eclipse新建一个web项目没有自动生成web.xml
			我们首先打开Eclipse,如下: 我们可以看到在"WEB-INF"文件夹下没有web.xml文件. 这是是什么原因呢,我们来看看,我们首先来新建一个web工程,如下: ... 
- Python处理JSON
			从开源中国的博客搬来,合并博客 一.JSON是什么? JSON是一种轻量级的数据交换格式 二.Python处理JSON的思维 其实很容易理解,无非是将数据编成JSON格式数据和吧JSON格式的数据解析 ... 
