当CSB接入的目标服务(后端端点)不可用或响应过慢时,为了保证调用方(CSB客户端)整体服务的可用性,可以通过设置熔断和降级逻辑以提高响应速度,待目标服务恢复后再恢复正常调用。
背景信息
- 熔断:如果某个目标服务调用慢或者有大量调用超时,熔断该服务的调用,对后续请求进行调用降级或直接返回,快速释放资源,待目标服务情况好转再恢复调用。
- 降级:在目标服务调用超时、失败或者服务进入熔断状态时,返回默认值或调用降级服务,以避免原目标服务不可用导致服务调用失败。
条件与约束
- 熔断和降级服务需要配置超时时间,请参见设置接入协议。
- 熔断后尝试请求目标服务的最小间隔为5秒,查看目标服务是否已恢复。
- CSB无法区分目标服务的异常,超时和其他异常都会触发熔断。
- 开放协议和接入协议符合下表中的服务才支持降级配置。
开放协议 |
接入协议 |
降级默认值 |
降级端点 |
默认值格式 |
RESTful(普通服务和级联服务)) |
RESTful |
支持 |
支持 |
JSON |
WebService |
支持 |
不支持 |
JSON |
HSF |
支持 |
不支持 |
JSON |
DUBBO |
支持 |
不支持 |
JSON |
RESTful |
JDBC |
不支持 |
不支持 |
无 |
WebService(普通服务和级联服务) |
RESTful |
支持 |
支持 |
JSON |
WebService |
支持 |
不支持 |
XML |
HSF |
支持 |
不支持 |
JSON |
DUBBO |
支持 |
不支持 |
JSON |
WebService |
JDBC |
不支持 |
不支持 |
无 |
HSF级联 |
HSF |
支持 |
不支持 |
文本(只支持Hessian2序列化) |
配置熔断和降级
熔断和降级是在发布服务过程中配置的,发布服务的详细步骤,请参见发布后端已有服务,本文仅说明发布过程中如何配置熔断和降级。
- 进入发布服务页面,请参见进入发布服务页面或进入级联发布页面。
- 在命名服务页面设置服务基本参数,请参见命名服务。
- 在接入协议页面选择接入协议并配置相关参数,请参见设置接入协议。
注意 在配置接入服务时,必须配置超时时间,否则熔断和降级配置服务不生效。
- 在开放协议页面设置开放协议,请参见设置开放协议。
- 在限制访问页面设置访问限制,并进行熔断设置。
设置访问限制,请参见
设置访问限制,本文主要介绍熔断设置。
熔断参数配置说明:
- 启用熔断:是否打开启用熔断开关。
- 熔断触发条件:设置熔断触发的条件,例如10秒内服务请求数超过100次,且错误率大于40%。
- 启用降级:是否打开启用降级开关。当启用熔断不启用降级时,在熔断状态下会抛出熔断异常。
- 降级逻辑:输入降级逻辑代码。降级逻辑包含默认值和降级端点两种方式。
- 如果您已有备用的端点,可配置降级端点。
- 如果您没有备用的端点,可配置默认值,以保证服务调用可以正常进行。
下面分别提供默认值和降级端点的配置示例。
- 降级端点(和RESTful端点对应,熔断状态或原端点服务异常情况下调用降级端点的服务)示例:
http://service.ken.com:8080/fallback/item/{name}
-
默认值(返回调用方指定结果)示例(RESTful ):
{
"msg": "FALLBACK",
"result": {
"quantity": 9999
},
"code": "0",
"innerMsg": "DefaultValue"
}
HSF或Dubbo方法返回值对应的JSON(JSON.toJSONString(result))。
对于HSF级联发布的服务,需要使用Hessian2序列化之后的字符串作为默认值,即调用Hessian2Encoder.encodeToString(result)
获得的字符串。示例代码如下(需要先在pom.xml中添加Dubbo和Hessian的依赖):
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>com.taobao.hsf.hessian</groupId>
<artifactId>hessian</artifactId>
<version>4.0.7.bugfix12-tuning3</version>
</dependency>
import org.apache.dubbo.common.io.UnsafeByteArrayInputStream;
import org.apache.dubbo.common.io.UnsafeByteArrayOutputStream;
import com.taobao.hsf.com.caucho.hessian.io.Hessian2Input;
import com.taobao.hsf.com.caucho.hessian.io.Hessian2Output;
import com.taobao.hsf.com.caucho.hessian.io.SerializerFactory;
public class Hessian2Encoder {
private static final SerializerFactory factory = new com.taobao.hsf.com.caucho.hessian.io.SerializerFactory();
private static final String chars = "0123456789ABCDEF";
public static byte[] encode(Object object) throws Exception {
UnsafeByteArrayOutputStream byteArray = new UnsafeByteArrayOutputStream();
Hessian2Output output = new Hessian2Output(byteArray);
output.setSerializerFactory(factory);
output.writeObject(object);
output.close();
byte[] bytes = byteArray.toByteArray();
return bytes;
}
public static String encodeToString(Object object) throws Exception {
byte[] bytes = encode(object);
return bytesToHexString(bytes);
}
private static String bytesToHexString(byte[] bytes) {
StringBuilder result = new StringBuilder(bytes.length);
String s;
for (int i = 0; i < bytes.length; i++) {
s = Integer.toHexString(0xFF & bytes[i]);
if (s.length() < 2) {
result.append(0);
}
result.append(s.toUpperCase());
}
return result.toString();
}
}
- 在发布服务页面确认设置,单击完成发布。
结果验证
熔断和降级配置完成后,在调用该服务时,返回的HTTP Response包含以下Header信息,您可以根据各参数的返回值判断熔断和降级是否生效。
HTTP Response中Header信息的参数说明如下: