Heim  >  Artikel  >  Java  >  Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

Java后端技术全栈
Java后端技术全栈nach vorne
2023-08-23 14:44:32620Durchsuche


Wenn Sie sich bereits für interessieren Rand links: 27, 31, 35, 0,05; Schriftfamilie: „Operator Mono“, Consolas, Monaco, Monospace; 239, 112, 96);">DubboDubbo熟练使用了,那这篇文章不太适合你,但如果想了解Dubbo,想学习Dubbo,那就非常适合你。

Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

什么是Dubbo?

Dubbo一开始是由阿里巴巴开发,后面贡献给了Apache,所以后面我们称之为Apache Dubbo或者直接叫Dubbo

DubboWenn Sie damit vertraut sind, ist dieser Artikel nicht für Sie geeignet, aber wenn Sie mehr wissen möchten

Dubbo
, will lernen

Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger🎜

Was ist Dubbo? 🎜 🎜

🎜Dubbo wurde ursprünglich von Alibaba entwickelt und später zu Apache, also nennen wir es Apache Dubbooder nennen Sie es einfach Dubbo. 🎜🎜Falsche Aussprache: diubo, dubo

Richtige Aussprache: |ˈdʌbəʊ|

Dubbos sechs Kernfunktionen

  • Hohe Leistung für SchnittstellenagentenRPC Aufruf
  • RPC调用
  • 智能容错和负载均衡
  • 服务自动注册和发现
  • 高度可扩展能力
  • 运行期流量调度
  • 可视化的服务治理与运维。
  • 开发中,我们都喜欢把Dubbo简称为RPC开源框架。

    什么是RPC?

    RPCRemote Procedure Call的简称,翻译过来就是:远程过程调用

    Intelligente Fehlertoleranz und Lastausgleich li>

    Automatische Registrierung und Erkennung von Diensten

    Hoch skalierbare Funktionen

    Laufzeit-Verkehrsplanung🎜🎜Visualisierte Dienste Governance und Betrieb. 🎜Während der Entwicklung verwenden wir alle gerne Dubbo wird bezeichnet als RPCOpen-Source-Framework. 🎜

    Was ist RPC?

    🎜RPC ist Remote Procedure Calls Abkürzung, übersetzt als: Remote Procedure Call. 🎜🎜🎜Das einfache Verständnis ist, dass ein Knoten die von einem anderen Knoten bereitgestellten Dienste anfordert. 🎜🎜🎜Laienhaft ausgedrückt:🎜

    Zwei Server A und B stellen eine Anwendung serverA,在服务器B上部署一个应用程序serverB。此时,serverA想调用serverB auf Server A bereit. Eine bestimmte Methode kann nicht direkt aufgerufen werden, da sie sich nicht auf demselben Server befindet. Die Semantik des Aufrufs und die Daten des Aufrufs müssen über das Netzwerk übertragen werden.

    Rufen Sie Remote-Methoden genauso auf wie lokale Methoden.

    Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

    In unserer Entwicklung verwenden Aufrufe zwischen zwei Diensten (Diensten auf verschiedenen Servern) normalerweise HTTP REST.

    RPC-Framework

    Tatsächlich gibt es viele RPC-Frameworks auf dem Markt, und Dubbo ist nur eines davon. Zum Beispiel:

    • gRPC ist ein leistungsstarkes, universelles Open-Source-RPC-Framework, das ProtoBuf zur Definition von Diensten verwendet. ProtoBuf ist ein von Google entwickeltes Datenserialisierungsprotokoll einfache Syntax. Darüber hinaus unterstützt gRPC mehrere Sprachen und kann automatisch Client- und Server-Funktionsbibliotheken basierend auf Sprachen generieren.
    • Thrift entstand aus Facebook und wurde später wie Dubbo der Apache Foundation vorgelegt, um Thrift zu einem Open-Source-Projekt zu machen. Facebook hat Thrift entwickelt, um das Problem der großen Datenmengenübertragung und Kommunikation zwischen Facebook-Systemen sowie der unterschiedlichen Sprachumgebungen zwischen Systemen zu lösen, die plattformübergreifende Probleme erfordern.
    • Motan ist ein Open-Source-Java-RPC-Framework von Sina Weibo. Dem offiziellen Dokument zufolge wird es häufig auf der Weibo-Plattform verwendet und führt täglich fast 100 Milliarden Anrufe für Hunderte von Diensten durch.
    • ...

    Dubbo-Kerncharakter

    Lass uns einen Blick darauf werfenKernrolle in der Dubbo-Architektur: Dubbo架构中的核心角色:

    Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

    该图来自于官网,下面我们对图做一个简单介绍:

    Registry

    注册中心。负责服务地址的注册与查找,服务的 ProviderConsumer 只在启动时与注册中心交互。注册中心通过长连接感知 Provider 的存在,在 Provider 出现宕机的时候,注册中心会立即推送相关事件通知 Consumer

    Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

    🎜Dieses Bild stammt von der offiziellen Website. Lassen Sie uns eine kurze Einführung in das Bild unten geben:🎜

    Registrierung

    🎜Registrierungscenter. Verantwortlich für die Registrierung und Suche nach Dienstadressen, Dienst Existence of Provider , in Consumer</code > . 🎜<h4 data-tool=" mdnice>Anbieter<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Dienstleister. Beim Start registriert es sich bei der Registry, kapselt die Adresse seines eigenen Dienstes und zugehörige Konfigurationsinformationen in eine URL und fügt sie ZooKeeper hinzu. </p> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 18px;">Verbraucher</h4> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Verbraucher bedienen. Wenn es startet, wird es die Registry abonnieren. Der Abonnementvorgang stellt die Verbindung von <code style='font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);'>ZooKeeper 中获取 Provider 注册的 URL,并在 ZooKeeper 中添加相应的监听器。获取到 Provider URL 之后,Consumer 会根据负载均衡算法从多个 Provider 中选择一个 Provider 并与其建立连接,最后发起对 ProviderRPC 调用。如果 Provider URL 发生变更,Consumer 将会通过之前订阅过程中在注册中心添加的监听器,获取到最新的 Provider URL 信息,进行相应的调整,比如断开与宕机 Provider 的连接,并与新的 Provider her.Bei den Funktionen „Consumer“ und „Provider 建立的是长连接,且 Consumer 会缓存 Provider 信息,所以一旦连接建立,即使注册中心宕机,也不会影响已运行的 ProviderConsumer

    Monitor

    监控中心。用于统计服务的调用次数和调用时间。ProviderConsumer 在运行过程中,会在内存中统计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。监控中心在上面的架构图中并不是必要角色,监控中心宕机不会影响 ProviderConsumer 以及 Registry“ gehen nur Überwachungsdaten verloren.

    Es entwickelt sich obszön und explodiert im späteren Stadium (im frühen Stadium achtet man vielleicht nicht besonders darauf, aber im späteren Stadium duftet es besonders stark)

    Container:

    Dienst läuft Container. ist ein separater Container, da Dienste ihn normalerweise nicht benötigen (27, 31, 35, 0,05);Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, Monospace;Wortumbruch: Break-All;Farbe: RGB (239, 112, 96);">Tomcat、JBoss und andere Web-Container-Funktionen, ist es nicht erforderlich, einen Web-Container zum Laden von Diensten zu verwenden. Der Service-Container ist nur eine einfache Hauptmethode und lädt einen einfachen Spring-Container, um den Service verfügbar zu machen. TomcatJBoss等Web容器的特性,没必要用Web容器去加载服务。服务容器只是一个简单的main方法,并加载一个简单的Spring容器,用于暴露服务。

    流程说明

    在上面这张图中,有几个角色,并且还画了很多线条,下面我们对此做一个简单说明。

    • 服务容器负责启动,加载,运行服务提供者。
    • 服务提供者在启动时,向注册中心注册自己提供的服务。
    • 服务消费者在启动时,向注册中心订阅自己所需的服务。
    • 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    • 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
    • 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

    Dubbo官网

    Dubbo的官网:https://dubbo.apache.org/

    Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

    由于Dubbo

    Prozessbeschreibung

    Oben Darin Im Bild gibt es mehrere Zeichen und viele Linien. Lassen Sie uns dies im Folgenden kurz erklären. 🎜
    • Der Dienstcontainer ist für das Starten, Laden und Ausführen des Dienstanbieters verantwortlich.
    • Dienstanbieter bei Registrieren Sie beim Start die von Ihnen bereitgestellten Dienste im Registrierungscenter.
    • Dienstkonsumenten unter Startup, abonnieren Sie das Registrierungscenter für die Dienste, die Sie benötigen.
    • Registration Center Return Die Adressliste des Dienstanbieters wird an den Verbraucher weitergegeben. Bei einer Änderung übermittelt das Registrierungszentrum die Änderungsdaten basierend auf der langen Verbindung an den Verbraucher.
    • Dienstkonsumenten, Wählen Sie aus der Provider-Adressliste basierend auf dem Soft-Load-Balancing-Algorithmus einen Provider zum Anrufen aus. Wenn der Anruf fehlschlägt, wählen Sie einen anderen Provider zum Anrufen aus.
    • Dienstkonsumenten und Provider, sammeln die Anzahl der Anrufe und die Anrufzeit im Speicher und senden regelmäßig jede Minute statistische Daten an die Überwachungszentrale.

    Offizielle Website von Dubbo

    🎜Dubbos offizielle Website: https://dubbo.apache.org/🎜

    Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger🎜

    🎜AufgrundDubbo wurde vom technischen Team von Alibaba entwickelt, daher ist die Dokumentation sehr wichtig Für uns in China ist es aus menschlicher Sicht recht freundlich. Mit einem Wort: cool! 🎜

    Außerdem Dubbo官网上很多东西,我们就不在这里一一介绍了。

    建议大家都去官网逛逛。

    话不多说,咱们先来嗨一把!

    demo案例1

    我们先来搞一个没有注册中心的案例。

    我们搭建一个项目,并创建三个module

    • dubbo-demo
    • dubbo-demo-api
    • dubbo-demo-provider
    • dubbo-demo-consumer

      Es wird jedem empfohlen, die offizielle Website aufzurufen.

    • Ohne weitere Umschweife, lasst uns zuerst Spaß haben!

    Demo-Fall 1

    Beginnen wir mit einem Fall ohne Registrierungszentrum.

    Wir erstellen ein Projekt und erstellen drei
  • dubbo-demo-api
  • Zuerst ist pom依赖:

    <!--dubbo的依赖-->
    <dependency>
         <groupId>org.apache.dubbo</groupId>
         <artifactId>dubbo</artifactId>
         <version>3.0.4</version>
    </dependency>
    <!-- provider和consumer共用类-->
    <dependency>
         <groupId>com.tian.dubbo</groupId>
         <artifactId>dubbo-demo-api</artifactId>
         <version>1.0-SNAPSHOT</version>
    </dependency>

    consumer和provider项目都需要添加这两个依赖。

    api

    api主要是定义服务接口以及一些工具类,主要是供consumer和provider共用。

    在api中我们只定义了一个服务接口:DemoService

    package com.tian.dubbo.service;
    
    public interface DemoService {
        String sayHello(String msg);
    }

    然后打成jar,在consumer和provider项目中添加到pom.xml依赖里,最后两遍都可以使用了。

    provider

    在resources目录下创建一个目录META-INF.spring,然后在目录下创建一个application.xml,内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
        <!--Dubbo服务名称--> 
        <dubbo:application name="dubbo-provider"/>
        <!--不需要注册到服务注册中心--> 
        <dubbo:registry address="N/A"/>
        <!--端口和协议--> 
        <dubbo:protocol name="dubbo" port="20880"/>
        <!--我们的服务--> 
        <dubbo:service interface="com.tian.dubbo.service.DemoService" ref="demoService"/>
        <bean id="demoService" class="com.tian.dubbo.service.DemoServiceImpl"/>
    </beans>

    再在resources目录下创建一个日志打印的配置文件:log4j.properties

    ###set log levels###
    log4j.rootLogger=debug, stdout
    ###output to the console###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n

    在定义一个业务实现类:DemoServiceImpl

    package com.tian.dubbo.service;
    
    public class DemoServiceImpl implements DemoService {
        public String sayHello(String msg) {
            System.out.println("msg= " + msg);
            return "SUCCESS";
        }
    }

    再就是定义一个provider的启动类:ProviderMain

    package com.tian.dubbo;
    
    import org.apache.dubbo.container.Main;
    
    public class ProviderMain {
        public static void main(String[] args) {
            Main.main(args);
        }
    }
    Sowohl Verbraucher- als auch Anbieterprojekte müssen diese beiden Abhängigkeiten hinzufügen.

    api

    🎜 Die API definiert hauptsächlich Serviceschnittstellen und einige Toolklassen, die hauptsächlich von Verbrauchern und Anbietern gemeinsam genutzt werden. 🎜🎜In der API definieren wir nur eine Serviceschnittstelle: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 服务名称--> <dubbo:application name="dubbo-consumer"/> <!--不需要注册到服务注册中心--> <!-- 通过url直接调用--> <dubbo:reference id="demoService" interface="com.tian.dubbo.service.DemoService" url="dubbo://127.0.0.1:20880/com.tian.dubbo.service.DemoService"/> </beans>🎜 Machen Sie es dann in ein Glas und fügen Sie es zu provider🎜Im Ressourcenverzeichnis Erstellen Sie ein Verzeichnis unter META-INF.spring und erstellen Sie dann einen application.xml, Der Inhalt lautet wie folgt: 🎜
    package com.tian.dubbo;
    
    import com.tian.dubbo.service.DemoService;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class ConsumerMain {
        public static void main(String[] args) {
            DemoService demoService = null;
            ApplicationContext context = new ClassPathXmlApplicationContext
                    ("classpath:META-INF/spring/application.xml");
            demoService = context.getBean(DemoService.class);
            //调用服务
            System.out.println(demoService.sayHello("tian"));
        }
    }
    🎜Erstellen Sie eine Konfigurationsdatei für den Protokolldruck im Ressourcenverzeichnis: log4j.properties🎜
    <dependency>
         <groupId>org.apache.dubbo</groupId>
         <artifactId>dubbo-dependencies-zookeeper</artifactId>
         <version>3.0.4</version>
         <type>pom</type>
    </dependency>
    🎜 definiert eine Geschäftsimplementierungsklasse: DemoServiceImpl🎜
    <dubbo:registry address="N/A"/>
    🎜Dann definieren Sie eine Anbieter-Startup-Klasse: ProviderMain🎜
    package com.tian.dubbo;
    
    import org.apache.dubbo.container.Main;
    
    public class ProviderMain {
        public static void main(String[] args) {
            Main.main(args);
        }
    }

    注意:这里的Main类是Dubbo

    最后,我们启动ProviderMain类,日志输出:

    Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

    好了,已经启动成功了。

    我们继续来看看consumer项目,在项目中,也就是调用我们服务的项目。

    consumer

    在consumer项目中application.xml配置文件和provider有所区别。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
        <!-- 服务名称-->
        <dubbo:application name="dubbo-consumer"/>
        <!--不需要注册到服务注册中心--> 
        <!-- 通过url直接调用-->
        <dubbo:reference id="demoService"
                         interface="com.tian.dubbo.service.DemoService"
         url="dubbo://127.0.0.1:20880/com.tian.dubbo.service.DemoService"/>
    </beans>

    这个url地址,我们在provider启动的时候,可以从日志中找到。

    日志文件和provider一样,然后就是ConsumerMain启动类了。

    package com.tian.dubbo;
    
    import com.tian.dubbo.service.DemoService;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class ConsumerMain {
        public static void main(String[] args) {
            DemoService demoService = null;
            ApplicationContext context = new ClassPathXmlApplicationContext
                    ("classpath:META-INF/spring/application.xml");
            demoService = context.getBean(DemoService.class);
            //调用服务
            System.out.println(demoService.sayHello("tian"));
        }
    }

    前面,我们已经把provider成功启动了,下面我们就来启动ConsumerMain

    Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

    从日志可以看出我们已经成功调用了provider,我们再来看看provider的日志输出:

    Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

    也成功的输出了我们想要的。

    到此,一个简单的入门无注册中心(通过url直接调用)的方式就完成了。

    url ist bei der Entwicklung des gemeinsamen Debuggens immer noch sehr nützlich, da dadurch die Abhängigkeit vom Registrierungscenter beseitigt wird.

    Demo-Fall 2

    Wir haben bereits zuvor ohne Registrierungszentrum demonstriert, jetzt demonstrieren wir mit Registrierungscenter.

    Dubbo目前差不多能支持市面上所有的注册中心:

    • consul
    • zookeeper
    • eureka
    • redis
    • etcd
    • nacos
    • ....

    我们在实际开发中,Dubbo注册中心大部分都是使用ZookeeperNacos

    下面们基于Zookeeper

      consul
  • zookeeper
  • eureka
  • redis
  • etcd
  • nacos
  • ....
  • In der tatsächlichen Entwicklung, Dubbo
    Die meisten Registrierungszentren verwenden Zookeeper und Nacos.

    Das Folgende basiert auf Codeebene🎜🎜Ich habe es basierend auf dem vorherigen Fall geändert. Die Transformation muss nur an zwei Stellen angepasst werden: 🎜
    • consumer和provider中添加pom依赖
    • application.xml中添加注册中心
    pom依赖

    我们需要在前面demo中consumer和provider的pom.xml中添加Zookeeper的依赖:

    <dependency>
         <groupId>org.apache.dubbo</groupId>
         <artifactId>dubbo-dependencies-zookeeper</artifactId>
         <version>3.0.4</version>
         <type>pom</type>
    </dependency>
    provider端

    在provider项目中我们需要调整:

    <dubbo:registry address="N/A"/>

    改成:

    <dubbo:registry address="zookeeper://127.0.0.1:2181" timeout="10000"/>

    这个timeout建议配上,我这里其实没必要配,因为dubbo服务和Zookeeper都在我本地。

    然后我们启动provider项目:

    Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

    看到我们的项目已经启动成功,并且已经注册到Zookeeper上了。

    我们可以使用Zookeeper的可视化工具,看看注册上去的信息。

    Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

    我们再看看consumer端的调整。

    consumer端

    我们需要在application.xml中添加

    <dubbo:registry address="zookeeper://127.0.0.1:2181" timeout="10000"/>

    同时,去掉reference中的url:

    <dubbo:reference id="demoService"
                         interface="com.tian.dubbo.service.DemoService"
         url="dubbo://127.0.0.1:20880/com.tian.dubbo.service.DemoService"/>

    因为是通过Zookeeper注册中心拿到地址,所以这里的url就可以去掉了。

    最后,启动ConsumerMain类:

    Dubbo-Quellcode-Analyse: Leitfaden für Einsteiger

    可以看到我们也成功调用服务,另外也有大量的Zookeeper日志。

    到此,说明,我们的Zookeeper为注册中心的demo案例也成功了。

    注意:provider和consumer项目都需要依赖相关jar包(api、zookeeper、dubbo)

    其他

    关于Nacos,我们这里就不演示了,因为太简单了,如果你把Nacos搭建好了后,直接配置就好了。

    <dubbo:registry address="nacos://127.0.0.1:8848" timeout="10000"/>

    就是把address地址改一下就可以了。

    Nacos 的演示,我们下一篇文章中见。

    总结

    本文分享了Dubbo入门案例的两个版本:无注册中心和Zookeeper注册中心。

    Das obige ist der detaillierte Inhalt vonDubbo-Quellcode-Analyse: Leitfaden für Einsteiger. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:Java后端技术全栈. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen