博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dubbo 分布式服务框架简介
阅读量:6413 次
发布时间:2019-06-23

本文共 3937 字,大约阅读时间需要 13 分钟。

1、分布式服务框架

1.1 Dubbo 简介

  • Dubbo 是一个分布式服务框架,以及阿里巴巴内部的 SOA 服务化治理方案的核心框架。其功能主要包括:高性能 NIO 通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。

  • 说通俗点,就是首先将程序组件化成一个个相对独立的服务,然后就可以对服务进行分布式;而且,它有注册中心通过监听,实时发现着新服务,并部署,还可以推送给客户端;它还集成了负载均衡的解决方案,利用随机算法来将各个服务科学地分配到多台服务器上;当然,它也集成了容错机制,来提高集群的稳定性。

  • 官网首页:
  • 官方用户指南:
  • 官方开发指南:

  • 当当网的扩展版本 dubbox :
  • 京东的扩展版本 jd-hydra:

1.2 SOA 简介

  • SOA(Service Oriented Architecture):面向服务的架构。由服务治理、服务注册和发现、RPC、监控中心、调度中心以及服务路由、负载均衡等功能模块组成的资源调度和治理中心。

1.3 RPC 简介

  • RPC 是指远程过程调用,也就是说两台服务 A,B,一个应用部署在 A 服务器上,想要调用 B 服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

  • RPC 演进

    993906-20180827104348294-1089343841.jpg

  • 框架演进:ORM –> MVC –> RPC –> SOA

  • 架构演进:单一应用架构 –> 垂直应用架构 —> 分布式服务架构 –> 流动计算架构

    • 单一应用架构:网站流量小的时候,将所有功能集中到单一应用以减少成本。
    • 垂直应用架构:网站流量增大,横向扩展带来的效益越来越低,将应用拆分为互不相干的几个应用以提升效率。
    • 分布式服务架构:当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
    • 弹性计算架构:当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

2、Dubbo 架构简介

  • Dubbo 架构图

    993906-20180827104401271-1940832091.jpg

  • 节点角色

    • 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.javapackage com.alibaba.dubbo.demo;public interface DemoService {    String sayHello(String name);}
    • 打包成 Jar 包在服务提供方和消费者处使用,该工程里除了接口定义以外,还有各种实体类和通用工具类
  • 2)实现服务接口

    // DemoServiceImpl.javapackage 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方式
    • 注解方式
    // FooServiceImpl.javaimport com.alibaba.dubbo.config.annotation.Service;@Service(version="1.0.0")public class FooServiceImpl implements FooService {}
    // provider.xml
  • 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
    • 注解方式
    @Componentpublic 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 );                  // 显示调用结果}

转载于:https://www.cnblogs.com/QianChia/p/9540816.html

你可能感兴趣的文章
怎么判断冠词用a还是an_葡语干货 | 葡萄牙语冠词用法整理大全
查看>>
js传参不是数字_JS的Reflect学习和应用
查看>>
三个不等_数学一轮复习05,从函数观点看方程与不等式,记住口诀与联系
查看>>
卡尺测量的最小范围_汽车维修工具-测量用具
查看>>
网优5g前景_5G网络优化师前景怎么样?
查看>>
竞态条件的赋值_[译] part25: golang Mutex互斥锁
查看>>
delmatch oracle_完美完全卸载(清除)oracle数据库的方式(方法)
查看>>
pyqt 滚动条 美化_Pyqt5 关于流式布局和滚动条的综合使用示例代码
查看>>
51单机片 编译hex_单片机爬坑记-05-编译环境(完)
查看>>
java 正则表达式 img_Java正则表达式获得html字符串里的<img src=""/> 中的url列表
查看>>
java 文件crc校验_一个获取文件crc32校验码的简洁的java类 | 学步园
查看>>
java flatmapfunction_Java8 Stream flatmap中间操作用法解析
查看>>
java rmi spring 4.0_Java Spring RMI一些尝试
查看>>
JAVA怎么连接华为的HDFS系统_JAVA-API操作HDFS文件系统(HDFS核心类FileSystem的使用)...
查看>>
java牛客网四则运算_数据库刷题—牛客网(51-61)
查看>>
Java get set6_JDK6的新特性(转)
查看>>
java发送邮件 不登陆_Java邮件到Exchange Server“不支持登录方法”
查看>>
编程学习初体验(5. 如何自学编程)(2)
查看>>
思科ISR G1与ISR G1C的区别
查看>>
利用perl提取web配置文件中的域名对应的路径
查看>>