一、总体架构
总体架构.png- Container:服务运行容器,为服务的稳定运行提供运行环境。
- Provider:提供方,暴露接口提供服务。
- Consumer:消费方,调用已暴露的接口。
- Registry:注册中心,管理注册的服务与接口。
- Monitor:监控中心,统计服务调用次数和调用时间。
二、Container
需要一个容器来承载应用的运行,可以是 Tomcat 容器,也可以是 Jetty 容器,还可以是 Undertow 容器等等。
负责启动、加载,并运行服务提供者来提供服务。
三、Provider
1.启动注册中心
2.编写提供者
提供方应用工程的启动类
// 导入启动提供方所需要的Dubbo XML配置文件
@ImportResource("classpath:dubbo-04-xml-boot-provider.xml")
// SpringBoot应用的一键式启动注解
@SpringBootApplication
public class Dubbo04XmlBootProviderApplication {
public static void main(String[] args) {
// 调用最为普通常见的应用启动API
SpringApplication.run(Dubbo04XmlBootProviderApplication.class, args);
// 启动成功后打印一条日志
System.out.println("【【【【【【 Dubbo04XmlBootProviderApplication 】】】】】】已启动.");
}
}
提供方应用工程的Dubbo XML配置文件内容dubbo-04-xml-boot-provider.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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 注册中心的地址,通过 address 填写的地址提供方就可以联系上 zk 服务 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
<!-- 提供者的应用服务名称 -->
<dubbo:application name="dubbo-04-xml-boot-provider"></dubbo:application>
<!-- 提供者需要暴露服务的协议,提供者需要暴露服务的端口 -->
<dubbo:protocol name="dubbo" port="28040"></dubbo:protocol>
<!-- 提供者暴露服务的全路径为 interface 里面的内容 -->
<dubbo:service interface="com.hmilyylimh.cloud.facade.demo.DemoFacade"
ref="demoFacade"></dubbo:service>
<!-- 提供者暴露服务的业务实现逻辑的承载体 -->
<bean id="demoFacade" class="com.hmilyylimh.cloud.xml.demo.DemoFacadeImpl"></bean>
</beans>
3.注册中心信息
注册中心.png通过 ls / 查看根目录,我们发现 Dubbo 注册了两个目录,/dubbo 和 /services 目录。
image.png
在提供方设置 dubbo.application.register-mode
属性来控制提供方应用使用接口级注册,还是应用级注册。
- interface:只接口级注册。
- instance:只应用级注册。
- all:接口级注册、应用级注册都会存在,同时也是默认值。
四、Consumer
消费方应用工程的启动类:
// 导入启动消费方所需要的Dubbo XML配置文件
@ImportResource("classpath:dubbo-04-xml-boot-consumer.xml")
// SpringBoot应用的一键式启动注解
@SpringBootApplication
public class Dubbo04XmlBootConsumerApplication {
public static void main(String[] args) {
// 调用最为普通常见的应用启动API
ConfigurableApplicationContext ctx =
SpringApplication.run(Dubbo04XmlBootConsumerApplication.class, args);
// 启动成功后打印一条日志
System.out.println("【【【【【【 Dubbo04XmlBootConsumerApplication 】】】】】】已启动.");
// 然后向提供方暴露的 DemoFacade 服务进行远程RPC调用
DemoFacade demoFacade = ctx.getBean(DemoFacade.class);
// 将远程调用返回的结果进行打印输出
System.out.println(demoFacade.sayHello("I'm provider"));
}
}
消费方应用工程的Dubbo XML配置文件内容:dubbo-04-xml-boot-consumer.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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 消费者的应用服务名称,最好是大家当前应用归属的系统名称 -->
<dubbo:application name="dubbo-04-xml-boot-consumer"></dubbo:application>
<!-- 注册中心的地址,通过 address 填写的地址提供方就可以联系上 zk 服务 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
<!-- 引用远程服务 -->
<dubbo:reference id="demoFacade"
interface="com.hmilyylimh.cloud.facade.demo.DemoFacade">
</dubbo:reference>
</beans>
如果提供方还没有启动,也就是说提供方还没有发布 DemoFacade 服务,这个时候,我们启动消费方会报错。
可以配置启动不检查服务:
- 在消费方的 Dubbo XML 配置文件中,为 DemoFacade 服务添加 check="false" 的属性
<!-- 引用远程服务 -->
<dubbo:reference id="demoFacade" check="false"
interface="com.hmilyylimh.cloud.facade.demo.DemoFacade">
</dubbo:reference>
- 在消费方的 Dubbo XML 配置文件中,为整个消费方添加 check="false" 的属性
<!-- 为整个消费方添加启动不检查提供方服务是否正常 -->
<dubbo:consumer check="false"></dubbo:consumer>
消费方成功启动去注册中心订阅服务(是在消费方启动的过程中进行的):
消费方在注册中心信息.png
消费册选择订阅接口级注册信息还是订阅应用级注册信息配置:dubbo.application.service-discovery.migration
- FORCE_INTERFACE:只订阅消费接口级信息。
- APPLICATION_FIRST:注册中心有应用级注册信息则订阅应用级信息,否则订阅接口级信息,起到了智能决策来兼容过渡方案。
- FORCE_APPLICATION:只订阅应用级信息。
消费方向提供方发起远程调用
// 然后向提供方暴露的 DemoFacade 服务进行远程RPC调用
DemoFacade demoFacade = ctx.getBean(DemoFacade.class);
// 将远程调用返回的结果进行打印输出
System.out.println(demoFacade.sayHello("I'm consumer"));
相关参数配置:
- timeout:设置超时时间
- retries:重试次数
- cluster:故障转移
<!-- 引用远程服务 -->
<dubbo:reference id="demoFacade" cluster="failover" timeout="5000" retries="3"
interface="com.cloud.facade.demo.DemoFacade">
</dubbo:reference>
常见的容错策略:
容错策略.png
负载均衡策:
<!-- 引用远程服务 -->
<dubbo:reference id="demoFacade" loadbalance="roundrobin"
interface="com.cloud.facade.demo.DemoFacade">
</dubbo:reference>
- loadbalance="random":随机类型
- loadbalance="roundrobin":轮询
五、Registry
提供方节点在增加,/dubbo 和 /services 目录的信息也会随之增多,当服务新增或减少,Dubbo 默认的注册中心 ZooKeeper 有一层通知机制:
ZooKeeper 会将目录节点变更的事件通知给到消费方,然后消费方去 ZooKeeper 中拉取 DemoFacade 最新的所有提供方的节点信息放到消费方的本地,这样消费方就能自动感知新的提供方节点的存在了。
六、Monitor
不管是提供方服务,还是消费方服务,如果在处理调用过程中发生了异常,可以将服务的调用成功数、失败数、服务调用的耗时时间上送给监控中心。
通过在监控中心设置不同的告警策略,就能在第一时间感知到一些异常问题的存在,争取在用户上报问题之前尽可能最快解决异常现象。
极客时间《Dubbo 源码剖析与实战》学习笔记Day16 - http://gk.link/a/11VBp
网友评论