Quarkus集成Dubbo服務(wù)Rpc遠(yuǎn)程通訊框架整合
前言
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ā)框架的話,最終的目標(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的包一點用都沒有,只會增加應(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配置,這里只定義了基本的配置屬性,其他都可以使用默認(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)用啟動時,創(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里的消費者,就是引入遠(yuǎn)程服務(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在這邊落地的希望,雖然最終的目標(biāo)是面向容器編程,但是在全部遷移上容器的過程中,肯定還需要兼容dubbo這種遠(yuǎn)程通訊方式的,相比于spring中的dubbo使用,quarkus目前只能手動注冊服務(wù)和引入服務(wù),博主嘗試過使用BeanManager來進(jìn)一步的自動化發(fā)布dubbo服務(wù),但是沒能找像spring中g(shù)etBean(Type)這類的方法。相信隨著對Quarkus和CDI的深入了解,這塊也會有突破,那個時候就可以像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實現(xiàn)掃碼登錄
最近做了個新項目,涉及到掃碼登錄。之前項目使用的是 ajax輪詢的方式。感覺太low了。所以這次用webSocket的方式進(jìn)行實現(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é)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
Java基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲
這篇文章主要為大家詳細(xì)介紹了Java如何基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動手嘗試一下2022-07-07
Java設(shè)計模式之命令模式(Command模式)介紹
這篇文章主要介紹了Java設(shè)計模式之命令模式(Command模式)介紹,本文講解了Command模式的定義、如何使用命令模式等內(nèi)容,需要的朋友可以參考下2015-03-03
Java生成二維碼的兩種實現(xiàn)方式(基于Spring?Boot)
這篇文章主要給大家介紹了關(guān)于Java生成二維碼的兩種實現(xiàn)方式,文中的代碼基于Spring?Boot,本文基于JAVA環(huán)境,以SpringBoot框架為基礎(chǔ)開發(fā),文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07

