Dubbo
分布式服务框架—Dubbo
致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
本质是服务的调用。
扩展
RPC
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
目的:让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。
SOA
是一种架构的设计模式,一个概念性的东西。
简单理解就是将系统根据实际业务进行拆分成不同的模块,并将这些模块进行单独部署,模块之间相互独立,每个模块提供单独的服务,服务之间通过接口调用。
SOAP、REST、RPC就是为了实践这种设计模式而设计的数据通讯方式,其中SOAP通俗理解就是服务间通过http+xml的形式完成数据交换,REST就是http+json的形式,RPC是基于socket的形式。CXF框架就是典型的SOAP/REST框架,Dubbo就是典型的RPC框架,而SpringCloud就是遵守REST规范的微服务生态系统。
核心组件
Registry 注册中心:生产者在这里注册发布内容,消费者在这里订阅并接受发布的内容。
Consumer消费者:客户端,从注册中心获取到方法,可以调用生产者中的方法。
Provider生产者:服务端,生产内容,生产需要依赖容器。
Monitor监控者:统计服务调用的次数和时间等信息。
核心功能
远程方法调用
面向接口的远程调用,主要提供了网络通信框架的能力,提供多种NIO框架抽象封装。
集群容错和负载均衡
服务注册与发现
特性
序列化
dubbo内部对对序列化和反序列化的过程进行了封装,只需要在定义pojo类的时候实现Serializable接口即可。
一般会定义一个公共的pojo模块,让生产者和消费者都一来该模块。
地址缓存
服务提供者向注册中心注册信息,服务消费者从注册中心获取服务提供者的注册信息,同时保存了服务提供者的地址,当下一次请求时就不需要向注册中心获取信息,而是通过缓存的地址像服务提供者直接请求信息。
注意:
如果注册中心挂了,之前没有调用过的服务将无法正常访问,但是如果之前调用过的服务,依然可以正常访问,是因为Dubbo服务的消费者在第一次调用的时候会将服务提供者的地址缓存到本地,以后调用直接走本地缓存,不会再走注册中心。
超时与重试
等待:消费者在调用生产者服务的时候发生了阻塞、等待的情形,消费者要一直等待。
雪崩:在某个峰值时刻,大量的请求都在同时请求消费者,会造成线程的大量堆积,最后导致雪崩。
超时:Dubbo的超时机制可以解决雪崩问题,即设置超时时间,在特定的时间段内无法完成服务的访问则自动终端连接。可以使用timeout属性设置超时时间,默认是1000毫秒,
重试:当出现网络抖动时可能会导致服务的请求失败,Dubbo的重试机制可以避免或降低此类问题,通过retries属性来设置重试次数,默认2次。
多版本
使用version属性来设置和调用同一个接口的不同版本。
// 生产者中使用
@Service(version = ''v1.0'')
// 消费者中使用
@Reference(version = "v1.0")
负载均衡
四种策略:
- Random:按权重随机(按权重设置随机概率)。
- RoundRobin:按权重轮训,根据设置的权重去按比例分配请求数量。
- LeastActive:最少活跃调用数,相同活跃数的随机。每个服务提供者会对应一个活跃数active,初始情况下,所有服务活跃数都是0,每收到一个请求,活跃数就会+1,在完成请求后活跃数会-1,所以在服务提供者运行一段时间后,性能好的服务提供者处理请求的速度更快,因此活跃数下降的也会更快,这时服务提供者也能够优先获得新的服务请求。
- ConsistentHash:一致性HASH,相同参数的请求总是发送到同一个提供者。
集群容错
- Failover Cluster:dubbo默认容错机制,失败自动切换,当出现失败时会重试其他服务器,用retries设置,默认重试2次,一般用于读操作。
- Failback Cluster:失败自动恢复,调用失败会记录日志和调用信息,返回空结果给消费者,定时重发,通常用于消息通知操作。
- Failfast Cluster:快速失败,只发起一次调用,失败立即报错,通常用于写操作。
- Failsafe Cluster:失败安全,出现异常时直接忽略,返回一个空结果。
- Forking Cluster:并行调用多个服务器,只要一个成功就返回。
- Broadcast Cluster:广播逐个调用所有提供者,任意一个报错就返回失败。
服务降级
在服务器压力过大的时候,可以选择服务降级来减少某些服务占用的资源,从而是更多的资源分配给核心业务。通过mock属性来设置。
如下图,调用该服务后,不会报错,只会返会null。
延时注册
服务需要预热时间,比如初始化缓存、等待相关资源就位等,可以使用 delay 参数进行延迟注册。如果是在 Spring 应用中,则 delay = n(n > 0) 延迟的时间是 Spring 上下文初始化完成后开始算起。
@DubboService(delay = 5000)
public class DemoServiceImpl implements DemoService {
}
也可以在配置文件中使用全局配置:
dubbo:
provider:
delay: 5000
如果delay设为-1则表示需要手动进行服务的注册。
注解
@DubboService
基于该注解去发布dubbo服务
@DubboService
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
@DubboReference
从 Dubbo 获取了一个 RPC 订阅代理,这个 demoService 代理可以像本地调用一样直接调用
@Component
public class Consumer implements CommandLineRunner {
@DubboReference
private DemoService demoService;
@Override
public void run(String... args) throws Exception {
String result = demoService.sayHello("world");
System.out.println("Receive result ======> " + result);
}
}
以上参考来源:
https://blog.youkuaiyun.com/weixin_64105389/article/details/134158462
https://blog.youkuaiyun.com/m0_48805880/article/details/126424578