成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

學(xué)完RPC,你竟然還要我寫Dubbo!

開發(fā) 前端
架構(gòu)我們介紹了Dubbo中的核心角色,如何搭建Dubbo源碼環(huán)境,對(duì)Dubbo源碼中的核心模塊進(jìn)行了簡(jiǎn)單的說(shuō)明,并簡(jiǎn)單的分析了Dubbo的示例程序并運(yùn)行了示例程序。

小伙伴的訴求

最近,不少小伙們私信我說(shuō):冰哥,我在你星球正在學(xué)習(xí)手寫RPC框架,學(xué)習(xí)這個(gè)手寫RPC框架時(shí),我也想對(duì)比研究下Dubbo的源碼,但是我自己看Dubbo的源碼很費(fèi)勁,看了半天也看不明白,你可以再出一個(gè)專欄帶著大家研究下Dubbo的源碼嗎?我想將你手寫的RPC和Dubbo的源碼進(jìn)行對(duì)比學(xué)習(xí)。

看到小伙伴們這么高的學(xué)習(xí)熱情,我當(dāng)然不能拒絕啊。記得剛寫RPC框架時(shí),我就說(shuō)過(guò),這個(gè)手寫RPC框架是冰河將Dubbo 2.x和Dubbo 3.x的源碼研究透徹后寫的,這次既然小伙伴們想跟冰河一起徹底吃透Dubbo,冰河當(dāng)然要安排啦!

開干了

既然是要寫深度解析Dubbo源碼的系列專題,我們首先要做的就是搭建一套Dubbo的源碼環(huán)境,正所謂“工欲善其事,必先利其器”。但是,為了更好的理解Dubbo,我將這篇文章重點(diǎn)分成三個(gè)部分:Dubbo中的核心角色、搭建Dubbo源碼環(huán)境、Dubbo核心模塊說(shuō)明、運(yùn)行Dubbo的示例程序 四個(gè)部分。說(shuō)干就干,上重點(diǎn)。

Dubbo中的核心角色

為了更好的說(shuō)明Dubbo中的核心角色,這里,我就直接引用一張Dubbo的依賴關(guān)系圖。

圖片圖片

注:圖片來(lái)自Dubbo官網(wǎng)。

從Dubbo的依賴關(guān)系圖中,我們可以看出,Dubbo主要由四部分構(gòu)成:Registry、Provider、Consumer和Monitor 。接下來(lái),我們就分別對(duì)這四部分進(jìn)行簡(jiǎn)單的介紹。

  • Registry,注冊(cè)中心。在Dubbo中,注冊(cè)中心負(fù)責(zé)服務(wù)的注冊(cè)與發(fā)現(xiàn),主要就是針對(duì)服務(wù)地址的注冊(cè)與查找。值得一提的是,在Dubbo中,Provider和Consumer只有在服務(wù)啟動(dòng)的時(shí)候與注冊(cè)中心進(jìn)行交互。之后,注冊(cè)中心通過(guò)長(zhǎng)連接的形式來(lái)感知Provider的存在,如果Provider宕機(jī)或不可用,注冊(cè)中心就會(huì)立即推送相關(guān)的事件來(lái)告知Consumer。
  • Provider,服務(wù)的提供者。Provider在啟動(dòng)的時(shí)候,會(huì)向注冊(cè)中心注冊(cè)自己的相關(guān)服務(wù),主要是通過(guò)將自身的服務(wù)地址和相關(guān)的配置信息封裝成URL添加到Zookeeper等服務(wù)中。
  • Consumer,服務(wù)的消費(fèi)者。Consumer在啟動(dòng)的時(shí)候,會(huì)向注冊(cè)中心訂閱其關(guān)注的服務(wù)。主要是向Zookeeper等服務(wù)中獲取Provider注冊(cè)的URL,并且在Zookeeper等服務(wù)中添加相應(yīng)的監(jiān)聽器。獲取到Provider注冊(cè)的URL之后,Consumer就會(huì)通過(guò)負(fù)載均衡算法從獲取的多個(gè)Provider中選擇一個(gè),并與其建立連接,發(fā)起RPC調(diào)用。如果Zookeeper等服務(wù)中注冊(cè)的Provider發(fā)生了變更,Consumer就會(huì)通過(guò)在注冊(cè)中心中添加的監(jiān)聽器來(lái)獲取最新的Provider信息。而且Consumer會(huì)緩存Provider的信息,如果Consumer與Provider一旦建立起連接,即使注冊(cè)中心宕機(jī)或不可用,也不會(huì)影響Consumer和Provider之間的交互。
  • Monitor:監(jiān)控中心。主要用來(lái)統(tǒng)計(jì)Dubbo服務(wù)的調(diào)用次數(shù)和調(diào)用的時(shí)間。在Dubbo的核心架構(gòu)中,監(jiān)控中心不是必需的,監(jiān)控中心宕機(jī)或不可用不會(huì)影響Dubbo的整體服務(wù)。

