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、原理图

 2.5、调用原理

注意:

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

三、结构

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

<dubbo:registry  说明:ZK地址

<dubbo:protocol  说明:Dubbo协议端口号

<dubbo:service    说明:要发布的服务的接口,比如这里就是《会员服务接口》

<bean id="userService"   说明:要发布接口的具体实现,比如这里就是《生产者服务》

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

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans.xsd           http://code.alibabatech.com/schema/dubbo           http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">

	<!-- 提供方应用信息,用于计算依赖关系 -->
	<dubbo:application name="provider" /> -
	<!-- 使用zookeeper注册中心暴露服务地址 -->
	<dubbo:registry address="zookeeper://127.0.0.1:2181" />
	<!-- 用dubbo协议在29014端口暴露服务 -->
	<dubbo:protocol name="dubbo" port="29014" />
	<!-- 声明需要暴露的服务接口 -->
	<dubbo:service interface="com.itmayiedu.member.service.UserService"
		ref="userService" />
	<!-- 具体的实现bean -->
	<bean id="userService" class="com.itmayiedu.member.service.impl.UserServiceImpl" />
</beans>

(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文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
	<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
	<dubbo:application name="consumer" />
	<!-- 使用multicast广播注册中心暴露发现服务地址 -->
	<dubbo:registry protocol="zookeeper" address="zookeeper://127.0.0.1:2181" />
	<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
	<dubbo:reference id="userService"
		interface="com.itmayiedu.member.service.UserService" />
</beans>


 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值