Maison  >  Article  >  Java  >  Analyse du code source Dubbo : guide du débutant

Analyse du code source Dubbo : guide du débutant

Java后端技术全栈
Java后端技术全栈avant
2023-08-23 14:44:32620parcourir


Si vous avez déjà le restant : 2px ; couleur d'arrière-plan : rgba(27, 31, 35, 0.05) ; ; word-break: break-all; color: rgb(239, 112, 96);">DubboDubbo熟练使用了,那这篇文章不太适合你,但如果想了解Dubbo,想学习Dubbo,那就非常适合你。

Analyse du code source Dubbo : guide du débutant

什么是Dubbo?

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

DubboSi vous maîtrisez son utilisation, alors cet article ne vous convient pas, mais si vous le souhaitez en savoir plus

Dubbo
, je veux apprendre

Dubbo

, c'est parfait pour toi. 🎜🎜

Analyse du code source Dubbo : guide du débutant🎜

Qu'est-ce que Dubbo ? 🎜 🎜

🎜Dubbo a été initialement développé par Alibaba et a ensuite contribué à Apache, nous l'appellerons donc Apache Dubboou appelez-le simplement Dubbo. 🎜🎜Dubbo est un logiciel hautes performances, Cadre de service open source léger. 🎜🎜🎜Corrigez d'abord la prononciation : 🎜

Prononciation incorrecte : diubo, dubo

Prononciation correcte : |ˈdʌbəʊ|

Les six fonctionnalités principales de Dubbo

  • Hautes performances pour les agents d'interfaceAppel RPC
  • RPC调用
  • 智能容错和负载均衡
  • 服务自动注册和发现
  • 高度可扩展能力
  • 运行期流量调度
  • 可视化的服务治理与运维。
  • 开发中,我们都喜欢把Dubbo简称为RPC开源框架。

    什么是RPC?

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

    Tolérance aux pannes et équilibrage de charge intelligents li>

    Enregistrement et découverte automatiques des services

    Capacités hautement évolutives

    Planification du trafic d'exécution🎜🎜Services visualisés Gouvernance et opérations. 🎜Pendant le développement, nous aimons tous utiliser Dubbo est appelé RPCCadre open source. 🎜

    Qu'est-ce que RPC ?

    🎜RPC est Abréviation d'appel de procédure à distance, traduite par : Appel de procédure à distance. 🎜🎜🎜La compréhension simple est qu'un nœud demande les services fournis par un autre nœud. 🎜🎜🎜En termes simples :🎜

    Deux serveurs A et B déploient une application serverA,在服务器B上部署一个应用程序serverB。此时,serverA想调用serverB sur le serveur A. Une certaine méthode ne peut pas être appelée directement car elle ne se trouve pas sur le même serveur. La sémantique de l'appel et les données de l'appel doivent être transmises via le réseau.

    Appelez des méthodes distantes tout comme appeler des méthodes locales.

    Analyse du code source Dubbo : guide du débutant

    Dans notre développement, les appels entre deux services (services sur des serveurs différents) utilisent généralement HTTP REST.

    Framework RPC

    En fait, il existe de nombreux frameworks RPC sur le marché, et Dubbo n'est que l'un d'entre eux. Par exemple :

    • gRPC est un framework RPC open source universel hautes performances développé par Google. gRPC utilise ProtoBuf pour définir les services. ProtoBuf est un protocole de sérialisation de données développé par Google. Il a des performances relativement élevées, une efficacité de compression et de transmission élevée et une efficacité relative. syntaxe simple. De plus, gRPC prend en charge plusieurs langues et peut générer automatiquement des bibliothèques de fonctions client et serveur basées sur les langues.
    • Thrift est originaire de Facebook et, comme Dubbo, a ensuite été soumis à la Fondation Apache pour faire de Thrift un projet open source. Facebook a créé Thrift pour résoudre le problème de la transmission et de la communication de grandes quantités de données entre les systèmes Facebook, ainsi que des différents environnements linguistiques entre les systèmes qui nécessitent des problèmes multiplateformes.
    • Motan est un framework Java RPC open source de Sina Weibo. Selon le document officiel, il a été largement utilisé sur la plateforme Weibo, réalisant près de 100 milliards d'appels pour des centaines de services chaque jour.
    • ...

    Personnage principal de Dubbo

    Jetons un coup d'oeilRôle principal dans l'architecture Dubbo : Dubbo架构中的核心角色:

    Analyse du code source Dubbo : guide du débutant

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

    Registry

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

    Analyse du code source Dubbo : guide du débutant

    🎜Cette image provient du site officiel. Donnons une brève introduction à l'image ci-dessous :🎜

    Registre

    🎜Centre d'enregistrement. Responsable de l'enregistrement et de la recherche des adresses de service, service Fournisseur et <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 break-all rgb>Consumer ne fonctionne qu'avec inscription interaction centrale. Le centre d'enregistrement détecte les connexions longuesExistence du fournisseur , dans Provider En cas de temps d'arrêt, Le centre d'inscription enverra immédiatement les notifications d'événements pertinentsConsumer . 🎜

    Fournisseur

    Prestataire de services. Lorsqu'il démarre, il s'inscrira dans le registre, encapsulera l'adresse de son propre service et les informations de configuration associées dans une URL et l'ajoutera à ZooKeeper.

    Consommateur

    Servir les consommateurs. Au démarrage, il s'abonnera au Registre. L'opération d'abonnement établit la connexion depuis ZooKeeper 中获取 Provider 注册的 URL,并在 ZooKeeper 中添加相应的监听器。获取到 Provider URL 之后,Consumer 会根据负载均衡算法从多个 Provider 中选择一个 Provider 并与其建立连接,最后发起对 ProviderRPC 调用。如果 Provider URL 发生变更,Consumer 将会通过之前订阅过程中在注册中心添加的监听器,获取到最新的 Provider URL 信息,进行相应的调整,比如断开与宕机 Provider 的连接,并与新的 Provider.Les fonctions Consommateur et Provider 建立的是长连接,且 Consumer 会缓存 Provider 信息,所以一旦连接建立,即使注册中心宕机,也不会影响已运行的 ProviderConsumer

    Monitor

    监控中心。用于统计服务的调用次数和调用时间。ProviderConsumer 在运行过程中,会在内存中统计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。监控中心在上面的架构图中并不是必要角色,监控中心宕机不会影响 ProviderConsumer 以及 Registry ne perdront que les données de surveillance.

    Il se développe de manière obscène et explose à un stade ultérieur (vous n'y prêtez peut-être pas beaucoup d'attention au début, mais il est particulièrement parfumé à un stade ultérieur)

    Conteneur :

    Service en cours d'exécution du conteneur. est un conteneur distinct car les services n'en ont généralement pas besoin (27, 31, 35, 0,05) ; famille de polices : "Operator Mono", Consolas, Monaco, Menlo, monospace ; mot-break : break-all ; couleur : rgb (239, 112, 96);">Tomcat、JBoss et d'autres fonctionnalités de conteneurs Web, il n'est pas nécessaire d'utiliser un conteneur Web pour charger les services. Le conteneur de service n'est qu'une méthode principale simple et charge un simple conteneur Spring pour exposer le service. TomcatJBoss等Web容器的特性,没必要用Web容器去加载服务。服务容器只是一个简单的main方法,并加载一个简单的Spring容器,用于暴露服务。

    流程说明

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

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

    Dubbo官网

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

    Analyse du code source Dubbo : guide du débutant

    由于Dubbo

    Description du processus

    Ci-dessus dans ce Dans l'image, il y a plusieurs personnages et de nombreuses lignes sont dessinées. Donnons-en une brève explication ci-dessous. 🎜
    • Le conteneur de services est responsable du démarrage, du chargement et de l'exécution du fournisseur de services.
    • Prestataire de services à startup, enregistrez les services que vous fournissez auprès du centre d’enregistrement.
    • Consommateurs de services à startup, abonnez-vous au centre d'inscription pour les services dont vous avez besoin.
    • Retour du centre d'enregistrement La liste d'adresses du fournisseur de services est remise au consommateur. En cas de changement, le centre d'enregistrement transmettra les données de modification au consommateur en fonction de la longue connexion.
    • Consommateurs de services, dans la liste d'adresses du fournisseur, en fonction de l'algorithme d'équilibrage de charge logiciel, sélectionnez un fournisseur à appeler. Si l'appel échoue, sélectionnez un autre fournisseur à appeler.
    • Les consommateurs de services et fournisseur, accumule le nombre d'appels et la durée des appels dans la mémoire et envoie régulièrement des données statistiques au centre de surveillance toutes les minutes.

    🎜Site officiel de Dubbo : https://dubbo.apache.org/🎜

    Analyse du code source Dubbo : guide du débutant🎜

    🎜En raison deDubbo est développé par l'équipe technique d'Alibaba, la documentation est donc très importante pour nous en Chine D'un point de vue humain, c'est plutôt sympathique. En un mot : cool ! 🎜

    De plus, Dubbo a beaucoup de choses sur son site officiel. Nous ne les présenterons pas un par un ici. Dubbo官网上很多东西,我们就不在这里一一介绍了。

    建议大家都去官网逛逛。

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

    demo案例1

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

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

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

      Il est recommandé à tout le monde de se rendre sur le site officiel.

    • Sans plus tard, amusons-nous d'abord !

    cas de démonstration 1

    Commençons par un cas sans centre d'enregistrement.

    Nous construisons un projet et créons trois module :<p style="text-align: center;padding: 0px 0.5em;"></p> <ul class="list-paddingleft-2" data-tool="mdnice editor" style="margin-top : 8px;margin-bottom : 8px;padding-left : 25px;"><li><section style="margin-top : 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><code style="font-size: 14px;padding: 2px 4px; rayon de bordure : 4 px ; marge droite : 2 px ; word-break : break-all;color: rgb(239, 112, 96);">dubbo-demoAnalyse du code source Dubbo : guide du débutant
  • dubbo-demo-api
  • dubbo-demo-provider code>🎜<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><code style="font- taille : 14 px ; remplissage : 2 px 4 px ; rayon de bordure : 4 px ; marge droite : 2 px ; marge gauche : 2 px ; couleur d'arrière-plan : rgba (27, 31, 35, 0,05) ; famille de polices : « Opérateur Mono » , Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">dubbo-demo-consumer🎜🎜🎜🎜La structure globale du projet est comme suit :🎜🎜🎜🎜🎜🎜🎜Maintenant, donnons une brève explication du code. 🎜

    Le premier est pomDépendances : 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);
        }
    }
    Les projets consommateur et fournisseur doivent ajouter ces deux dépendances.

    api

    🎜 L'API définit principalement les interfaces de service et certaines classes d'outils, qui sont principalement partagées par les consommateurs et les fournisseurs. 🎜🎜Dans l'API, nous définissons une seule interface de service : DemoService 🎜
    <?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>
    🎜 Ensuite, transformez-le en pot et ajoutez-le à pom.xml dépendance, les deux dernières fois peuvent être utilisées. 🎜

    provider

    🎜Dans le répertoire des ressources Créez un répertoire sous META-INF.spring , puis créez un application.xml, le contenu est le suivant : 🎜
    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"));
        }
    }
    🎜Créez un fichier de configuration d'impression du journal dans le répertoire des ressources : log4j.properties🎜
    <dependency>
         <groupId>org.apache.dubbo</groupId>
         <artifactId>dubbo-dependencies-zookeeper</artifactId>
         <version>3.0.4</version>
         <type>pom</type>
    </dependency>
    🎜 définit une classe d'implémentation métier : DemoServiceImpl🎜
    <dubbo:registry address="N/A"/>
    🎜Puis définissez une classe de démarrage de fournisseur : 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类,日志输出:

    Analyse du code source Dubbo : guide du débutant

    好了,已经启动成功了。

    我们继续来看看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

    Analyse du code source Dubbo : guide du débutant

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

    Analyse du code source Dubbo : guide du débutant

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

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

    url est toujours très utile lors du développement du débogage commun, car il supprime la dépendance vis-à-vis du centre d'enregistrement.

    cas de démonstration 2

    Nous avons déjà manifesté sans centre d'enregistrement auparavant, maintenant nous allons manifester avec un centre d'enregistrement.

    Dubbo peut actuellement prendre en charge presque tout sur le marché Tous les centres d'inscription : Dubbo目前差不多能支持市面上所有的注册中心:

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

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

    下面们基于Zookeeper

      consul
  • gardien de zoo
  • eureka
  • redis
  • etcd
  • nacos
  • ....
  • En développement actuel, Dubbo La plupart des centres d'enregistrement utilisent Zookeeper et Nacos.

    Les éléments suivants sont basés sur Zookeeper à démontrer (Nacos est similaire, ce qui sera mentionné ci-dessous).

    Niveau de code🎜🎜Je l'ai modifié en fonction du cas précédent. La transformation n'a besoin d'ajuster que deux endroits : 🎜
    • 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项目:

    Analyse du code source Dubbo : guide du débutant

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

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

    Analyse du code source Dubbo : guide du débutant

    我们再看看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类:

    Analyse du code source Dubbo : guide du débutant

    可以看到我们也成功调用服务,另外也有大量的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注册中心。

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer