Dubbox 基本特性之直接调用

Dubbo的原作者梁飞说过,其实对于远程调用RPC来说,远程调用的大白话理解就是服务消费者直接通过网络IO传递参数,传递方法名,服务提供者获取到参数,方法名之后通过反射来调用本地的方法,执行完本地的方法之后,将结果再通过网络传递给调用方,这个过程就是RPC最最简单也是最最精髓的实现,关于注册中心,其实是服务治理的模块,注册中心方便服务的管理,发现,统计等等好处,注册中心把服务提供者的地址发送给服务消费者,服务消费者拿着服务提供者的地址,就可以完成服务消费了。

  言归正传,如果服务消费者获取到服务提供者的地址就可以跳过注册中心,完成服务消费者直接调用服务提供者了,完成直连调用的功能。

  直接调用这样的功能,其实很实用,在开发环境中,场景是程序猿A机器本地启一个Tomcat提供一个服务,程序猿B机器获取到程序猿B的机器IP和暴露的服务的端口号,直接调用,这样可以方便调试,因为走正常的注册中心,可能程序猿C也是服务提供者,它也启动了Tomcat,注册中心根据负载均衡的算法,把请求发送给程序猿C,那么就是悲剧了,不利于开发环境的联调,所以直接调用还是有它的使用场景的


3.4.1 Dubbo直接调用实现的Demo

 

  Dubbo作为RPC的始祖,它肯定是支持直接调用的,而且配置相当简单,服务提供者不用做任何修改,我们可以使用第一章的IDemoService那个helloworld的版本的作为服务提供者,只需要简单修改一下服务消费者的spring的配置文件就可以了spring-dubbo-consumer-direct.xml

<?xml version="1.1" 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 owner="lyncc" name="bazinga-consumer" />
    
    <dubbo:reference id="demoService" interface="org.bazinga.service.IDemoService" url="dubbo://localhost:20880/"/> 
    
</beans>

我们可以清晰地看清楚配置文件的改变,多了一个URL,

这个配置文件的关注点有2点,第一点,去掉了常用的<dubbo:registry protocol="zookeeper"address="127.0.0.1:2181"/> 这样的registry的注册节点,说明直接是不需要注册中心的支持的,第二点就是在<dubbo:reference>中加了url的配置,这个url指的就是服务提供的地址和端口号,这是必须的,否则又没有注册中心的支持,如何支持服务提供的地址呢?

  然后就是在代码的调用上,不管是使用注册中心服务的发现还是直连来说,对于调用还是很透明的,与普通的调用方式是一样的

package org.bazinga.service.test;

import org.bazinga.service.IDemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DubboConsumerDirectInvokeService {
	
	public static void main(String[] args) throws InterruptedException {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				"spring-dubbo-consumer-direct.xml");
		context.start();
		IDemoService demoService = (IDemoService)context.getBean("demoService");
		System.out.println(demoService.sayHello());
		Thread.sleep(2000000l);
	}

}

启动测试服务类DubboxProviderDemoService.java,然后再启动DubboConsumerDirectInvokeService.java,发现服务消费者能正常消费


我们再看一眼监控中心的控制台,显示没有消费者,这就说明我们没有通过注册中心发现服务,而是通过直接调用的方式,完成远程调用的:


3.4.2 本章小结

 

  本章主要说明了在RPC框架Dubbo对直接调用的支持,也稍微说明了直接调用的使用场景,直接调用适用于开发调试阶段,方便程序的调试,但是在线上环境,直接调用是不建议被采纳的,因为如果服务提供者的地址修改之后,服务消费者需要修改代码,并且也不方便服务的管理,注册中心的好处不必多说,如果直接调用,注册中心不能对此服务进行管理,统计,审核等,是不符合服务治理这个理念的。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值