配色: 字号:
Dubbo_RPC_Features
2017-03-31 | 阅:  转:  |  分享 
  
Dubbo功能介绍

1

阿里巴巴-B2B-平台技术部-应用框架

2011-12Dubbo

weibo.com/dubbo

大纲

?Dubbo简要介绍

?Dubbo-RPC基本功能

?Dubbo-RPC高级功能

?最佳实践

2

Dubbo是什么

?分布式服务框架

–高性能和透明化的RPC远程服务调用方案

–SOA服务治理方案



3

如何使用Dubbo

?本地服务





?远程服务

4





















Dubbo能做什么

?透明化的远程方法调用

–就像调用本地方法一样调用远程方法

–只需简单配置,没有任何API侵入。

?软负载均衡及容错机制

–可在内网替代F5等硬件负载均衡器

?服务自动注册与发现

–不再需要写死服务提供方地址,注册中心基于接口名查询服务提

供者的IP地址,并且能够平滑添加或删除服务提供者

5

Dubbo基本原理

6

Service

Consumer

Dubbo

Registry

Service

Provider

Dubbo

Invoker

Dubbo

Exporter

2.启动时订阅服务地址列表

4.随机调用一个服务地址,失败重试另一地址

3.变更时推送服务地址列表

Dubbo

Monitor

5.后台定时采集服务调用次数和调用时间等信息

MySQL

Database

长连接

短连接

1.启动时以注册提供的服务

DubboRPC基本功能篇

SOA因你而简单

7

Dubbo-RPC基本功能

8

配置

?配置继承

?可配置可编程

服务匹配

?服务分组、多版本

?指定调用

?只订阅

集群&容错

?集群原理

?容错规则

多协议

?不同服务不同协议

?同一服务多协议

?本地服务调用



多注册中心Gracefulshutdown

基本功能-配置继承

Provider

?

?dubbo://10.20.130.230:20880/xxxService?timeout=3000&retries=0

?服务提供者配置参考值

Registry

?dubbo://10.20.130.230:20880/xxxService?timeout=4000&retries=1

?注册中心可在服务治理过程中修改配置值,如果不修改使用Provider设置的值

Consumer

?

?dubbo://10.20.130.230:20880/xxxService?timeout=5000&retries=2

?服务消费者如果出现网络慢等特殊情况,可再修改配置值,如果不修改使用前面设置的值

9

实际使用中发现,服务提供者比消费者更清楚一个方法的执行时间,是否允许重试

等信息,所以增加允许服务提供者为消费者设置缺省值,并采用继承风格:

基本功能-可编程配置–暴露服务

编程配置:

//服务实现

XxxServicexxxService=newXxxServiceImpl();



//当前应用配置

ApplicationConfigapplication=newApplicationConfig();

application.setName("xxx");



//连接注册中心配置

RegistryConfigregistry=newRegistryConfig();

registry.setAddress("10.20.130.230:9090");

registry.setUsername("aaa");

registry.setPassword("bbb");



//服务提供者协议配置

ProviderConfigprovider=newProviderConfig();

provider.setProtocol("dubbo");

provider.setPort(12345);

provider.setThreads(200);



//服务提供者暴露服务配置

ServiceConfigservice=newServiceConfig();

service.setApplication(application);

service.setRegistry(registry);//多个注册中心可以用setRegistries()

service.setProvider(provider);//多个提供者可以用setProviders()

service.setInterfaceClass(XxxService.class);

service.setRef(xxxService);

service.setVersion("1.0.0");

service.export();//触发服务注册

Schema配置:




xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:dubbo="http://repo.alibaba-inc.com/schema/dubbo"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://repo.alibaba-inc.com/schema/dubbo

http://repo.alibaba-inc.com/schema/dubbo/dubbo-component-2.0.xsd">
















password="hello1234"/>












version="1.0.0"ref="xxxService"/>



10

解决框架集成时过度依赖于Dubbo的内部API问题,增加与配置一致的映射API:

基本功能-可编程配置-引用服务

编程配置:

//当前应用配置

ApplicationConfigapplication=newApplicationConfig();

application.setName("yyy");



//连接注册中心配置

RegistryConfigregistry=newRegistryConfig();

registry.setAddress("10.20.130.230:9090");

registry.setUsername("aaa");

registry.setPassword("bbb");



//服务消费者缺省值配置

ConsumerConfigconsumer=newConsumerConfig();

consumer.setTimeout(5000);

consumer.setRetries(2);



//引用远程服务

ReferenceConfigreference=newReferenceConfig();

reference.setApplication(application);

reference.setRegistry(registry);//多个注册中心可以用setRegistries()

reference.setConsumer(consumer);

reference.setInterfaceClass(XxxService.class);

reference.setVersion("1.0.0");

XxxServicexxxService=reference.get();//获取远程xxxService代理



Schema配置:




xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:dubbo="http://repo.alibaba-inc.com/schema/dubbo"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://repo.alibaba-inc.com/schema/dubbo

http://repo.alibaba-inc.com/schema/dubbo/dubbo-component-2.0.xsd">










password="hello1234"/>












interface="com.alibaba.xxx.XxxService"version="1.0.0/>



11

基本功能–服务分组



服务提供者













服务消费者





