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ā)框架的話,最終的目標(biāo)應(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在這邊落地的希望,雖然最終的目標(biāo)是面向容器編程,但是在全部遷移上容器的過程中,肯定還需要兼容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)文章
java靜態(tài)工具類注入service出現(xiàn)NullPointerException異常處理
如果我們要在我們自己封裝的Utils工具類中或者非controller普通類中使用@Autowired注解注入Service或者Mapper接口,直接注入是報錯的,因Utils用了靜態(tài)方法,我們無法直接用非靜態(tài)接口的,遇到這問題,我們要想法解決,下面小編就簡單介紹解決辦法,需要的朋友可參考下2021-09-09
springboot?全局異常處理和統(tǒng)一響應(yīng)對象的處理方式
這篇文章主要介紹了springboot?全局異常處理和統(tǒng)一響應(yīng)對象,主要包括SpringBoot 默認的異常處理機制和SpringBoot 全局異常處理,本文給大家介紹的非常詳細,需要的朋友可以參考下2022-06-06
SpringBoot實現(xiàn)動態(tài)定時任務(wù)的示例代碼
在SpringBoot項目中簡單使用定時任務(wù),不過由于要借助cron表達式且都提前定義好放在配置文件里,不能在項目運行中動態(tài)修改任務(wù)執(zhí)行時間,實在不太靈活?,F(xiàn)在我們就來實現(xiàn)可以動態(tài)修改cron表達式的定時任務(wù),感興趣的可以了解一下2022-10-10
Java?Spring?AOP源碼解析之事務(wù)實現(xiàn)原理
這篇文章主要為大家介紹了Java?Spring?AOP事務(wù)實現(xiàn)原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01
Spring的自定義擴展標(biāo)簽NamespaceHandler解析
這篇文章主要介紹了Spring的自定義擴展標(biāo)簽NamespaceHandler解析,在很多情況下,我們需要為系統(tǒng)提供可配置化支持,簡單的做法可以直接基于Spring的標(biāo)準(zhǔn)Bean來配置,Spring提供了可擴展Schema的支持,這是一個不錯的折中方案,需要的朋友可以參考下2023-12-12
feign參數(shù)過多導(dǎo)致調(diào)用失敗的解決方案
這篇文章主要介紹了feign參數(shù)過多導(dǎo)致調(diào)用失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Java StringBuilder和StringBuffer源碼分析
這篇文章主要針對Java中兩個常用的操作字符串的類 StringBuilder和StringBuffer進行源碼分析,感興趣的小伙伴們可以參考一下2016-01-01
Java 并發(fā)編程學(xué)習(xí)筆記之Synchronized簡介
雖然多線程編程極大地提高了效率,但是也會帶來一定的隱患。比如說兩個線程同時往一個數(shù)據(jù)庫表中插入不重復(fù)的數(shù)據(jù),就可能會導(dǎo)致數(shù)據(jù)庫中插入了相同的數(shù)據(jù)。今天我們就來一起討論下線程安全問題,以及Java中提供了什么機制來解決線程安全問題。2016-05-05

