<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
dubbo是一個流行的使用廣泛的服務治理型RPC框架,博主所在公司,大量服務都是使用dubbo來暴露和呼叫的,如果想要使用quarkus替換spring boot來做業務系統,肯定要在quarkus中解決dubbo整合的問題。好在dubbo的設計比較優良,除了提供在spring環境下的自動裝備載入,還可以通過手動程式設計的方式整合dubbo。不過,如果確定使用quarkus作為主要的開發框架的話,最終的目標應該是將服務直接註冊到k8s的service中,就不需要dubbo或者grpc這種遠端通訊框架了。
<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介面和具體實現都寫在一個檔案裡了。
@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註解自動注入
@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服務不可或缺的三個重要元件,具體的用法繼續往下看
@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服務暴露。
@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其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45