1. 程式人生 > >Dubbox 基本特性之直接呼叫

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對直接呼叫的支援,也稍微說明了直接呼叫的使用場景,直接呼叫適用於開發除錯階段,方便程式的除錯,但是在線上環境,直接呼叫是不建議被採納的,因為如果服務提供者的地址修改之後,服務消費者需要修改程式碼,並且也不方便服務的管理,註冊中心的好處不必多說,如果直接呼叫,註冊中心不能對此服務進行管理,統計,稽核等,是不符合服務治理這個理念的。