好了,對(duì)于Dubbo的核心角色我們就介紹到這兒,更多的信息,小伙伴們可以參見Dubbo的官方文檔。

搭建Dubbo源碼環(huán)境

我們可以使用如下命令將github的源碼下載的本地。

git clone https://github.com/apache/dubbo.git

接下來(lái),將Dubbo的源碼切換到2.7.8

git checkout -b dubbo-2.7.8 dubbo-2.7.8

使用Maven進(jìn)行編譯

mvn clean install -Dmaven.test.skip=true

轉(zhuǎn)換成IDEA項(xiàng)目,這里我使用的是IDEA分析Dubbo源碼。

mvn idea:idea

接下來(lái),我們就可以將Dubbo源碼導(dǎo)入到IDEA了。

說(shuō)了這么多,其中還有一種方式就是通過(guò)瀏覽器直接下載Dubbo 2.7.8的源碼到本地。

在瀏覽器中打開鏈接:https://github.com/apache/dubbo/releases/tag/dubbo-2.7.8 下載Dubbo源碼。

圖片圖片

這里下載zip壓縮包和tar.gz壓縮包均可,下載到本地后解壓,將其導(dǎo)入到IDEA中即可。

導(dǎo)入完成后,我們看到的項(xiàng)目結(jié)構(gòu)如下所示。

圖片圖片

接下來(lái),我們就對(duì)Dubbo源碼中的核心模塊進(jìn)行簡(jiǎn)單的介紹。

Dubbo核心模塊說(shuō)明

dubbo-common模塊

Dubbo的公共模塊,提供了Dubbo SPI的實(shí)現(xiàn)、時(shí)間輪的實(shí)現(xiàn)、動(dòng)態(tài)編譯等通用的功能。

圖片圖片

dubbo-remoting模塊

Dubbo的遠(yuǎn)程通信模塊,其中,dubbo-remoting-api是對(duì)整個(gè)模塊的核心抽象,其他子模塊基于其他開源框架對(duì)dubbo-remoting-api進(jìn)行實(shí)現(xiàn)。

圖片圖片

dubbo-rpc模塊

Dubbo的RPC模塊,依賴dubbo-remoting模塊。其中,dubbo-remoting-api是整個(gè)dubbo-rpc模塊的核心抽象,其他模塊是對(duì)dubbo-remoting-api的實(shí)現(xiàn)。

圖片圖片

dubbo-registry模塊

Dubbo中與注冊(cè)中心交互的模塊。其中dubbo-registry-api是整個(gè)dubbo-registry的核心抽象,其他模塊是對(duì)dubbo-registry-api的具體實(shí)現(xiàn)。

圖片圖片

dubbo-config模塊

Dubbo中解析對(duì)外暴露的配置的模塊。其中,dubbo-config-api 子模塊負(fù)責(zé)處理以API 方式使用Dubbo時(shí)的相關(guān)配置,dubbo-config-spring 子模塊負(fù)責(zé)處理與 Spring 集成使用時(shí)的相關(guān)配置方式。

圖片圖片

dubbo-metadata模塊

Dubbo中的元數(shù)據(jù)模塊。其中,dubbo-metadata-api是對(duì)整個(gè)dubbo-metadata的抽象,其他模塊是對(duì)dubbo-metadata-api的實(shí)現(xiàn)。

圖片圖片

dubbo-configcenter模塊

Dubbo的配置中心模塊,其中,提供了多種服務(wù)發(fā)現(xiàn)的方式并接入了多種服務(wù)發(fā)現(xiàn)組件。

圖片圖片

