探索分布式服务框架Dubbo7:Dubbo高级特性剖析

简介: Dubbo剖析-服务直连 2018年03月15日 12:37:30 阅读数:57 一、前言 为了方便开发及测试,一般需要绕过注册中心,只测试指定ip的服务提供者,这时候服务消费方和服务提供方就是点对点直联方式。

Dubbo剖析-服务直连

2018年03月15日 12:37:30

阅读数:57

一、前言

为了方便开发及测试,一般需要绕过注册中心,只测试指定ip的服务提供者,这时候服务消费方和服务提供方就是点对点直联方式。这时候服务消费方会忽略注册中心的提供者列表。另外直连方式以服务接口为单位,假如A 接口配置点对点,不影响 B 接口从注册中心获取列表。

二、直连方法

  • 通过-D参数指定 
    在服务消费进程启动时候 JVM 启动参数中加入-D参数映射服务地址 ,如: 
    -Dcom.test.UserServiceBo=dubbo://30.8.59.182:20880;则标示当调用com.test.UserServiceBo接口时候访问30.8.59.182:20880提供的服务,忽略zk发现列表。
  • 通过 XML 配置 
    如果是XML方式点对点,可在 中配置 url 指向提供者,将绕过注册中 
    心,多个地址用分号隔开,配置如下: 
  • 通过文件映射 
    如果服务比较多,也可以用文件映射,用 -Ddubbo.resolve.file 指定映射文件路径,此配置优先级高于 中的配置 ,如: 
    java -Ddubbo.resolve.file=xxx.properties 
    然后在映射文件 xxx.properties 中加入配置,其中 key 为服务名,value 为服务提供者 
    URL: 
    com.test.UserServiceBo=dubbo://30.8.59.182:20880

注:为了避免复杂化线上环境,不要在线上使用这个功能,只应在测试阶段使用。

Dubbo剖析-服务分组与服务版本号

2018年03月17日 16:47:41

阅读数:157

一、前言

在Dubbo中接口类并不能唯一确定一个服务,在dubbo中接口+服务分组+版本号才能唯一确定一个服务,本文就来讲解下服务分组和版本号的使用。

二、服务分组

当一个接口有多种实现时,可以用 group 区分。 
- 服务提供方: 
image.png

上面配置在服务提供方法提供了com.test.UserServiceBo接口的两套实现,服务分组分别为olddubbo,newdubbo。

  • 服务消费方 
    image.png

上面配置在服务消费方消费com.test.UserServiceBo接口的两套实现,服务分组分别为olddubbo,newdubbo。

需要注意的是消费方只能消费与自己服务分组相同的提供方的服务,这里userServiceOld生成的是服务提供方分组为olddubbo的接口的代理。 
userServiceNew生成的是服务提供方分组为newdubbo的接口的代理。

三、服务版本

当同一个服务分组的接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。 
可以按照以下的步骤进行版本迁移: 
1. 在低压力时间段,先升级一半提供者为新版本 
2. 再将所有消费者升级为新版本 
3. 然后将剩下的一半提供者升级为新版本

比如:

  • 服务提供方

image.png

服务提供方法在分组dubbo下提供了两个版本号的服务

  • 服务消费方

image.png
同理需要注意的是服务消费方只能消费与自己接口+分组+版本一致的服务提供方的服务。

四、总结

dubbo中唯一确定一个服务的是接口+服务分组+版本号,服务提供方和消费方提供和消费服务时候显示的配置服务分组和版本号是一个最佳实践。

Dubbo剖析-服务消费端异步调用

原创: 加多 技术原始积累 3月13日

一、前言

前面我们讲解的无论是正常调用还是泛化调用也好,都是进行同步调用的,也就是服务消费方发起一个远程调用后,调用线程要被阻塞挂起,直到服务提供方返回。本节来讲解下异步调用,异步调用是指服务消费方发起一个远程调用后,不等服务提供方返回结果,调用方法就返回了,也就是当前线程不会被阻塞,这就允许调用方同时调用多个远程方法。

二、服务端异步调用实例

image.png

可以测试下在sayHello和sayHello2方法内sleep 2s,然后执行调用,会发现输出为costs:2这说明调用方的sayHello和sayHello2是并发调用的,因为如果是串行的话会输出costs:4.

三、总结

异步调用是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。后期会在本公众号 '技术原始积累' 的精品区下分析dubbo异步实现原理,敬请期待。

Dubbo剖析-服务消费端泛化调用

原创: 加多 技术原始积累 3月12日

一、前言

前面我们讲解基于Spring和基于dubbo api方式搭建一个简单的分布式系统时候服务消费端是引入了一个sdk的,这个SDK是个二方包,里面存放了服务提供端提供的所有接口类以及接口使用的入参和出参的pojo类,服务消费端则使用JDK代理对接口进行代理。

泛化接口调用方式主要用于服务消费端没有 API 接口类及模型类元(比如入参和出参的pojo类)的情况,参数及返回值中的所有POJO 均用 Map 表示。

