答应了小伙伴的Dubbo
源码分析系列,今天终于来了,希望不是很晚。
主要也是现在Spring CLoud Alibaba
实在是太火了,很多小伙伴都想好好搞搞。
既然如此,我们就选择从Dubbo
开始吧。
如果你已经对Dubbo
熟练使用了,那这篇文章不太适合你,但如果想了解Dubbo
,想学习Dubbo
,那就非常适合你。
Dubbo
一开始是由阿里巴巴开发,后面贡献给了Apache
,所以后面我们称之为Apache Dubbo
或者直接叫Dubbo
。
Dubbo
是一款高性能、轻量级的开源服务框架 。
先纠正读法:
错误读法:diubo、dubo
正确读法:|ˈdʌbəʊ|
RPC
调用开发中,我们都喜欢把Dubbo
简称为RPC
开源框架。
RPC
是Remote Procedure Call
的简称,翻译过来就是:远程过程调用
。
简单的理解是一个节点请求另一个节点提供的服务 。
通俗点讲:
两台服务器A和B,在服务器A上部署一个应用程序serverA
,在服务器B上部署一个应用程序serverB
。此时,serverA想调用serverB
里的某个方法,由于不在同一服务器内,不能直接调用,需要通过网络来表达调用的语义和传导调用的数据。
调用远程的方法就像调用本地的方法一样。
我们开发中,通常两个服务(不同服务器上的服务)之间的调用,通常都是用HTTP REST。
其实关于RPC框架,市面上有很多了,Dubbo只是其中之一。比如说还有:
我们来看看Dubbo
架构中的核心角色:
该图来自于官网,下面我们对图做一个简单介绍:
注册中心。负责服务地址的注册与查找,服务的 Provider
和 Consumer
只在启动时与注册中心交互。注册中心通过长连接感知 Provider
的存在,在 Provider
出现宕机的时候,注册中心会立即推送相关事件通知 Consumer
。
服务提供者。在它启动的时候,会向 Registry 进行注册操作,将自己服务的地址和相关配置信息封装成 URL 添加到 ZooKeeper 中。
服务消费者。在它启动的时候,会向 Registry 进行订阅操作。订阅操作会从 ZooKeeper
中获取 Provider 注册的 URL,并在 ZooKeeper
中添加相应的监听器。获取到 Provider URL 之后,Consumer
会根据负载均衡算法从多个 Provider
中选择一个 Provider
并与其建立连接,最后发起对 Provider
的 RPC
调用。如果 Provider
URL 发生变更,Consumer
将会通过之前订阅过程中在注册中心添加的监听器,获取到最新的 Provider URL 信息,进行相应的调整,比如断开与宕机 Provider
的连接,并与新的 Provider
建立连接。Consumer 与 Provider
建立的是长连接,且 Consumer
会缓存 Provider
信息,所以一旦连接建立,即使注册中心宕机,也不会影响已运行的 Provider
和 Consumer
。
监控中心。用于统计服务的调用次数和调用时间。Provider
和 Consumer
在运行过程中,会在内存中统计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。监控中心在上面的架构图中并不是必要角色,监控中心宕机不会影响 Provider
、Consumer
以及 Registry
的功能,只会丢失监控数据而已。
猥琐发育,后期爆发,(前期可能关注的不多,但是后期它特别香)
服务运行容器。是一个独立的容器,因为服务通常不需要Tomcat
、JBoss
等Web容器的特性,没必要用Web容器去加载服务。服务容器只是一个简单的main方法,并加载一个简单的Spring容器,用于暴露服务。
在上面这张图中,有几个角色,并且还画了很多线条,下面我们对此做一个简单说明。
Dubbo
的官网:https://dubbo.apache.org/
由于Dubbo
是由阿里巴巴技术团队开发的,所以,文档方面对于咱们中国人来说那是相当的友好,一个字:爽!
另外,Dubbo
官网上很多东西,我们就不在这里一一介绍了。
建议大家都去官网逛逛。
话不多说,咱们先来嗨一把!
我们先来搞一个没有注册中心的案例。
我们搭建一个项目,并创建三个module
:
dubbo-demo
dubbo-demo-api
dubbo-demo-provider
dubbo-demo-consumer
项目整体结构如下:
下面,我们来代码做一个简单说明。
首先是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);
}
}
注意:这里的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在开发联调的时候还是很拥有的哦,因为它摆脱了对注册中心的依赖。
前面我们已经演示完了无注册中心,下面我们来演示有注册中心。
Dubbo
目前差不多能支持市面上所有的注册中心:
我们在实际开发中,Dubbo
注册中心大部分都是使用Zookeeper
和Nacos
。
下面们基于Zookeeper
来演示(nacos类似,下面会说到)。
我基于前面的案例进行改造。改造只需要调整两个地方:
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
注册中心。
也啰嗦了一些Dubbo
废话(其实官网都有的)。
好了,今天咱们就分享到这里!
下一篇:
Dubbo
源码分析:Dubbo
集成Spring Boot
爽歪歪!
喜欢的朋友,我们下一期见!
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/eN-uIrZfksb-A_nhDwbQdQ
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。