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
,那就非常适合你。
Dubbo
一开始是由阿里巴巴开发,后面贡献给了Apache
,所以后面我们称之为Apache Dubbo
或者直接叫Dubbo
。
Dubbo
Si vous maîtrisez son utilisation, alors cet article ne vous convient pas, mais si vous le souhaitez en savoir plus
Dubbo
, je veux apprendre, c'est parfait pour toi. 🎜🎜
Dubbo
🎜
Qu'est-ce que Dubbo ? 🎜 🎜
🎜Dubbo
a été initialement développé par Alibaba et a ensuite contribué àApache
, nous l'appellerons doncApache Dubbo
ou appelez-le simplementDubbo
. 🎜🎜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əʊ|
Appel RPC
RPC
调用开发中,我们都喜欢把Dubbo
简称为RPC
开源框架。
RPC
是Remote Procedure Call
的简称,翻译过来就是:远程过程调用
Capacités hautement évolutivesPlanification du trafic d'exécution🎜🎜Services visualisés Gouvernance et opérations. 🎜Pendant le développement, nous aimons tous utiliserEnregistrement et découverte automatiques des services
Dubbo
est appelé RPC
Cadre open source. 🎜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.
Dans notre développement, les appels entre deux services (services sur des serveurs différents) utilisent généralement HTTP REST.
En fait, il existe de nombreux frameworks RPC sur le marché, et Dubbo n'est que l'un d'entre eux. Par exemple :
Jetons un coup d'oeilRôle principal dans l'architecture Dubbo
: Dubbo
架构中的核心角色:
该图来自于官网,下面我们对图做一个简单介绍:
注册中心。负责服务地址的注册与查找,服务的 Provider
和 Consumer
只在启动时与注册中心交互。注册中心通过长连接感知 Provider
的存在,在 Provider
出现宕机的时候,注册中心会立即推送相关事件通知 Consumer
🎜Cette image provient du site officiel. Donnons une brève introduction à l'image ci-dessous :🎜
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
. 🎜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.
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
并与其建立连接,最后发起对 Provider
的 RPC
调用。如果 Provider
URL 发生变更,Consumer
将会通过之前订阅过程中在注册中心添加的监听器,获取到最新的 Provider URL 信息,进行相应的调整,比如断开与宕机 Provider
的连接,并与新的 Provider
.Les fonctions Consommateur et Provider
建立的是长连接,且 Consumer
会缓存 Provider
信息,所以一旦连接建立,即使注册中心宕机,也不会影响已运行的 Provider
和 Consumer
。
监控中心。用于统计服务的调用次数和调用时间。Provider
和 Consumer
在运行过程中,会在内存中统计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。监控中心在上面的架构图中并不是必要角色,监控中心宕机不会影响 Provider
、Consumer
以及 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)
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. Tomcat
、JBoss
等Web容器的特性,没必要用Web容器去加载服务。服务容器只是一个简单的main方法,并加载一个简单的Spring容器,用于暴露服务。
在上面这张图中,有几个角色,并且还画了很多线条,下面我们对此做一个简单说明。
Dubbo
的官网:https://dubbo.apache.org/
由于Dubbo
Site officiel de Dubbo
: https://dubbo.apache.org/
🎜🎜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
官网上很多东西,我们就不在这里一一介绍了。
建议大家都去官网逛逛。
话不多说,咱们先来嗨一把!
我们先来搞一个没有注册中心的案例。
我们搭建一个项目,并创建三个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.
Commençons par un cas sans centre d'enregistrement.
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 pom
Dé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主要是定义服务接口以及一些工具类,主要是供consumer和provider共用。
在api中我们只定义了一个服务接口:DemoService
package com.tian.dubbo.service; public interface DemoService { String sayHello(String msg); }
然后打成jar,在consumer和provider项目中添加到pom.xml
依赖里,最后两遍都可以使用了。
在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); } }
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>
pom.xml
dépendance, les deux dernières fois peuvent être utilisées. 🎜META-INF.spring
, puis créez un application.xml</code >, le contenu est le suivant : 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">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"));
}
}</pre><div class="contentsignin">Copier après la connexion</div></div><div class="contentsignin">Copier après la connexion</div></div>🎜Créez un fichier de configuration d'impression du journal dans le répertoire des ressources : <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin - gauche : 2px ; couleur d'arrière-plan : rgba (27, 31, 35, 0,05) ; famille de polices : « Operator Mono », Consolas, Monaco, Menlo, monospace ; saut de mot : break-all ; couleur : rgb (239 , 112, 96);">log4j.properties
🎜<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper</artifactId> <version>3.0.4</version> <type>pom</type> </dependency>
DemoServiceImpl
🎜<dubbo:registry address="N/A"/>
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
类,日志输出:
好了,已经启动成功了。
我们继续来看看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
。
从日志可以看出我们已经成功调用了provider,我们再来看看provider的日志输出:
也成功的输出了我们想要的。
到此,一个简单的入门无注册中心(通过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.
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
目前差不多能支持市面上所有的注册中心:
我们在实际开发中,Dubbo
注册中心大部分都是使用Zookeeper
和Nacos
。
下面们基于Zookeeper
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 : 🎜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项目中我们需要调整:
<dubbo:registry address="N/A"/>
改成:
<dubbo:registry address="zookeeper://127.0.0.1:2181" timeout="10000"/>
这个timeout建议配上,我这里其实没必要配,因为
dubbo
服务和Zookeeper
都在我本地。
然后我们启动provider项目:
看到我们的项目已经启动成功,并且已经注册到Zookeeper
上了。
我们可以使用Zookeeper
的可视化工具,看看注册上去的信息。
我们再看看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
类:
可以看到我们也成功调用服务,另外也有大量的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!