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