首頁 > 軟體

Quarkus整合Dubbo服務Rpc遠端通訊框架整合

2022-02-22 16:00:36

前言

dubbo是一個流行的使用廣泛的服務治理型RPC框架,博主所在公司,大量服務都是使用dubbo來暴露和呼叫的,如果想要使用quarkus替換spring boot來做業務系統,肯定要在quarkus中解決dubbo整合的問題。好在dubbo的設計比較優良,除了提供在spring環境下的自動裝備載入,還可以通過手動程式設計的方式整合dubbo。不過,如果確定使用quarkus作為主要的開發框架的話,最終的目標應該是將服務直接註冊到k8s的service中,就不需要dubbo或者grpc這種遠端通訊框架了。

引入dubbo依賴

<dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.7</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-context-support</artifactId>
                    <groupId>com.alibaba.spring</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-aop</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-expression</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.1.3</version>
        </dependency>

這裡引入了dubbo的依賴和nacos註冊中心的依賴,注意可以排除spring的那些依賴,在quarkus環境中,spring的包一點用都沒有,只會增加應用的體積

定義介面和實現

public interface TestService {
    String hello(String name);
}
@Singleton
@Startup
class TestServiceImpl implements TestService {
    @Override
    public String hello(String name) {
        System.err.println(Thread.currentThread().getName());
        return "hello " + name;
    }
}

熟悉dubbo的使用者肯定清楚,一般情況下,我們會新增一個專案模組,專門用來定義api介面,這個模組單獨打jar包,方便給其他的專案引入,這裡為了演示方便,所以我將api介面和具體實現都寫在一個檔案裡了。

定義接收dubbo的設定

@ConfigProperties(prefix = "quarkus.dubbo")
public class DubboProperties {
    private String name;
    private String registrAddress;
    private Protocol protocol;
    public static class Protocol {
        private Integer port;
        private String name = "dubbo";
    }
}

這個類用來對映application.properties中的dubbo設定,這裡只定義了基本的設定屬性,其他都可以使用預設值,更多的設定屬性看需求可以在這裡新增,上面的程式碼為了博文的篇幅考慮簡化了get和set程式碼。定義好後,可以在組態檔中新增如下設定:

quarkus.dubbo.name = kl
quarkus.dubbo.registr-address = nacos://nacos-xxx.com:80
quarkus.dubbo.protocol.name = dubbo
quarkus.dubbo.protocol.port  = 20330

應用啟動時,建立DubboProperties範例,並將組態檔中的相關設定設定到對應的屬性中,在需要的地方可以通過建構函式或者@Inject註解自動注入

dubbo元件設定

@Dependent
@Startup
public class DubboConfig {
    private final DubboProperties dubboProperties;
    public DubboConfig(DubboProperties dubboProperties) {
        this.dubboProperties = dubboProperties;
    }
    @Produces
    private ApplicationConfig applicationConfig(){
        ApplicationConfig config = new ApplicationConfig();
        config.setName(dubboProperties.getName());
        return config;
    }
    @Produces
    private RegistryConfig registryConfig(){
        RegistryConfig config = new RegistryConfig();
        config.setAddress(dubboProperties.getRegistrAddress());
        return config;
    }
    @Produces
    private ProtocolConfig protocolConfig(){
        ProtocolConfig protocol = new ProtocolConfig();
        protocol.setName(dubboProperties.getProtocol().getName());
        protocol.setPort(dubboProperties.getProtocol().getPort());
        return protocol;
    }
}

這裡通過建構函式注入的方式,參照了前面定義的dubbo設定範例,通過設定,可以範例化出ApplicationConfig、RegistryConfig、ProtocolConfig等範例,這裡建立範例時,只設定了最基本的dubbo屬性,更多的屬性設定擴充套件可以在這個地方修改。這裡的三個範例是保留dubbo服務和引入dubbo服務不可或缺的三個重要元件,具體的用法繼續往下看

 dubbo提供者設定

@Dependent
@Startup
public class DubboProviderConfig {
    @Inject
    ApplicationConfig applicationConfig;
    @Inject
    RegistryConfig registryConfig;
    @Inject
    ProtocolConfig protocolConfig;
    @Inject
    TestService testService;
    @PostConstruct
    public void init() {
        Map<Class, Object> beans = new HashMap<>(6);
        beans.put(TestService.class, testService);
        beans.forEach(this::registerDubboService);
    }
    private void registerDubboService(Class clz, Object obj) {
        ServiceConfig<Object> service = new ServiceConfig<>();
        service.setApplication(applicationConfig);
        service.setRegistry(registryConfig);
        service.setProtocol(protocolConfig);
        service.setInterface(clz);
        service.setRef(obj);
        service.setVersion("1.0.0");
        service.export();
    }
}

可以看到,上面定義的三個dubbo設定元件,都出現在了dubbo提供者設定裡,這三個元件是組成dubbo serviceConfig的一部分。因為沒有spring自動掃描dubbo註解獲取bean範例,所以在quarkus中,需要手動宣告和註冊dubbo服務,這裡通過@PostConstruct應用啟動後的建構函式來觸發dubbo的服務註冊暴露動作,然後把所有的需要暴露成dubbo服務的介面都統一放入map容器裡,然後迭代map完成dubbo服務暴露。

dubbo消費者設定

@Dependent
@Startup
public class DubboConsumerConfig {
    @Inject
    ApplicationConfig applicationConfig;
    @Inject
    RegistryConfig registryConfig;
    @Produces
    public DingSMSService testService1() {
        return this.referenceService(DingSMSService.class);
    }
    private <T> T referenceService(Class<T> clazz) {
        ReferenceConfig<Object> reference = new ReferenceConfig<>();
        reference.setApplication(applicationConfig);
        reference.setRegistry(registryConfig);
        reference.setInterface(clazz);
        reference.setVersion("1.0.0");
        return (T)reference.get();
    }
}

dubbo裡的消費者,就是引入遠端服務。首先需要在自己的專案中新增服務提供方的api依賴,然後通過ReferenceConfig設定,可以得到介面的代理實現,這裡,也需要用到應用設定和註冊中心的設定元件。最後通過@Produces註解,將api範例註冊到本地quarkus的bean上下文中,完成後就可以通過@Inject註解注入直接使用dubbo服務了,如:

@Path("/dingservice")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class TestResource {
    @Inject
    DingSMSService smsService;
    @GET
    public String send(@QueryParam("msg")String msg){
        smsService.sendDing("1330741xxxx",msg,"kl");
        return "傳送成功";
    }
}

結語

完成了quarkus和dubbo的整合後,博主看到了quarkus在這邊落地的希望,雖然最終的目標是面向容器程式設計,但是在全部遷移上容器的過程中,肯定還需要相容dubbo這種遠端通訊方式的,相比於spring中的dubbo使用,quarkus目前只能手動註冊服務和引入服務,博主嘗試過使用BeanManager來進一步的自動化釋出dubbo服務,但是沒能找像spring中getBean(Type)這類的方法。相信隨著對Quarkus和CDI的深入瞭解,這塊也會有突破,那個時候就可以像spring中那麼使用dubbo了

以上就是Quarkus整合Dubbo服務Rpc遠端通訊框架整合的詳細內容,更多關於Quarkus整合Dubbo服務Rpc遠端通訊框架的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com