dubbo-monitor模塊

Dubbo 的監(jiān)控模塊,主要用于統(tǒng)計(jì)服務(wù)調(diào)用次數(shù)、調(diào)用時(shí)間以及實(shí)現(xiàn)調(diào)用鏈跟蹤的服務(wù)。

圖片圖片

dubbo-cluster模塊

Dubbo的集群管理模塊,主要提供負(fù)載均衡、容錯(cuò)、路由等功能。

圖片圖片

運(yùn)行Dubbo示例程序

在Dubbo源碼中,有一個(gè)示例程序模塊dubbo-demo,在運(yùn)行dubbo-demo模塊中的示例前,我們先在本地啟動(dòng)一個(gè)Zookeeper作為注冊(cè)中心。

注:小伙伴們可以自行到Apache官網(wǎng)下載Zookeeper。

Dubbo示例程序結(jié)構(gòu)

Dubbo提供的示例程序的總體結(jié)構(gòu)如下所示。

圖片圖片

我們來(lái)看看dubbo-demo下有哪些模塊。

  • dubbo-demo-interface:Dubbo示例定義的業(yè)務(wù)接口。
  • dubbo-demo-xml:提供了基于Spring XML的使用示例。
  • dubbo-demo-annotation:提供了基于Spring注解方式的使用示例。
  • dubbo-demo-api:提供了以API方式使用Dubbo的示例。

其中,dubbo-demo-xml、dubbo-demo-annotation和dubbo-demo-api模塊都是依賴dubbo-demo-interface模塊的。

接下來(lái),我們就對(duì)dubbo-demo-interface模塊和dubbo-demo-annotation模塊的核心代碼進(jìn)行簡(jiǎn)單的介紹,并運(yùn)行相關(guān)的示例程序。小伙伴們可自行分析和運(yùn)行dubbo-demo-xml和dubbo-demo-api中的示例程序并運(yùn)行相關(guān)的代碼。

(1)dubbo-demo-interface:定義了業(yè)務(wù)接口。

圖片圖片

其中,DemoService接口的核心代碼如下所示。

package org.apache.dubbo.demo;
import java.util.concurrent.CompletableFuture;
public interface DemoService {
    //同步調(diào)用
    String sayHello(String name);
    //異步調(diào)用
    default CompletableFuture<String> sayHelloAsync(String name) {
        return CompletableFuture.completedFuture(sayHello(name));
    }
}

(2)dubbo-demo-annotation:提供了基于Spring注解的示例程序。

Provider代碼

我們先來(lái)看dubbo-demo-annotation-provider模塊,也就是服務(wù)的提供者。其DemoServiceImpl的代碼如下所示。

@DubboService
public class DemoServiceImpl implements DemoService {
    private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);

    @Override
    public String sayHello(String name) {
        logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
        return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
    }

    @Override
    public CompletableFuture<String> sayHelloAsync(String name) {
        return null;
    }
}

Application類的代碼如下所示。

public class Application {
    public static void main(String[] args) throws Exception {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
        context.start();
        System.in.read();
    }

    @Configuration
    @EnableDubbo(scanBasePackages = "org.apache.dubbo.demo.provider")
    @PropertySource("classpath:/spring/dubbo-provider.properties")
    static class ProviderConfiguration {
        @Bean
        public RegistryConfig registryConfig() {
            RegistryConfig registryConfig = new RegistryConfig();
            registryConfig.setAddress("zookeeper://127.0.0.1:2181");
            return registryConfig;
        }
    }
}

Consumer代碼

接下來(lái),我們來(lái)看看dubbo-demo-annotation-consumer模塊的代碼,也就是服務(wù)消費(fèi)者的示例代碼。其中,DemoServiceComponent類的代碼如下所示。

@Component("demoServiceComponent")
public class DemoServiceComponent implements DemoService {
    @DubboReference
    private DemoService demoService;

    @Override
    public String sayHello(String name) {
        return demoService.sayHello(name);
    }
    @Override
    public CompletableFuture<String> sayHelloAsync(String name) {
        return null;
    }
}

Application類的代碼如下所示。

