Dubbo 是一个分布式服务框架,以及阿里巴巴内部的 SOA 服务化治理方案的核心框架。其功能主要包括:高性能 NIO 通信及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。html
说通俗点,就是首先将程序组件化成一个个相对独立的服务,而后就能够对服务进行分布式;并且,它有注册中心经过监听,实时发现着新服务,并部署,还能够推送给客户端;它还集成了负载均衡的解决方案,利用随机算法来将各个服务科学地分配到多台服务器上;固然,它也集成了容错机制,来提升集群的稳定性。前端
官方开发指南: http://dubbo.apache.org/zh-cn/docs/dev/build.htmljava
京东的扩展版本 jd-hydra: http://www.oschina.net/p/jd-hydragit
RPC 是指远程过程调用,也就是说两台服务 A,B,一个应用部署在 A 服务器上,想要调用 B 服务器上应用提供的函数/方法,因为不在一个内存空间,不能直接调用,须要经过网络来表达调用的语义和传达调用的数据。github
RPC 演进算法
框架演进:ORM –> MVC –> RPC –> SOAapache
架构演进:单一应用架构 –> 垂直应用架构 —> 分布式服务架构 –> 流动计算架构缓存
Dubbo 架构图服务器
节点角色网络
调用关系
性能说明
Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,其配置采用 XML 和注解的方式,使用 Spring 的 BeanFactory 加载 Bean,运行在 Spring 容器中。
简易步骤以下
1)定义服务接口
// DemoService.java package com.alibaba.dubbo.demo; public interface DemoService { String sayHello(String name); }
2)实现服务接口
// DemoServiceImpl.java package com.alibaba.dubbo.demo.provider; import com.alibaba.dubbo.demo.DemoService; public class DemoServiceImpl implements DemoService { public String sayHello(String name) { return "Hello " + name; } }
3)暴露服务
<beans> <!-- 省略 schema --!> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="hello-world-app" /> <!-- 使用 multicast 广播注册中心暴露服务地址 --> <dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 用 dubbo 协议在 20880 端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 声明须要暴露的服务接口 --> <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" /> <!-- 和本地 bean 同样实现服务 --> <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" /> </beans>
// FooServiceImpl.java import com.alibaba.dubbo.config.annotation.Service; @Service(version="1.0.0") public class FooServiceImpl implements FooService { }
// provider.xml <!-- 公共信息,也能够用 dubbo.properties 配置 --> <dubbo:application name="annotation-provider" /> <dubbo:registry address="127.0.0.1:4548" /> <!-- 扫描注解包路径,多个包用逗号分隔,不填 pacakge 表示扫描当前 ApplicationContext 中全部的类 --> <dubbo:annotation package="com.foo.bar.service" />
4)启动
public static void main(String[] args) throws Exception { // 加载 xml 配置启动 Spring 的 BeanFactory ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"}); context.start(); System.in.read(); // 按任意键退出 }
1)引用远程服务接口
// consumer.xml <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方同样 --> <dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用 multicast 广播注册中心暴露发现服务地址 --> <dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 生成远程服务代理,能够和本地 bean 同样使用 demoService --> <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
@Component public class BarAction { @Reference(version="1.0.0") private FooService fooService; }
2)调用服务
public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"http://10.20.160.198/wiki/display/dubbo/consumer.xml"}); context.start(); DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理 String hello = demoService.sayHello("world"); // 执行远程方法 System.out.println( hello ); // 显示调用结果 }