dobbu分布式服务

1 基本概念
Dubbo就是SOA服务治理方案的核心框架。用于分布式调用,其重点在于分布式的治理,致力于提供高性能和透明化的RPC远程服务调用方案。核心包括:

  • 远程通讯:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型、序列化、"请求-响应"模式的信息交换方案
  • 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持、软负载均衡、失败容错、地址路由、动态配置等集群支持
  • 自动发现:基于注册中心目录服务,使服务消费方能动态地查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器

2 Dubbo能做什么

  • 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需要简单配置,没有任何API侵入
  • 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本、减少多拿点
  • 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者

3 Dubbo架构图
在这里插入图片描述
注:无论SOA,还是分布式服务框架,不是服务消费者从中间件(一般都是Zookeeper)上去拿数据,而是服务消费者从中间件上拿到可用的服务生产者的集群地址,再从集群地址中选出一个进行直连

节点介绍:

  • Provider:暴露服务的服务提供方,或者直白点说就是服务生产者
  • Consumer:调用远程服务的服务消费方,也就是服务消费者
  • Registry:服务注册与发现的注册中心
  • Monitor:统计服务的调用次数和调用时间的监控中心
  • Container:服务(生产者)运行容器

步骤说明:

  • 0:服务容器负责启动、加载、运行服务提供者(生产者)
  • 1:服务提供者(生产者)在启动时,向注册中心注册自己提供的服务
  • 2:服务消费者在启动时,向注册中心订阅自己所需的服务
  • 3:注册中心返回服务提供者地址列表给消费者,如果有变更,注册中细腻将基于长连接推送变更数据给消费者
  • 4:服务消费者从服务生产者地址列表中,基于软负载均衡算法,选择一台提供者(生产者)进行调用,如果调用失败,再选另一台调用
  • 5:服务消费者和提供者(生产者),在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

4 Dobbu原理
4.1 解析服务:
- 基于dubbo.jar内的Meta-inf/spring.handlers配置,spring在遇到dubbo名称空间时,会回调DubboNamespaceHandler类。
- 用DubboBeanDefinitionParser,基于一对一属性映射,将dubbo标签的XML标签解析为Bean对象。
- 在ServiceConfig.export 或者ReferenceConfig.get初始化时,将Bean对象转会为url格式,将所以Bean属性转成url的参数。
- 然后将URL传给Protocol扩展点,基于扩展点的Adaptive机制,根据URL的协议头,进行不同协议的服务暴露和引用。
4.2 暴露服务(向注册中心暴露)
- ServiceConfig解析出的url格式为:egistry://registry-host/com.alibaba.dubbo.registry.RegistryService? export=URL.encode(“dubbo://service-host/com.xxx.TxxService?version=1.0.0”)。
- 基于扩展点的Adaptive机制,通过URL的“registry://”协议头识别,调用RegistryProtocol的export方法,将export参数中的提供者URL先注册到注册中心,再重新传给Protocol扩展点进行暴露:Dubbo://service-host/com.xxx.TxxService?version=1.0.0
4.3 引用服务(注册中心引用)
- ReferenceConfig解析出的URL的格式为:registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(“consumer://consumer-host/com.foo.FooService?version=1.0.0”)
- 基于扩展点的Apaptive机制,通过URL的“registry://”协议头识别,就会调用RegistryProtocol的refer方法,基于refer参数总的条件,查询提供者URL,如:Dubbo://service-host/com.xxx.TxxService?version=1.0.0
- 基于扩展点Adaptive机制,通过提供者URL的“dubbo://”协议头识别,就会调用DubboProtocol的refer()方法,得到提供者引用
- 然后RegistryProtocol将多个提供者引用,通过Cluster扩展点,伪装成单个提供这引用返回。

5 dobbu用法
5.1 首先要定义服务生产者的接口及其实现

	```
	package com.xrq.dubbo.demo;
	
	public interface DemoService
	{
	    String sayHello(String name);    
	}
	```
	
	```
	package com.xrq.dubbo.demo.provider;
	
	import com.xrq.dubbo.demo.DemoService;
	
	public class DemoServiceImpl implements DemoService
	{
	    public String sayHello(String name)
	    {
	        return "Hello " + name;
	    }
	}
	```

5.2 写一个provider.xml,在服务生产者使用Spring暴露服务:

	```
	<?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="hello-world-app"  />
	 
	    <!-- 使用multicast广播注册中心暴露服务地址 -->
	    <dubbo:registry address="multicast://224.5.6.7:1234" />
	 
	    <!-- 用dubbo协议在20880端口暴露服务 -->
	    <dubbo:protocol name="dubbo" port="20880" />
	 
	    <!-- 声明需要暴露的服务接口 -->
	    <dubbo:service interface="com.xrq.dubbo.demo.DemoService" ref="demoService" />
	 
	    <!-- 和本地bean一样实现服务 -->
	    <bean id="demoService" class="com.xrq.dubbo.demo.provider.DemoServiceImpl" />
	 
	</beans>
	```

5.3 在服务消费者处写一个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-of-helloworld-app"  />
 
    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
    <dubbo:registry address="multicast://224.5.6.7:1234" />
 
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
 
</beans>

5.4 服务消费者处只要通过Spring拿到demoService,即可像使用本地接口一样使用DemoService这个接口里面的方法:

import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xrq.dubbo.demo.DemoService;
 
public class Consumer 
{
    public static void main(String[] args) throws Exception    
    {
        ClassPathXmlApplicationContext context = 
            new ClassPathXmlApplicationContext(new String[] {"http://aaa.bbb.ccc:dddd/eee/fff/consumer.xml"});
        context.start();
 
        DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理
        String hello = demoService.sayHello("world"); // 执行远程方法
 
        System.out.println(hello); // 显示调用结果
    }
}

6 dobbu协议
6.1 Dubbo协议Dubbo的缺省协议,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。
- 连接个数:单连接
- 连接方式:长连接
- 传输协议:TCP
- 传输方式:NIO异步传输
- 序列化:Hessian二进制序列化
- 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要使用dubbo协议传输大文件或超大字符串
- 使用场景:常规远程服务方法调用

6.2 使用范围:适合小数据量大并发的服务调用,以及消费者机器远大于生产者机器数的情况,不适合传输大数据量的服务比如文件、视频等,除非请求量很低。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值