Dubbo学习(一)——分布式服务治理框架基础概念及工作原理

一、Dubbo简介

1.1、什么是Dubbo

(1)是一款分布式服务框架

(2)也是高性能和透明化的RPC远程服务调用框架

(3)支持SOA服务治理方案

1.2、涉及Dubbo面试官的心思一般是:

第一步:思考性问题、原理——MQ、ES、Redis、SpringCloud(Dubbo)、....

第二步:实际开发中遇到的问题,你是怎么解决的,上述技术有在项目中用到吗?

第三步:综合的,系统设计,,比如让你设计一个 MQ、设计一个搜索引擎、设计一个缓存、设计一个 rpc 框架,你怎么设计

参考博客:https://blog.csdn.net/u013076044/category_9275930.html

国内SpringCloud架构热火朝天,但是阿里系架构推崇的Dubbo目前仍是市面公司的主流技术,有必要了解下

Dubbo就是一个分布式服务治理框架:

       传统RPC远程调用缺点是缺少服务治理,当服务比较多时URL地址管理起来混乱,Dubbo可解决服务治理问题,核心技术是通过注册中心(服务治理思想和SpringCloud的类似),Dubbo底层框架基于Netty实现。

传统架构—>分布式架构—>SOA架构(SOA基于分布式架构,Dubbo产生于SOA架构)—>微服务架构

SpringCloud和Dubbo区别与相关:他们都属于RPC远程调用框架,但是SpringCloud更强大,某种程度可以说Dubbo是它一个子集

服务治理核心:管理服务于服务之间依赖关系,能够实现远程调用、负载均衡、容错、注册发现等

1.3、Dubbo能解决什么问题

(1)RPC远程调用:例如服务URL地址(http://、rmi、tcp)管理起来复杂(就是服务治理,管理比较复杂)

(2)依赖关系复杂,每个服务还需要监控,Dubbo可以用Watch监控

(3)内部可以帮实现负载均衡,可以完全替代Nginx

(4)可以做容错机制

(5)可以做服务注册于发现,结合ZK

(6)有扩容机制

(7)服务降级限流,Dubbo也可以做

二、Dubbo 工作原理

2.1、工作流程:

  • 第一步:provider(生产者) 向注册中心去注册
  • 第二步:consumer (消费者)从注册中心订阅服务,注册中心会通知 consumer 注册好的服务
  • 第三步:consumer 调用 provider
  • 第四步:consumer 和 provider 都异步通知监控中心

2.2、角色区分(4个角色):

(1)Provider:暴露服务的服务提供方(生产者)

(2)Consumer:远程调用的服务消费放(消费者)

(3)Registry:服务注册与发现的注册中心

(4)Monitor:统计服务的调用次数和调用时间的监控中心

2.3、详细调用流程:

(1)服务容器负责启动、加载,运行服务提供者

(2)服务提供者(provider)在启动时,向注册中心注册自己提供的服务

(3)服务消费者(consumer )在启动时,向注册中心订阅自己所需的服务

(4)注册中心(Registry)返回服务提供者地址列表给消费者,如果有变更注册中心将基于长连接推送变更数据给消费者

(5)服务消费者从提供者地址列表中,基于负载均衡算法 ,选一台提供者进行调用,如果调用失败再选另一台

(6)服务消费者和提供者,在内存中累计调用次数和调用时间,定时,每分钟发送一次统计数据到检测中心(Monitor)

2.4、原理图

Dubbo学习(一)——分布式服务治理框架基础概念及工作原理_第1张图片

 2.5、调用原理

注意:

(1)容器就是存放Dubbo服务信息(类似Ioc容器)

Dubbo学习(一)——分布式服务治理框架基础概念及工作原理_第2张图片

三、结构

3.1、项目分层结构(10层):

  • 第一层:service 层,接口层,给服务提供者和消费者来实现的
  • 第二层:config 层,配置层,主要是对 dubbo 进行各种配置的
  • 第三层:proxy 层,服务代理层,无论是 consumer 还是 provider,dubbo 都会给你生成代理,代理之间进行网络通信
  • 第四层:registry 层,服务注册层,负责服务的注册与发现
  • 第五层:cluster 层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
  • 第六层:monitor 层,监控层,对 rpc 接口的调用次数和调用时间进行监控
  • 第七层:protocal 层,远程调用层,封装 rpc 调用
  • 第八层:exchange 层,信息交换层,封装请求响应模式,同步转异步
  • 第九层:transport 层,网络传输层,抽象 mina 和 netty 为统一接口
  • 第十层:serialize 层,数据序列化层

3.2、Dubbo支持的协议

支持的通信协议:

(1)dubbo协议:默认走dubbo协议,单一长连接,进行的是NIO异步通信,基于hessian作为序列化协议。使用的场景是:传输数据量小但是并发量高。

长连接:就是建立连接过后可以持续发送请求,无需再建立连接

短链接:每次发送一次请求前都需要重新建立一次连接

(2)rmi协议:走java二进制序列化,多个短链接。适用于提供者数量比消费者数量还多的情况,用于文件传输

(3)hesian协议:走hessian序列化协议,多个短链接,适用于提供者数量比消费者数量还多的情况,用于文件传输

(4)http协议:走json序列化

(5)webservice协议:走SOAP文本序列化

支持的序列化协议:

dubbo支持hession、java二进制序列化;json、SOAP文本序列化,但是hessian是默认序列化协议

什么是序列化:把数据结构或一些对象转换为二进制的过程

什么是反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

 

四、项目实战

4.1、案例:会员服务提供查询用户接口信息,暴露给订单系统;调用会员服务接口查询用户信息

三个服务员:

(1)会员服务 提供接口(注意:这个接口是没有实现的)

public interface UserService {
    // 使用用户userID 查询 用户信息
    public String getUser(Long id);

}

(2)生产者服务

public class UserServiceImpl   implements UserService{

    public String getUser(Long id) {
        System.out.println("会员服务 接受订单服务####getUser() id:"+id);
          if(id==1){
              return "程瑞瑞";
          }
          if(id==2){
              return "林婷婷";
          }
        return "未找到...";
    }

}

provide.xml配置文件

dubbo:application name="provider" />  说明:注册到注册中心的名称叫provider

-------这个时候如果服务调用《会员服务接口》,就会默认通过动态代理去调用具体实现----《生产者服务》




	
	 -
	
	
	
	
	
	
	
	

(3)消费者服务(去发布服务)

public class OrderService {

	public static void main(String[] args) {
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
		applicationContext.start();
		System.out.println("订单服务启动成功..");
		UserService userService = (UserService) applicationContext.getBean("userService");
		System.out.println("订单服务调用会员服务开始...");
		String result = userService.getUser(1l);
		System.out.println("订单服务调用会员服务结束...result:"+result);
	}

}

consumer.xml文件:



	
	
	
	
	
	


 

你可能感兴趣的:(Dubbo)