Quarkus集成Dubbo服務(wù)Rpc遠程通訊框架整合
前言
dubbo是一個流行的使用廣泛的服務(wù)治理型RPC框架,博主所在公司,大量服務(wù)都是使用dubbo來暴露和調(diào)用的,如果想要使用quarkus替換spring boot來做業(yè)務(wù)系統(tǒng),肯定要在quarkus中解決dubbo集成的問題。好在dubbo的設(shè)計比較優(yōu)良,除了提供在spring環(huán)境下的自動裝備加載,還可以通過手動編程的方式集成dubbo。不過,如果確定使用quarkus作為主要的開發(fā)框架的話,最終的目標應(yīng)該是將服務(wù)直接注冊到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環(huán)境中,spring的包一點用都沒有,只會增加應(yīng)用的體積
定義接口和實現(xiàn)
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接口和具體實現(xiàn)都寫在一個文件里了。
定義接收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
應(yīng)用啟動時,創(chuàng)建DubboProperties實例,并將配置文件中的相關(guān)配置設(shè)置到對應(yīng)的屬性中,在需要的地方可以通過構(gòu)造函數(shù)或者@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; } }
這里通過構(gòu)造函數(shù)注入的方式,引用了前面定義的dubbo配置實例,通過配置,可以實例化出ApplicationConfig、RegistryConfig、ProtocolConfig等實例,這里創(chuàng)建實例時,只設(shè)置了最基本的dubbo屬性,更多的屬性配置擴展可以在這個地方修改。這里的三個實例是保留dubbo服務(wù)和引入dubbo服務(wù)不可或缺的三個重要組件,具體的用法繼續(xù)往下看
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配置組件,都出現(xiàn)在了dubbo提供者配置里,這三個組件是組成dubbo serviceConfig的一部分。因為沒有spring自動掃描dubbo注解獲取bean實例,所以在quarkus中,需要手動聲明和注冊dubbo服務(wù),這里通過@PostConstruct應(yīng)用啟動后的構(gòu)造函數(shù)來觸發(fā)dubbo的服務(wù)注冊暴露動作,然后把所有的需要暴露成dubbo服務(wù)的接口都統(tǒng)一放入map容器里,然后迭代map完成dubbo服務(wù)暴露。
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里的消費者,就是引入遠程服務(wù)。首先需要在自己的項目中添加服務(wù)提供方的api依賴,然后通過ReferenceConfig配置,可以得到接口的代理實現(xiàn),這里,也需要用到應(yīng)用配置和注冊中心的配置組件。最后通過@Produces注解,將api實例注冊到本地quarkus的bean上下文中,完成后就可以通過@Inject注解注入直接使用dubbo服務(wù)了,如:
@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 "發(fā)送成功"; } }
結(jié)語
完成了quarkus和dubbo的集成后,博主看到了quarkus在這邊落地的希望,雖然最終的目標是面向容器編程,但是在全部遷移上容器的過程中,肯定還需要兼容dubbo這種遠程通訊方式的,相比于spring中的dubbo使用,quarkus目前只能手動注冊服務(wù)和引入服務(wù),博主嘗試過使用BeanManager來進一步的自動化發(fā)布dubbo服務(wù),但是沒能找像spring中g(shù)etBean(Type)這類的方法。相信隨著對Quarkus和CDI的深入了解,這塊也會有突破,那個時候就可以像spring中那么使用dubbo了
以上就是Quarkus集成Dubbo服務(wù)Rpc遠程通訊框架整合的詳細內(nèi)容,更多關(guān)于Quarkus集成Dubbo服務(wù)Rpc遠程通訊框架的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springBoot基于webSocket實現(xiàn)掃碼登錄
最近做了個新項目,涉及到掃碼登錄。之前項目使用的是 ajax輪詢的方式。感覺太low了。所以這次用webSocket的方式進行實現(xiàn),感興趣的可以了解一下2021-06-06微服務(wù)?Spring?Boot?整合?Redis?BitMap?實現(xiàn)?簽到與統(tǒng)計功能
這篇文章主要介紹了微服務(wù)?Spring?Boot?整合?Redis?BitMap?實現(xiàn)?簽到與統(tǒng)計功能,文章簡單介紹了Redis BitMap 基本用法結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-01-01Java基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲
這篇文章主要為大家詳細介紹了Java如何基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲,文中的示例代碼講解詳細,感興趣的小伙伴可以動手嘗試一下2022-07-07Java設(shè)計模式之命令模式(Command模式)介紹
這篇文章主要介紹了Java設(shè)計模式之命令模式(Command模式)介紹,本文講解了Command模式的定義、如何使用命令模式等內(nèi)容,需要的朋友可以參考下2015-03-03Java生成二維碼的兩種實現(xiàn)方式(基于Spring?Boot)
這篇文章主要給大家介紹了關(guān)于Java生成二維碼的兩種實現(xiàn)方式,文中的代碼基于Spring?Boot,本文基于JAVA環(huán)境,以SpringBoot框架為基礎(chǔ)開發(fā),文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-07-07