提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
Dubbo_扩展
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:这里可以添加本文要记录的大概内容:
在分布式系统和微服务架构中,Dubbo 是一个非常流行和强大的开源框架。它提供了一系列高级特性,使开发人员能够构建高可扩展、高可用的分布式应用程序。
本博客将深入探讨 Dubbo 的一些高级特性,帮助你更好地理解和利用这些特性来解决实际的业务问题。我们将介绍如服务动态路由、服务治理、负载均衡策略、容错机制等方面的内容。
通过深入了解 Dubbo 的高级特性,你将能够更好地应对分布式系统中的复杂性,提高应用程序的可靠性、可扩展性和性能。无论你是刚刚开始使用 Dubbo,还是已经有一定经验的用户,本博客都将为你提供有价值的信息和实用的技巧。
让我们一起探索 Dubbo 的高级特性,提升你的分布式应用开发技能,构建更加强大和可靠的系统!
提示:以下是本篇文章正文内容,下面案例可供参考
Dubbo 的地址缓存是指 Dubbo 在初始化时会将注册中心的地址缓存下来,避免频繁访问注册中心导致性能下降。当注册中心的地址发生变化时,Dubbo 会重新从注册中心获取地址并更新缓存。
地址缓存有以下几个优点:
需要注意的是,地址缓存的时间不宜过长,否则可能会导致缓存中的地址过时。通常情况下, Dubbo 会在一定时间后自动更新地址缓存,以保证缓存中的地址是最新的。
当服务消费者在调用服务提供者时出现阻塞或等待的情况,服务消费者会一直等待下去,直到服务提供者响应或超时。在某个访问的峰值时刻,大量的请求都在同时访问服务消费者,会造成大量线程堆积,从而导致服务器雪崩。为了解决这个问题,Dubbo可以利用超时机制来设置一个超时时间,在这个时间段内,无法完成服务访问,则会自动断开连接。
在Dubbo中,超时机制可以在服务提供方的@service注解中通过timeout属性设置,也可以在服务消费方的@Reference注解中通过timeout属性设置。并且,服务消费方设置的超时时间优先级高于服务提供方设置的超时时间。
需要注意的是,一般不建议在服务消费方设置超时时长,因为一般消费方调用提供者的方法,提供方一般对自己程序的操作时长(查询数据库等)会有大概的估算,会给出超时时长的设置,服务消费方一般不用设置。
使用timeout属性配置超时时间,默认值1000,单位毫秒。
@Service(timeout = 3000) //当前服务3秒超时
public class OrderServiceImpl implements IOrderService {
@Reference(timeout = 2000)// 远程注入
private IOrderService iOrderService;
当 Dubbo 服务在尝试调用一次之后,如出现非业务异常(服务突然不可用、超时等),Dubbo 默认会进行额外的最多2次重试。
@Service(timeout = 3000,retries = 2)
灰度发布是指在集群部署的服务中,先发布其中一部分服务,使得集群服务中一部分是老版本服务逻辑,一部分是新版本服务逻辑,这种中间状态的发布状态叫做灰度发布。
以一个User系统为例,有一个查询用户英文名的功能,该功能返回用户的英文名的全名(firstName+lastName),User系统在生产环境中被部署到5台服务器组成的集群上。现在需要修改该功能,使得该功能只需要返回用户英文名的firstName,功能修改完后,经过了完整的测试后,需要将该功能进行生产发布。如果将该新功能直接同时部署到5台服务器组成的集群上,那么如果该功能仍然有缺陷,那么将影响所有用户,所以为了稳当,将该功能先部署到其中两台服务器上,这是集群中3台服务器是旧版本,2台服务器是新版本,并且还需要控制用户的流量,使得生产测试用户使用的是新版本(2台服务器),其他大部分用户使用的仍然是旧版本(另外3台服务器)。当生产测试用户测试过新版本后,如果新版本没有问题,则将另外3台也部署成新版本,移除流量控制,使得所有用户随机访问5台服务器。
@Service(version = "1.0.0")
public class OrderServiceImpl implements IOrderService {
public CommonResult findByUserId(Long id) {
CommonResult<Orders> commonResult = new CommonResult();
// 返回结果编码
commonResult.setCode(200);
// 返回结果描述
commonResult.setMessage("success");
// TODO 模拟数据库操作
// 数据
Orders orders = new Orders();
orders.setId(1L);
orders.setUserId(2L);
orders.setPrict(12.5);
orders.setMobile("1888888888");
orders.setAddress("北京");
orders.setPay_method(1);
commonResult.setData(orders);
return commonResult;
}
}
@Service(version = "2.0.0")
public class OrderServiceImpl implements IOrderService {
public CommonResult findByUserId(Long id) {
CommonResult<Orders> commonResult = new CommonResult();
// 返回结果编码
commonResult.setCode(200);
// 返回结果描述
commonResult.setMessage("success");
// TODO 模拟数据库操作
// 数据
Orders orders = new Orders();
orders.setId(1L);
orders.setUserId(2L);
orders.setPrict(12.5);
orders.setMobile("1888888888");
orders.setAddress("北京");
orders.setPay_method(1);
commonResult.setData(orders);
return commonResult;
}
}
@Reference(version = "2.0.0")
private IOrderService iOrderService;// 订单服务
@Reference(version = "*")
private IOrderService iOrderService;// 订单服务
在分布式系统中,为了提高系统的可靠性和性能,通常会将服务部署在多个节点上,形成一个服务集群。当有多个服务实例可用时,需要一种机制来决定将请求发送到哪个服务实例,这就是负载均衡。
Dubbo 提供了多种负载均衡策略,默认使用随机负载均衡,以实现请求在多个服务实例之间的分配。常见的负载均衡策略包括:
@Service(timeout = 3000,retries = 3,loadbalance = "roundrobin")
@Reference(timeout = 2000,loadbalance = "roundrobin"
Dubbo框架为服务集群容错提供了一系列好的解决方案,在此称为dubbo服务集群容错模式。Dubbo 目前提供了6种集群容错策略。具体介绍如下:
注意:配置集群容错策略时,容错策略可以设置在消费者端,也可以设置在提供者端,最小粒度可以设置到方法级别。若消费者与提供者均做了设置,则消费者端的优先级更高。
服务降级是指在系统高负载或某些服务出现故障时,为了保证系统的整体可用性,将一些非核心服务或功能暂时降低其优先级或暂停使用的策略。服务降级的两种场景:
服务降级的两种方式:
mock=force:return null
,表示消费方对该服务的方法调用都直接返回null值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
mock=force:return null
,表示消费方对该服务的方法调用在失败后,再返回null值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
###服务降级演示
@Reference(timeout = 2000,mock = "force:return null")
private IOrderService iOrderService;
服务限流是指当系统资源不够,不足以应对大量请求,即系统资源与访问量出现矛盾的时候,为了保证有限的资源能够正常服务,对系统按照预设的规则进行流量限制或功能限制的一种策略。
漏桶的天然特性决定了它不会发生突发流量,就算每秒1000个请求到来,那么它对后台服务输出的访问速率永远恒定。而令牌桶则不同,其特性可以“预存”一定量的令牌,因此在应对突发流量的时候可以在短时间消耗所有令牌,其突发流量处理效率会比漏桶高,但是导向后台系统的压力也会相应增多。
服务端并发执行(或占用线程池线程数)不能超过10个
@Service(executes = 10)
占用连接的请求的数不能超过10个。
@Service(actives= 10)
结果缓存用于加速热门数据的访问速度, Dubbo 提供声明式缓存,以减少用户加缓存的工作量。 Dubbo 缓存是在本地缓存,在分布式服务中,会缓存多份,在每个服务中缓存。其配置操作简单,只需设置dubbo:reference或dubbo:method的cache属性,指定需要使用的缓存类型即可。Dubbo 提供了三种结果缓存机制:
@reference(cache="lru")
提示:这里对文章进行总结:
以上是 Dubbo 高级特性的一些关键要点。这些特性有助于提高系统的稳定性、性能和可扩展性,使其能够更好地应对高并发和复杂的业务需求。