public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
        context.start();
        DemoService service = context.getBean("demoServiceComponent", DemoServiceComponent.class);
        String hello = service.sayHello("world");
        System.out.println("result :" + hello);
    }

    @Configuration
    @EnableDubbo(scanBasePackages = "org.apache.dubbo.demo.consumer.comp")
    @PropertySource("classpath:/spring/dubbo-consumer.properties")
    @ComponentScan(value = {"org.apache.dubbo.demo.consumer.comp"})
    static class ConsumerConfiguration {

    }
}

運(yùn)行Dubbo示例程序

我們先在本地啟動(dòng)Zookeeper,然后分別運(yùn)行dubbo-demo-annotation-provider模塊的Application類和dubbo-demo-annotation-consumer模塊的Application類。

此時(shí)在IDEA的控制臺(tái)會(huì)輸出如下信息。

result :Hello world, response from provider: 192.168.0.5:20880

圖片圖片

Dubbo總結(jié)

到這里,我們介紹了Dubbo中的核心角色,如何搭建Dubbo源碼環(huán)境,對(duì)Dubbo源碼中的核心模塊進(jìn)行了簡(jiǎn)單的說(shuō)明,并簡(jiǎn)單的分析了Dubbo的示例程序并運(yùn)行了示例程序。

其中,在介紹和運(yùn)行示例程序時(shí),我們重點(diǎn)介紹了dubbo-demo-annotation示例模塊,小伙伴們可自行分析和運(yùn)行其他示例模塊。在后續(xù)的文章中分析源碼時(shí),我們也主要是通過(guò)debug Dubbo的示例程序的方式進(jìn)行。

責(zé)任編輯:武曉燕 來(lái)源: 冰河技術(shù)
相關(guān)推薦

2021-02-24 07:46:20

數(shù)據(jù)結(jié)構(gòu)二叉樹

2020-05-14 08:59:28

API網(wǎng)關(guān)性能

2022-06-07 08:39:35

RPCHTTP

2020-04-01 17:50:02

Python編程語(yǔ)言

2020-11-25 09:36:17

HTTPRPC遠(yuǎn)程

2020-09-09 07:13:05

RPC框架

2022-08-15 08:01:35

微服務(wù)框架RPC

2023-09-07 08:07:56

goHTTP網(wǎng)絡(luò)

2022-07-19 08:01:32

HTTP協(xié)議RPC

2023-06-21 08:24:46

2024-09-03 09:20:45

2012-12-13 09:37:46

編程程序員

2012-03-26 15:08:22

我畫你猜

2021-09-08 07:49:34

數(shù)據(jù) Python技術(shù)

2020-04-02 07:31:53

RPC超時(shí)服務(wù)端

2023-01-13 14:34:00

AI神經(jīng)網(wǎng)絡(luò)

2023-06-28 07:49:02

2018-06-13 10:42:38

編程語(yǔ)言PythonWeb應(yīng)用開發(fā)

2023-05-12 08:13:46

C/C++web框架

2021-06-08 06:46:48

設(shè)計(jì)模式創(chuàng)建型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲成人精品免费 | 亚洲国产成人精品女人久久久 | 欧美一区二区三区高清视频 | 欧美一区永久视频免费观看 | 福利视频网站 | 成人一区二区视频 | 激情毛片| 521av网站| 翔田千里一区二区 | 黑人粗黑大躁护士 | 亚洲欧洲一区二区 | 九九天堂网 | 一级毛片免费视频 | 色偷偷噜噜噜亚洲男人 | 中文字幕在线观看视频一区 | 亚洲精品一区二区三区免 | 国产成人精品一区二区三区在线 | www狠狠干 | 亚洲人成人一区二区在线观看 | 国产亚洲精品久久久久动 | 91av在线视频观看 | 日本一区二区三区免费观看 | a视频在线观看 | 欧美一区二区三区在线视频 | 亚洲成av人片在线观看 | 久久新视频 | 国产精品99久久久久久人 | 99re国产视频| 久久久久久免费毛片精品 | 天天综合天天 | 欧美一区二区在线观看视频 | 国产精品美女久久久久久久网站 | 成人精品一区二区三区 | 亚洲国产成人精品女人久久久 | 97超碰人人草 | 亚洲一区二区精品视频 | 欧美男人天堂 | 成年人免费网站 | 国产精品一区二区欧美黑人喷潮水 | 国产高清精品在线 | 成人性视频免费网站 |