12

当一个接口有多种实现时,可以用group区分

基本功能–服务分组

服务提供者





服务消费者





13

当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用

基本功能–指定调用

点对点直连/指定调用需求(开发/测试环境)

?方式一Spring配置



?方式二Java–D参数方式

–java-Dcom.alibaba.xxx.XxxService=dubbo://localhost:20890

?方式三映射文件方式

–java-Ddubbo.resolve.file=xxx.properties

–com.alibaba.xxx.XxxService=dubbo://localhost:20890

?方式四路由方式(future)

–参数匹配host、clssifier

?方式五修改version

–不推荐





14

基本功能–只订阅

15

共用注册中心,开发人员机器上的服务提供者被误调,影响其他开发人员(开发、测试环境)



基本功能–集群&容错

16

基本功能–多协议

?不同服务不同协议

比如:不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议。

17



















?同一服务多协议暴露

比如:需要与http客户端互操作












protocol="dubbo,hessian"/>

基本功能–多协议

?InJvm调用

?同一个jvm内部的服务调用采用短路的方式

?先本地服务化,再做物理远程调用









基本功能–多注册中心引用

?解决CRM需同时调用中文站和国际站PC2相同接口相同版本服务的问题

定义多个注册中心:





不同注册中心使用不同引用:


version="1.0.0“registry=“chinaRegistry”/>


version="1.0.0“registry=“intlRegistry”/>

基本功能–GracefulShutdown

20

Service

Consumer

Dubbo

Registry

Service

Provider

Dubbo

Invoker

Dubbo

Exporter

2.发送ReadOnly事件

推送服务地址列表

同步

异步

1.取消注册

4.Shutdown

完成已有任务

拒绝处理新任务

3.等待已有任务完成

5.连接断开事件

Service

Provider

Dubbo

Exporter

DubboRPC高级功能篇

21

SOA因你而不同

Dubbo-RPC高级功能

22

ConsumerOnly

?泛化调用

?Stub&Mock

?异步调用&Forking

?路由

ProviderOnly

?Telnet

?流量控制

Consumer&Provider

?CallBack

?隐式传参

高级功能-Telnet互操作

C:\>telnetlocalhost20880

dubbo>help

ls-l

ps-l

status-l

traceXxxService10

countXxxService

invokeXxxService.xxxMethod(args)

log100

高级功能–泛化调用

24



配置:


version=“1.0.0”generic=“true”/>

引用接口:(有API侵入)

com.alibaba.dubbo.rpc.service.GenericService

GenericServicexxxService=(GenericService)context.getBean(“xxxService”);









客户端没有业务API,弱类型泛化调用,POJO自动转为Map

高级功能–显示回调

?原理

UserServiceImplxxx

yyy(arguments)

ListenerImpl

UserServiceInterface

ListenerInterface

?使用场景

注册中心

Normandy

配合stub做热数据缓存



高级功能-异步调用

?并行发起多个请求,但只使用一个线程



–xxxService.findXxx();

–FuturexxxFuture=RpcContext.getFuture();



UserThread

RpcContext

Future

IOThread

2.request

Server

6.response

5.get/wait

4.getFuture3.setFuture

7.set/notify

1.findXxx

async

sync

高级功能-框架事件

?

?

高级功能-本地执行

?在客户端执行部分代码,比如:

–在客户端缓存已查询过的数据

–当服务器端全部不可用时,伪造容错数据

ConsumerProviderDubboAPI

XxxServiceStub

XxxServiceMock

XxxServiceImplXxxServiceProxyAction

Remote

XxxService

referinvokeinherit

Failed

高级功能-隐式传参

?隐式传参,比如:

–验权扩展点需要携带一些用户凭证信息

?ThreadLocalContext

–RpcContext.setAttachment(“password",“xxx");

–RpcContext.getAttachment("password");



ProxyFilter

RpcContextRpcContext

ActionImplementFilter

setAttachmentgetAttachmentNe

t

invocation

attachment

高级功能–路由

?注册中心路由

–注册中心根据路由规则挑选服务提供者列表

?RPC路由

–类方法参数级别的路由规则

–数据sharding

–开发阶段的服务过滤(classifier)

–可扩展的路由接口&基于ScriptEngine的实现

?simpleEL

?Groovy..



高级功能–路由示例

JavaScript路由示例:

functionroute(invokers,invocation,context){

varresult=newjava.util.ArrayList();

if(invokers.size()>1&&

invocation.getMethodName().equals("method1")){

result.add(invokers.get(0));

}else{

result.add(invokers.get(1));

}

returnresult;

};

route(invokers,invocation,context);



高级功能–流量控制

?actives:Consumer并发数限制

?executes:Provider并发数上限



?connections:Consumer的连接数

?accepts:Provider的连接上限

#短连接是连接上限,长连接则是启用的连接数



?LeastActiveLoadBalance:

调用并发数最小的Provider(从Consumer端并发)

调节Provider间并发



Dubbo-RPC-Napoli

?UseNapoliAsDubbo







?Use…AsDubbo

服务化最佳实践

?http://b2b-doc.alibaba-

inc.com/display/RC/Dubbo_Best_Practices

QA







Q&A

献花(0)
+1
(本文系关平藏书首藏)