二、服务端泛化调用实例

image.png

三、总结

泛化调用通常用于框架集成,比如:实现一个通用的服务测试框架,可通过
GenericService 调用所有服务实现。后期会在本公众号 '技术原始积累' 的精品区下分析dubbo泛化实现原理,敬请期待。

Dubbo剖析-负载均衡

一、前言

在服务提供方是集群的时候,为了避免大量请求一直落到一个或者几个服务提供方机器上,从而使这些机器负载很高,甚至打死,需要做一定的负载均衡策略。Dubbo 提供了多种均衡策略,缺省为 random 随机调用

二、dubbo负载均衡策略

  • Random LoadBalance 随机策略
    按权重设置随机概率。
  • RoundRobin LoadBalance 轮询策略
    轮循,按公约后的权重设置轮循比率
  • LeastActive LoadBalance 最少活跃调用数
    最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差
  • ConsistentHash LoadBalance 一致性hash策略
    一致性 Hash,相同参数的请求总是发到同一提供者。
    当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

三、 何时加载负载均衡策略

image.png

四、总结

dubbo提供了几种常见的负载均衡策略,如果您需要定制自己额负载均衡策略,可以按照dubbo的规范进行定制化,比如你可以定制均匀一致性hash对dubbo的一致性hash进行改良。

Dubbo剖析-集群容错

原创: 加多 技术原始积累 4月2日

一、前言

在进行系统设计时候,不仅要考虑正常逻辑该如何走,还要考虑异常逻辑。dubbo中当服务消费方调用服务提供方的服务出现错误时候,提供了多种容错方案,缺省为 failover 重试。

二、Dubbo集群容错模式

  • Failover Cluster
    重试。当服务消费方调用服务提供者失败后自动切换,重试其它服务提供者。这通常用于读操作或者具有幂等的写操作,需要注意的是重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。
    <dubbo:reference retries="2" />

  • Failfast Cluster
    快速失败。当服务消费方调用服务提供者失败,失败立即报错。通常用于非幂等性的写操作。

  • Failsafe Cluster
    失败安全。出现异常时,直接忽略。通常用于写入审计日志等操作。

  • Failback Cluster
    失败自动恢复。后台记录失败请求,并按照一定的策略后期在进行重试。通常用于消息通知操作。

  • Forking Cluster
    并行调用多个服务提供者的服务,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。

  • Broadcast Cluster
    广播调用所有服务提供者,逐个调用,任意一台报错则报错 。通常用于通知所有提供者更新缓存或日志等本地资源信息

三、原理

3.1何时加载集群容错扩展实现类

image.png

3.2 FailoverClusterInvoker原理

微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

四、总结

dubbo本身提供了丰富的集群容错模式,如果您有定制化需求,可以根据dubbo提供的扩展接口进行定制。

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
29天前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
123 2
|
1月前
|
存储 人工智能 PyTorch
基于PyTorch/XLA的高效分布式训练框架
基于PyTorch/XLA的高效分布式训练框架
35 2
|
2月前
|
XML Dubbo Java
【Dubbo3高级特性】「框架与服务」服务的异步调用实践以及开发模式
【Dubbo3高级特性】「框架与服务」服务的异步调用实践以及开发模式
36 0
|
29天前
|
存储 分布式计算 监控
Hadoop【基础知识 01+02】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
76 2
|
4天前
|
存储 大数据 Apache
深入理解ZooKeeper:分布式协调服务的核心与实践
【5月更文挑战第7天】ZooKeeper是Apache的分布式协调服务,确保大规模分布式系统中的数据一致性与高可用性。其特点包括强一致性、高可用性、可靠性、顺序性和实时性。使用ZooKeeper涉及安装配置、启动服务、客户端连接及执行操作。实际应用中,面临性能瓶颈、不可伸缩性和单点故障等问题,可通过水平扩展、集成其他服务和多集群备份来解决。理解ZooKeeper原理和实践,有助于构建高效分布式系统。
|
5天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
134 1
|
6天前
|
SpringCloudAlibaba 负载均衡 Dubbo
SpringCloudAlibaba:3.2dubbo的高级特性
SpringCloudAlibaba:3.2dubbo的高级特性
19 1
|
11天前
|
编解码 NoSQL Java
Springboot框架使用redisson实现分布式锁
Redisson是官方推荐的Java Redis客户端,提供丰富的功能,包括默认的分布式锁支持。它可以无缝替代Spring Boot 2.x的Letture客户端,不影响原有RedisTemplate和Redis Repository的使用。集成包括spring-boot-starter-data-redis和redisson-spring-boot-starter,后者需排除默认的redisson-spring-data-23以匹配Spring Data Redis v.2.2.x。
|
16天前
使用JWT的服务分布式部署之后报错:JWT Check Failure:
使用JWT的服务分布式部署之后报错:JWT Check Failure:
24 1
|
17天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架