您的位置:首页 > 其它

分布式服务Dubbo:服务降级

2018-03-09 12:00 429 查看
何为服务降级?为什么使用服务降级?

服务降级就是当服务响应超时或连接请求超时,不用继续等下去,而采用降级措施,意思就是返回一个planB,返回一个我们自己定义好的提示。

而为什么要使用服务降级,这是防止分布式服务发生雪崩效应,什么是雪崩?就是蝴蝶效应,当一个请求发生超时,一直等待着服务响应,那么在高并发情况下,很多请求都是因为这样一直等着响应,直到服务资源耗尽产生宕机,而宕机之后会导致分布式其他服务调用该宕机的服务也会出现资源耗尽宕机,这样下去将导致整个分布式服务都瘫痪,这就是雪崩。如果你要问为什么不做集群?集群当然做,但是一台服务宕机之后,其他流量分发到其他集群机器上,压力也会随之加大,时间久了整个集群也会垮了,这只是个时间问题。为了防止产生了雪崩效应那么就该对服务配置降级,一旦请求超过规定时间立即返回自定义好的提示,无需继续等待。

解决方案:

dubbo中有提供一个叫做mock的配置,mock只在出现非业务异常(比如超时,网络异常等)时执行。mock的配置支持两种,一种为boolean值,默认的为false。如果配置为true,则缺省使用mock类名,即类名+Mock后缀;另外一种则是配置”return null”,统一返回空。

代码编写:

我直接采用之前dubbo的例子来做:基于dubbo从传统MVC架构转向SOA架构分布式设计2–(mvc->soa)

1.采用return null,返回简单的空

打开soa-consumer-web项目里的/soa-consumer-web/src/main/resources/com/cwh/config/dubbo-user-consumer.xml修改如下配置即可:

[html] view plain copy print?<dubbo:reference id=“userService” check=“false” interface=“com.cwh.service.UserService” timeout=“3000” mock=“return null”/>
<dubbo:reference id="userService" check="false" interface="com.cwh.service.UserService" timeout="3000" mock="return null"/>
timeout:超过该时间返回null;

配置后启动即可,我们在服务提供者例如UserServiceImpl中的getUser方法打个断点来模拟请求超时。

然后浏览器访问,断点不过,一致等待,当时间超过3秒,直接返回了空;ok!这样我们就已经实现了一个简单的服务降级了

2.采用自定义提示

2.1打开soa-consumer-web项目里的/soa-consumer-web/src/main/resources/com/cwh/config/dubbo-user-consumer.xml修改如下配置即可:

[html] view plain copy print?<dubbo:reference id=“userService” check=“false” interface=“com.cwh.service.UserService” timeout=“3000” mock=“true”/>
<dubbo:reference id="userService" check="false" interface="com.cwh.service.UserService" timeout="3000" mock="true"/>


2.2打开soa-user-api项目,在com.cwh.service下也就是同UserService统计目录下新建一个UserServiceMock,注意这里名字一点要是该接口名+Mock:

[java] view plain copy print?package com.cwh.service;

import java.util.ArrayList;
import java.util.List;

import com.cwh.model.Article;
import com.cwh.model.User;

public class UserServiceMock implements UserService{

public List<Article>getUserArticles(int uid){
return null;

}
public List<User>getUser(String name){
//throw new RuntimeException(“服务降级—–”);
User user = new User();
user.setUserName(”服务降级啦”);
user.setUserAge(”500”);
List<User> list = new ArrayList<User>();
list.add(user);
return list;

}
}
package com.cwh.service;

import java.util.ArrayList;
import java.util.List;

import com.cwh.model.Article;
import com.cwh.model.User;

public class UserServiceMock implements UserService{

public List<Article>getUserArticles(int uid){
return null;

}
public List<User>getUser(String name){
//throw new RuntimeException("服务降级-----");
User user = new User();
user.setUserName("服务降级啦");
user.setUserAge("500");
List<User> list = new ArrayList<User>();
list.add(user);
return list;

}
}


重启服务,然后浏览器访问,断点不过,一致等待,当时间超过3秒,返回如下我们自定义好的提示:



ok!至此我们就实现了分布式服务降级啦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: