Dubbo——基於API實現

基於API實現

Dubbo框架大部分場景都會在Spring中使用,但是不侷限於這種場景。除了XML和註解的方式,Dubbo框架還支持API的方式。雖然大部分場景不會直接使用API的方式暴露和消費服務,但是在某些場景下API非常有用。比如開發網關類的應用,需要動態消費不同版本的服務,通過API方式,可以根據前端請求參數構造不同版本的服務實例等。

接口:

public interface EchoService {

    String echo(String message);

}

基於API編寫服務器:
基於配置方式啓動Dubbo,框架內部必須做很多轉換,比如把標籤<dubbo:protocol ...>轉換成等價的配置對象,但這些轉換對業務方都是透明的,不管是XML配置還是註解方式,最終都會轉換成Java API對應的配置對象。

public class EchoServiceImpl implements EchoService {

    public String echo(String message) {
        String now = new SimpleDateFormat("HH:mm:ss").format(new Date());
        System.out.println("[" + now + "] Hello " + message
                + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
        return message;
    }
}
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import com.alibaba.dubbo.samples.echo.api.EchoService;
import com.alibaba.dubbo.samples.echo.impl.EchoServiceImpl;

import java.io.IOException;

public class EchoProvider {
    public static void main(String[] args) throws IOException {
        ServiceConfig<EchoService> service = new ServiceConfig<>();
        service.setApplication(new ApplicationConfig("java-echo-provider"));
        //創建註冊中心,並制定Zookeeper協議、IP和端口
        service.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
        //指定服務暴露的接口
        service.setInterface(EchoService.class);
        //指定真實服務對象
        service.setRef(new EchoServiceImpl());
        //暴露服務
        service.export();
        System.out.println("java-echo-provider is running.");
        System.in.read();
    }
}

注意:當服務提供者退出並正常停機(排除強制“殺掉”進程)時,Dubbo框架會進行優雅停機處理,在規定超時時間內,服務端會等待線程池隊列執行完畢並斷開遠程客戶端連接。

基於API編寫客戶端:

採用Java API是最靈活的方式,可以與第三方框架繼承,特別適合動態消費場景。在Bubbo框架中典型的使用場景就是泛化調用,可以指定一個本地不存在的接口發起RPC調用。

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.samples.echo.api.EchoService;

public class EchoConsumer {
    public static void main(String[] args) {
        ReferenceConfig<EchoService> reference = new ReferenceConfig<>();
        // #1 設置消費方應用名稱
        reference.setApplication(new ApplicationConfig("java-echo-consumer"));
        // #2 設置註冊中心地址和協議
        reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
        // #3 指定要消費的服務接口
        reference.setInterface(EchoService.class);
        // #4 創建遠程連接並做動態代理轉換
        EchoService greetingsService = reference.get();
        String message = greetingsService.echo("Hello world!");
        System.out.println(message);
    }
}

測試:

啓動Zookeeper,服務端和客戶端,客戶單打印:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章