Dubbo分布式服务治理框架(基础入门篇)

一、定义

Dubbo是阿里巴巴公司开发的一款高性能,透明化的提供PRC远程服务调用方案和SOA服务治理方案的分布式服务框架。

二、三大核心部分

  1. Remoting: 网络通信框架,实现了 sync-over-async 和request-response 消息机制。
  2. RPC: 一个远程过程调用的抽象,支持本地负载均衡、容灾和集群功能。
  3. Registry: 服务目录框架用于服务的注册和服务事件发布和订阅(集成的zookeeper,引用了zkClient.jar)。

三、产生背景

随着系统逐渐庞大,服务间需要拆分;随着服务越来越多,结构越来越复杂,配置管理变得复杂,我们需要注册中心;系统变得更加庞大,高到低的依赖要松耦合;用户访问量变得很大,为了减轻服务器压力,我们在分布式基础上加集群和负载均衡功能。此时阿里巴巴公司就研发了分布式服务治理框架Dubbo。

四、注册中心

常用的是zookeeper,Eureka。redis、multicast和simple不常用。

五、原理

  1. 注册(生产者)
  • 生产者配置好(provider.xml)要暴露的接口后,启动生产者服务时,服务信息会自动注册到注册中心(zookeeper)。
  • 服务接口的class文件在项目中的完整路径(com.longge.public.member.service.api.IMemberService)存为持久化节点,该class访问的实际dubbo协议路径存为上一节点子节点的临时节点。如果是做服务集群就会在同一持久节点下存多个临时节点,临时节点的集合就是服务集群访问的真实路径。
  1. 订阅(消费者)
    消费者配置好(consumer.xml)订阅的接口路径,并在web.xml中添加引用。
  2. 通知
    当生产者注册的服务改变(如:down机、新增一台集群服务、接口地址修改),zk会做定时检查,如有变化会利用事件通知方式通知消费者。
  3. 调用
    消费者利用rpc技术对获取到的真实接口路径进行远程调用。
  4. 监控
    在这里插入图片描述

六、本地负载均衡

负载均衡有软、硬负载均衡之分,软负载均衡即软件负载均衡,例如:Nginx。硬件负载均衡价格昂贵。
Dubbo采用本地负载均衡,属于软负载,本地负载均衡从注册中心获取信息列表缓存在JVM中,然后再用RPC远程调用技术访问,更容易实现实时刷新数据。本地负载均衡要比再去访问Nginx服务器做负载均衡效率更高。

七、zookeeper注册中心和Dubbo负载均衡原理:

1.客户端生产者启动服务,创建zkClient,将服务接口注册到zk节点:接口项目路径,例如:com.dubbo.public.service.api.IMemberService作为持久化节点被保存(由于项目结构变化可能性小所以作为持久化节点);dubbo协议的真实访问地址作为其子节点临时节点保存(访问地址经常有增减,所以被保存为临时节点)。
2.客户端消费者启动服务,创建zkClient,根据Dubbo配置和web.xml配置对接口com.dubbo.public.service.api.IMemberService的引用,自动获取持久化节点,而后去除其子节点childrenNodeList,再遍历这个list,取出每个子节点中的value(即dubbo协议的访问地址)。
3.本地负载均衡轮询算法:如果服务接口做了集群,即此时临时子节点就会变为多个,那我消费者该访问哪台服务器下的服务接口呢?这时本地负载均衡登场,算法:调用次数%接口集群数量=index,其中index代表集群服务器下标,从0开始。
4.通知原理:即节点动态变化时,zk利用事件模块中的通知去告知订阅者节点的变化,自动刷新其订阅的childrenNodeList,即更新接口访问地址集合:

//第一个参数是父节点“com.dubbo.public.service.api.IMemberService”路径
zkClient.subcribeChildChange("/parentNode",new IZkChildListener(){

	//发现RabbitMQ也有类似的回调方法,利用事件通知来监听队列的变化,从而通知消费者。
	//第一个参数是父节点路径,第二个参数是回调给定的参数,是变化后的子节点集合
	public void handleChildChange(“/parentNode”,List<String> currentChilds){
	
		//自定义方法,获取子节点value(即真实访问地址),并更新接口访问地址。
		updateServiceApi(zkClient,currentChilds);
		
	}
	
}

八、一般dubbo项目的搭建:

1.创建Maven project项目com.dubbo.project,项目类型改为pom(简单解释一下:pom类型表示父项目其下一定建立了子项目,类似一个抽象的父类会被继承,同理在父项目中的pom.xml引入jar,其子项目都会继承。jar类型可以封装成一个被其他项目引用的jar包,war类型最后打包好直接在应用服务器运行的web项目),将子项目通用的jar引入。
2.在父项目中创建服务接口项目com.dubbo.public.service.api,项目类型为jar,并编写服务接口IMemberSerivce.java。
3.在父项目中创建接口实现项目com.dubbo.public.service.api.impl,项目类型为jar,在web.xml中添加暴露接口的引用,resource中添加dubbo-provider.xml的dubbo配置文件,编写实现类MemberSerivceImpl.java,和编写服务启动类ServiceMain.java,启动服务后解析dubbo配置文件自动注册接口到ZK注册中心。
4.在父项目中创建消费者项目(接口调用项目)com.dubbo.project.controller,项目类型为jar,在web.xml中添加暴露接口的引用,resource中添加dubbo-consumer.xml的dubbo配置文件,编写客户端服务启动类ClientMain.java和接口消费测试类TestController.java,启动服务即可订阅接口。

九、优点和缺点:

优点:

  1. 透明化远程调用:就像本地调用一样,只需要简单配置即可。
  2. 由于是默认dubbo协议,所以没有api入侵。因为dubbo协议过于小众。
  3. 内置本地负载均衡,有容错机制。
  4. 集成注册中心,简单配置,服务启动自动注册和订阅。
  5. 服务接口监控治理:host:port/dubbo-admin与host:post/dubbo-monitor提供了完善的接口管理和监控功能,针对不同应用的不同接口可以进行多版本,多协议(dubbo协议只是默认的),多注册中心管理(zk也可以做集群,也可以手动集成Eureka做注册中心)。

缺点: 只支持Java语言。

猜你喜欢

转载自blog.csdn.net/weixin_38473754/article/details/83030539