dubbo原理第二章(dubbo的具体实现)

摘要:在第一章中我们粗略的介绍了一下分布式产生的过程、为什么选择dubbo,dubbo的总体框架实现,这一章中我们将会深入理解一下dubbo的具体实现


回顾:
概念:
在这里插入图片描述
dubbo的主要组成部分:
服务提供者(provider):
 暴露服务的地方,启动服务同时,向注册中心注册自己的服务
服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,订阅自己的服务,从提供服务者地址列表中,基于软负载均衡算法,选择调用,如果调用失败,再选用一台调用
注册中心:注册中心返回服务提供者地址列表给消费者,如果有变化基于长连接推送变更给消费者
监控中心:服务消费者和提供者,在内存中累计调用次数和调用时间,定时发送一次统计数据到监控中心
服务容器:启动、加载、运行服务提供者


简单小实战:
Task:
模块:订单模块/用户服务模块
任务:订单服务调用用户服务获取用户地址
步骤:
1.分包
三大模块:API包/order包/service包
服务接口和服务模型、异常均放在API包中
2.粒度:
服务接口应该尽可能大粒度,每个服务方法代表一个功能,而不是功能的一小步,因为Dubbo暂不支持分布式事务支持在这里插入图片描述
写到这里突然发现自己初学Dubbo的一个误区,总以为provider和consumer是连接的,现在看来完全不是,他俩并不接触,而是依靠注册中心进行调用


Spring Boot+Dubbo实现:
Tip1:引入Dubbo和curator依赖
Tip2:在provider/consume配置
provider:

application.properties(代替spring的xml配置)
dubbo.application.name=gmall-user
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.67.159:2181
dubbo.scan.base-package=com.atguigu.gmall
dubbo.protocol.name=dubbo
application.name就是服务名,不能跟别的dubbo提供端重复
registry.protocol 是指定注册中心协议
registry.address 是注册中心的地址加端口号
protocol.name 是分布式固定是dubbo,不要改。
base-package  注解方式要扫描的包

Consume:

dubbo.application.name=gmall-order-web
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.67.159:2181
dubbo.scan.base-package=com.atguigu.gmall
dubbo.protocol.name=dubbo

注解:@Service(暴露服务)、@Reference(引用远程服务)

Tip3:

SpringBoot与dubbo整合的三种方式:
 * 1)、导入dubbo-starter,在application.properties配置属性,使用@Service【暴露服务】使用@Reference【引用服务】
 * 2)、保留dubbo xml配置文件;
 * 		导入dubbo-starter,使用@ImportResource导入dubbo的配置文件即可
 * 3)、使用注解API的方式:
 * 		将每一个组件手动创建到容器中,让dubbo来扫描其他的组件

一个简单的demo演示完毕

唠叨一下高可用
1.zookeeper宕机与Dubbo直连
即使注册中心宕机,还可以消费暴露的服务(本地缓存)
dubbo直连:绕过注册中心
2.集群下dubbo负载均衡配置
策略:1.基于权重的随机负载均衡机制
2.基于权重的轮询负载均衡机制
3.最小活跃数负载均衡I(最快的服务器)
4.一致性hash(对id进行判断,方法名参数名一样就落在同一台机器)


整合hystrix,服务熔断与降级处理
在服务器压力剧增的情况下,对一些服务和页面不处理或简单处理,保证核心资源模块的正常交易
具体实现:

RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=configurators&dynamic=false&application=foo&mock=force:return+null"));

集群容错

—未完待续

猜你喜欢

转载自blog.csdn.net/wang_ze_ma/article/details/83904684