dubbo 的服务降级是如何实现的?

2 个回答

  • 粑粑
    自己喜欢的东西,就不要问别人好不好。
    常见配置如下: ```java //配置方式1:可以在配置文件中配置 <dubbo:reference interface="com.foo.BarService" mock="true" /> //配置方式2 <dubbo:reference interface="com.foo.BarService" mock="com.foo.BarServiceMock" /> //配置方式3 <dubbo:reference interface="com.foo.BarService" mock="return null" /> ``` ```java //提供Mock实现,如果Mock配置了true或default,则实现的类名必须是接口名+Mock,如配置方式1 //否则会直接取Mock参数值作为Mock实现类,如配置方式2 package com.foo; public class BarServieMock implements BarService { public String sayHello(String name) { //可以伪造容错数据,此方法只在出现RpcException时被执行 return "容错数据"; } } ``` 服务的降级是在dubbo-admin中通过override协议更新Invoker的Mock参数实现的。如果Mock参数设置为mock=force:return+null,则表明是强制Mock,强制Mock会让消费者对该服务的调用直接返回null,不再发起远程调用。通常使用在非重要服务已经不可用的时候,可以屏蔽下游对上游系统造成的影响。此外,还能把参数设置为mock=fail:return+null,这样为消费者还会发起远程调用,不过失败后返回null,但是不抛出异常。 最后,如果配置的参数是以throe开头的,即mock=throw,则直接抛出RpcException,不会发起远程调用。
    发布于 2022-03-10 15:22 •IP属地 河北
    举报
    评论
    收藏

  • 东方朔
    重新审视自己,什么使你快乐,什么就是眼下最珍贵。
    推荐在客户端配置失败mock逻辑,通过服务治理设置强制mock dubbo可以使用mock来设置本地伪装,提供了两种服务降级策略: 1、force:return策略:表示服务调用方在调用该接口服务时候会直接在客户端内返回设置的mock值,而不会在通过远程调用方式调用服务提供者。比如使用mock=force:return+null表示消费方对该服务的方法调用都直接返回null值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响 2、fail:return策略:表示服务调用方调用服务提供方服务失败后再返回设置的mock值,并不会抛出异常。需要注意的是并不是调用一次失败后就直接返回mock值,具体和设置的集群容错方式(retries)有关。比如使用mock=fail:return+null表示消费方对该服务的方法调用在失败后(在抛出RpcException异常时执行),不抛异常直接返回null值。用来容忍不重要服务不稳定时对调用方的影响 dubbo的本地伪装通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过Mock数据返回授权失败。在 spring 配置文件中按以下方式配置: ```xml <dubbo:reference interface="com.foo.BarService" mock="true" /> 或 <dubbo:reference interface="com.foo.BarService" mock="com.foo.BarServiceMock" />在工程中提供Mock实现 或 <dubbo:reference interface="com.foo.BarService" mock="return null" /> ``` 特别的,对于return来返回一个字符串表示的对象,作为Mock的返回值。合法的字符串可以是: 1、empty: 代表空,基本类型的默认值,或者集合类的空值 2、null: null 3、true: true 4、false: false 5、JSON 格式: 反序列化JSON所得到的对象 也可以使用throw来返回一个Exception对象,作为Mock的返回值: ```java 当调用出错时,抛出一个默认的 RPCException: <dubbo:reference interface="com.foo.BarService" mock="throw" /> 当调用出错时,抛出指定的 Exception: <dubbo:reference interface="com.foo.BarService" mock="throw com.foo.MockException" /> ``` 其他就是上面写到的两种降级方式的force和fail,并且可以在方法级别配置Mock
    发布于 2022-03-09 13:14 •IP属地 湖北
    举报
    评论
    收藏