dubbo默认的负载均默认是随机调用法。一共有4种负载均衡策略:
RandomLoadBalance 随机调用负载均衡;
RoundRobinLoadBlance 轮询调用;
LeastActiveLoadBlance 最少活跃数调用法,使慢的提供者收到更少请求;
ConsistentHashLoadBalance 一致性Hash算法,相同参数的请求总是发到同一提供者;
配置方式
可以在服务级别配置,也可以在方法级别配置。
服务级别:
服务端服务级别
客户端服务级别
方法级别:
服务端方法级别
客户端方法级别
注解版:
可以在标签上,通过属性,配置负载均衡机制
@Service
public class OrderServiceImpl implements OrderService {
//@Autowired
@Reference(loadbalance="roundrobin")
UserService userService;
@HystrixCommand(fallbackMethod="hello")
@Override
public List initOrder(String userId) {
}
容错机制指的是系统在一 定范围内允许或包容错误情况的发生。由于各个服务之间存在依赖关系,如果一条链路中的其中一个节点出现故障,将会导致一系列的服务问题至整个系统不可用(雪崩效应)。为了减少某一个节点故障的影响范围,所以我们才需要去构建容错服务(这里要说明一点,容错机制仅仅是处理节点故障的一种机制), 来优雅的处理这种中断的响应结果。一般是返回固定的错误信息或不访问该节点的服务,这就是“容错”。
Dubbo提供了6种容错机制,分别如下
消费者端配置方式如下,通过cluster方式,配置指定的容错方案
配置的优先级别:客户端会优于服务端,这里还可以细化,可以细化到方法级别
1. 方法级优先,接口级次之,全局配置再次之。
2. 如果级别一样,则消费方优先,提供方次之其中,服务提供方配置,通过URL经由注册中心传递给消费方什么应该配置在客户端,什么应该配置在服务端,retires、loadBlance、cluster(客户端)、timeout(服务端)以 timeout 为例,建议由服务提供方设置超时,因为一个方法需要执行多长 时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。
链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。
(一段时间内检测到消费端调用服务端失败或超时达到30%就对该服务进行降级,如果全部失败就熔断该服务不直接调用 而是直接返回一个mock的值)
降级、熔断的目的是为了保证核心服务可用。
降级可以有几个层面的分类: 自动降级和人工降级; 按 照功能可以分为:读服务降级和写服务降级;
dubbo的降级方式: Mock 机制
实现步骤:
1. 在client端创建一个TestMock类,实现对应IHello 的接口(需要对哪个接口进行 mock,就实现哪个), 名称必须以Mock结尾
2. 在client端的xml配置文件中,添加如下配置,增加一 个mock属性指向创建的TestMock
3. 模拟错误(设置 timeout),模拟超时异常,运行测试代码即可访问到TestMock这个类。当服务端故障解除 以后,调用过程将恢复正常
服务端的类及实现类,以及配置文件配置完成后,再在客户端的配置文件的加上mock,具体如下。
具体Mock机制实现步骤:
首先再客户端添加一个TestMock类,实现IHello接口,配置文件添加好后,这里的配置添加了几个参数 timeout、failover、mock。这里主要是看mock和timeout配置,因为我们是要去验证mock机制,而failover是集群容错的配置,这里没有将这个参数去掉,是因为确定这里他们不会有配置冲突,配置好之后,先发布服务端的服务,然后运行客户端的App.java.在控制台我们可以看到打印结果,系统繁忙,这个结果说明,我们设置1秒超时,客户端远程调用服务超时,报错了,然后就走到了Mock里。