Dubbo 分布式服务框架简介
1、分布式服务框架
1.1 Dubbo 简介
Dubbo 是一个分布式服务框架,以及阿里巴巴内部的 SOA 服务化治理方案的核心框架。其功能主要包括:高性能 NIO 通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。
说通俗点,就是首先将程序组件化成一个个相对独立的服务,然后就可以对服务进行分布式;而且,它有注册中心通过监听,实时发现着新服务,并部署,还可以推送给客户端;它还集成了负载均衡的解决方案,利用随机算法来将各个服务科学地分配到多台服务器上;当然,它也集成了容错机制,来提高集群的稳定性。
官网首页: http://dubbo.io/
官方用户指南: http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
当当网的扩展版本 dubbox : https://github.com/dangdangdotcom/dubbox
京东的扩展版本 jd-hydra: http://www.oschina.net/p/jd-hydra
1.2 SOA 简介
- SOA(Service Oriented Architecture):面向服务的架构。由服务治理、服务注册和发现、RPC、监控中心、调度中心以及服务路由、负载均衡等功能模块组成的资源调度和治理中心。
1.3 RPC 简介
RPC 是指远程过程调用,也就是说两台服务 A,B,一个应用部署在 A 服务器上,想要调用 B 服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
RPC 演进
框架演进:ORM –> MVC –> RPC –> SOA
架构演进:单一应用架构 –> 垂直应用架构 —> 分布式服务架构 –> 流动计算架构
- 单一应用架构:网站流量小的时候,将所有功能集中到单一应用以减少成本。
- 垂直应用架构:网站流量增大,横向扩展带来的效益越来越低,将应用拆分为互不相干的几个应用以提升效率。
- 分布式服务架构:当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
- 弹性计算架构:当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
2、Dubbo 架构简介
Dubbo 架构图
节点角色
- Provider:服务提供方,在启动时向注册中心注册服务;
- Consumer:服务消费方,向注册中心请求服务提供方列表,在本地做负载均衡调用服务;
- Register:注册中心,提供服务注册与发现(一般由 Zookeeper 担当),通过长连接与 Provider 和 Consumer 保持连接,负责监控 Provider 的上下线并及时通知 Consumer;
- Monitor:监控中心,负责统计服务的性能数据;
- Container:服务运行容器。
调用关系
- 0.start:服务运行容器启动、加载、运行服务提供方,一般由 Spring 容器启动 Jar 运行;
- 1.register: 服务提供方在启动时,向注册中心注册自己的 IP、服务接口等信息;
- 2.subscribe: 服务消费方向注册中心订阅自己感兴趣的服务提供方;
- 3.notify: 注册中心在服务提供方发生变更时将基于长连接向消费方推送消息;
- 4.invoke: 服务消费方在本地对服务列表做软负载均衡算法,选择最优的服务提供方进行 RPC 调用;
- 5.count: 消费方和提供方向监控中心定时异步推送服务调用次数和时间,消费方的包括网络耗时,提供方不包括网络耗时。
性能说明
- 连通性:注册中心通过长连接与 Provider 和 Consumer 进行通信,Provider 和 Consumer 直接通过 PRC 直接调用,其只在启动时向注册中心注册和订阅,注册中心不转发请求,当注册中心宕机,Consumer 依然可以通过本地缓存的 Provider 的地址列表进行调用;Provider 和 Consumer 与监控中心定时地通过异步通信方式进行服务调用信息上传;
- 健壮性:服务提供者无状态,任意一台宕掉后,不影响使用,服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复。
- 伸缩性:注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心,服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者。
- 扩展性:当服务集群规模进一步扩大,带动 IT 治理结构进一步升级,需要实现动态部署,进行弹性计算,现有分布式服务架构不会带来阻力。
3、Dubbo 使用简介
Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,其配置采用 XML 和注解的方式,使用 Spring 的 BeanFactory 加载 Bean,运行在 Spring 容器中。
简易步骤如下
- 1)搭建 zookeeper 消息中心
- 2)搭建 dubbo 服务端代码
- 3)搭建 dubbo 客户端代码
3.1 搭建服务提供方
1)定义服务接口
// DemoService.java package com.alibaba.dubbo.demo; public interface DemoService {
String sayHello(String name);
}
- 打包成 Jar 包在服务提供方和消费者处使用,该工程里除了接口定义以外,还有各种实体类和通用工具类
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;
}
}
- 采用 Maven 的多项目结构,将接口定义和服务实现定义在同一个父项目下。
3)暴露服务
- XML方式
<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(); // 按任意键退出
}
- 服务启动时,将向注册中心注册本服务的 IP、接口等信息。
3.2 搭建服务消费方
1)引用远程服务接口
- xml 方式
// 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 ); // 显示调用结果
}
Dubbo 分布式服务框架简介的更多相关文章
- [推荐]dubbo分布式服务框架知识介绍
[推荐]dubbo分布式服务框架知识介绍 CentOS+Jdk+Jboss+dubbo+zookeeper集群配置教程 http://wenku.baidu.com/view/20e8f36bf ...
- 使用dubbo分布式服务框架发布服务及消费服务
什么是DUBBO DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案. 准备工作 安装zookeeper ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服 ...
- Dubbo 分布式服务框架(spring、zookeeper)
DUBBO DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架, alibaba资源 源码:https://github.com ...
- Dubbo分布式服务框架入门
参考http://blog.csdn.net/u013142781/article/details/50387583 一.Dubbo概念介绍 1.1.Dubbo是什么? Dubbo是一个分布式服务框架 ...
- Dubbo分布式服务框架入门使用
概念: Provider 暴露服务方称之为"服务提供者". Consumer 调用远程服务方称之为"服务消费者". Registry 服务注册与发现的中心目录服 ...
- Dubbo 分布式服务框架入门
要想了解 Dubbo 是什么,我们不防先了解它有什么用.使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为 pc 端 web 管理后台,微信端销售公众号,那么我们分成四个项目,pc ...
- Dubbo分布式服务框架
Dubbo (开源分布式服务框架) 编辑 本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! Dubbo是 [1] 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高 ...
- Dubbo 分布式服务框架
要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为pc端web管理后台,微信端销售公众号,那么我们分成四个项目,pc端网站,微 ...
- Dubbo分布式服务框架入门(附project)
要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比方我想开发一个网上商城项目.这个网上商城呢,比較复杂.分为pc端web管理后台.微信端销售公众号,那么我们分成四个项目,pc端站点,微 ...
随机推荐
- L - Ray in the tube Gym - 101911L (暴力)
---恢复内容开始--- You are given a tube which is reflective inside represented as two non-coinciding, but ...
- POJ-1679 The Unique MST (判断最小生成树的唯一性)
<题目链接> 题目大意: 给定一张无向图,判断其最小生成树是否唯一. 解题分析: 对图中每条边,扫描其它边,如果存在相同权值的边,则标记该边:用kruskal求出MST. 如果MST中无标 ...
- react那些事儿
一.参考链接https://reactjs.org/http://react-china.org/https://doc.react-china.org/https://hulufei.gitbook ...
- Centos6.5部署Rsyslog+LogAnalyzer中文乱码解决
中文乱码 [root@log include]# pwd /zhang/app/loganalyzer-/src/include [root@log include]# vim functions_c ...
- js中使用将json数组 转换为json将一个包含对象的数组用以创建一个包含新重新格式化对象的新数组
1.使用reduce: let arr = [{ "code": "badge", "priceList": [{ "amount ...
- 工程管理之makefile与自动创建makefile文件过程
(风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自动编译和链接使用的环境 想知道到Linux Makefile系统的 ...
- 编程菜鸟的日记-初学尝试编程-编写函数实现strlen功能(总结考察点)
//考察点1:输入参数加const int Mystrlen(const char *str) {//考察点2:断言字符串非0 assert(str!=NULL); int len=0;//考察点3: ...
- 登录页面加密token和盐的作用
盐: 可以说盐是作用于注册,盐就是将用户输入的原始密码,加密后存进数据库,然后把盐(实际上是随机字符串)也存进数据库 Map<String, String> map = new HashM ...
- Django REST framework API开发
RESTful设计方法 1. 域名 应该尽量将API部署在专用域名之下. https://api.example.com 如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下. https:/ ...
- IO流(4)—字符流
1.IO体系: 抽象基类 --节点流(文件流) InputStream -- FileInputStream OutputStream --FileOutputSteam Reader --FileR ...