Dubbo简介
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo简介相关的知识,希望对你有一定的参考价值。
一. 背景
当我们提供的服务越来越复杂的时候,单一架构和垂直架构是无法应对的。我们需要使用分布式服务架构或流动计算架构来进行处理,所以我们需要对应的治理系统来确保分布式服务架构或流动计算架构有条不紊的运行。接下来介绍四种演化架构
1. 单一应用架构
在此架构中,只有一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键,那什么是ORM呢?
ORM: Object Relastional Mapping,对象关系映射,一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。但这种架构有明显的 缺点 ,一旦出现业务需求的变更,就必须修改持久化层的接口。持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,都要修改持久化层的相关程序代码,增加了软件的维护难度
2. 垂直应用架构
当访问量逐渐增大,单一应用增加机器带来收益越来越小,于是我们将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键
MVC: 是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。
V 即View视图是指用户看到并与之交互的界面
M 即model模型是指模型表示业务规则
C 即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理
用户首先在界面中进行人机交互,然后请求发送到控制器,控制器根据请求类型和请求的指令发送到相应的模型,模型可以与数据库进行交互,进行增删改查操作,完成之后,根据业务的逻辑选择相应的视图进行显示,此时用户获得此次交互的反馈信息,用户可以进行下一步交互,如此循环。
MVC举例:
最典型的MVC就是jsp+servlet+javabean模式。
JavaBean作为模型,既可以作为数据模型来封装业务数据,又可以作为业务逻辑模型来包含应用的业务操作。其中,数据模型用来存储或传递业务数据,而业务逻辑模型接收到控制器传过来的模型更新请求后,执行特定的业务逻辑处理,然后返回相应的执行结果。
JSP作为表现层,负责提供页面为用户展示数据,提供相应的表单(Form)来用于用户的请求,并在适当的时候(点击按钮)向控制器发出请求来请求模型进行更新。
Serlvet作为控制器,用来接收用户提交的请求,然后获取请求中的数据,将之转换为业务模型需要的数据模型,然后调用业务模型相应的业务方法进行更新,同时根据业务执行结果来选择要返回的视图。
3. 分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键,而Dubbo就是这样一个分布式服务框架。
RPC: Remote procedure call,远程过程调用。在一台主机上各进程之间的通信可以是share memory 信号量等,而进程之间的通信被称之为IPC(inter-process communication)。而RPC是在不同主机上实现进程间的通信。而不同主机并不共用物理地址空间,所以我们需要一个框架提供此功能,使得我们调用不同主机上的服务就像在本地调用一样。
RPC 框架: RMI,CORBA,ONC RPC,Dubbo,Hessian等
4. 流动计算架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
二. Dubbo是什么
Dubbo是alibaba的一款开源软件,它是基于java的RPC调用框架。
Dubbo主要提供了三种功能:
- 提供了基于接口的远程调用接口
- 容错性和负载均衡
- 服务自动注册及发现
当我们在编写java代码时会调用Dubbo的接口进行编程。并通过配置文件说明通信协议,注册中心,容错方式等
三. Dubbo架构
(来自: http://dubbo.io/images/dubbo-architecture.png)
节点 | 说明 |
---|---|
Text | Text |
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
调用关系说明
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
四. Dubbo配置文件说明
1. <dubbo:service/>
用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。服务暴露出去后,可被订阅的服务调用。下面为重要参数介绍
- interface:必填。服务接口名,实际就是一个java类的完整路径,例如:com.test.rpc.api.user.service.DubboUserService。订阅者调用此暴露的服务实际就是调用此类就有的功能(在java中实际即使此类具有的方法)
- ref:必填。服务对象实现引用,暂不太清楚。
详细属性说明:http://dubbo.io/books/dubbo-user-book/references/xml/dubbo-service.html
2. <dubbo:reference/>
用于创建一个远程服务代理,一个引用可以指向多个注册中心。用于指明要订阅的服务。
- id:必填。服务引用BeanId
- interface:必填。服务接口名
- timeout:服务方法调用超时时间(毫秒)
- retries:远程服务调用重试次数,不包括第一次调用,不需要重试请设为0
- check:缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true"。可以通过 check="false" 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
- loadbalance:负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用
详细属性说明:http://dubbo.io/books/dubbo-user-book/references/xml/dubbo-reference.html
3. <dubbo:protocol/>
用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。指明消费者消费时使用的通行协议,Dubbo支持的有http,dubbo,redis,memcache,rmi等也可以自行扩展,缺省是dubbo
- name : 协议名称,缺省是dubbo
- port:服务端口,dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80;如果配置为-1 或者 没有配置port,则会分配一个没有被占用的端口。Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控。
4. <dubbo:registry/>
用于配置连接注册中心相关信息,dubbo支持的有多播,单播,redis,或使用Zookeeper。官方推荐使用Zookeeper
- address:必填,注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port,不同集群的注册中心,请配置多个<dubbo:registry>标签
5. <dubbo:monitor/>
用于配置连接监控中心相关信息,可选
参考资料
Dubbo官方文档: http://dubbo.io/books/dubbo-user-book-en/
RPC解释: https://en.wikipedia.org/wiki/Remote_procedure_call
下一篇会介绍以Zookeeper为注册中心的Dubbo示例
以上是关于Dubbo简介的主要内容,如果未能解决你的问题,请参考以下文章