专有云Spring Cloud应用限流降级--Series1:迁移指导-阿里云开发者社区

开发者社区> 阿里云SRE技术社区> 正文

专有云Spring Cloud应用限流降级--Series1:迁移指导

简介: 专有云Spring Cloud应用限流降级--Series1:迁移指导

image.png

本最佳实践将为您介绍如何使用Sentinel对微服务的限流降级。

1. 背景信息

1.1 场景描述

Hystrix是通过代码注入的形式实现应用的熔断降级功能,而Sentinel只需要导入一个SDK,无需业务代码中添加限流降级注解或代码块,无侵入式的实现对微服务的限流降级。

1.2 Sentinel特征

  • 丰富的应用场景:

Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。

  • 完备的实时监控:

Sentinel同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。

  • 广泛的开源生态:

Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与Spring Cloud、Dubbo、gRPC的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。

  • 完善的SPI扩展点:

Sentinel提供简单易用、完善的SPI扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。

1.3 最佳实践价值

在微服务场景中,由于微服务调用的复杂性,希望尽量减少代码的修改,并且希望对微服务的管理实现可是化的形式。因此使用Sentinel实现限流降级功能变得适合及友好,不仅开发人员开发变得简单,对于运维人员管理微服务的限流降级也容易,同时对微服务应用的限流降级配置规则也可以在控制台修改,无需对代码的改动,减小微服务部署重启等可能业务重大影响的操作。

2. 迁移指导

2.1 Spring Cloud请求熔断迁移至Sentinel

  1. 在使用Hystrix工程中找到熔断的依赖及代码块,替换maven工程中替换pom.xml文件的导入依赖包。
    Spring Cloud Hystrix的pom.xml文件的配置:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
Spring Cloud Sentinel的pom.xml的文件配置:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

  1. 微服务新增熔断机制。

Hystrix熔断机制注解@HystrixCommand:
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
//一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
@HystrixCommand(fallbackMethod = "processHystrix_Get")
public Dept get(@PathVariable("id") Long id)
{
Dept dept = this.deptService.get(id);
if (null == dept) {
throw new RuntimeException("该ID:" + id + "没有没有对应的信息");
}
return dept;
}

public Dept processHystrix_Get(@PathVariable("id") Long id)
{
Dept dept = new Dept();
dept.setDeptno(id);
dept.setDname("该ID:" + id + "没有没有对应的信息,null--@HystrixCommand");
dept.setDb_source("no this database in MySQL");
return dept;
}

3.Spring Cloud Hystrix应用主程序类添加注解@EnableCircuitBreaker。

Hystrix启动类注解:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
@MapperScan(basePackages="com.poc.springcloud.dao")
@EnableEurekaClient
//@EnableDiscoveryClient //服务发现
@EnableCircuitBreaker
//对Hystrix熔断机制支持
public class DeptProvider_App {
public static void main(String[] args) {
SpringApplication.run(DeptProvider8001_App.class,args);
}
}
4.因Sentinel无代码侵入,所以不需要修改业务代码,登录Sentinel控制台。

5.在左侧导航栏单击簇点链路。

6.在簇点链路页面,找到想要操作的资源,单击操作栏中的流控。

image.png


1.png

2.2 Spring Cloud服务降级迁移至Sentinel

说明:降级服务:整体资源快不够用时,将某些服务先关掉,当可用资源恢复后再开启。所谓降级,就是从整体考虑,当某个服务熔断之后,服务器将不再被调用,此刻客户端可以自己准备一个本地的fallback回调,返回一个缺省值,即使短期内使服务水平下降,但可以将服务器一直维持在可用状态。
1.在使用Hystrix工程中找到服务降级的依赖及代码块,替换pom.xml文件的导入依赖包。

Spring Cloud Hystrix的pom.xml文件的配置:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

Spring Cloud Sentinel的pom.xml的文件配置:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2.微服务新增服务降级处理类。

Service接口实现一个FallbackFactory接口类DeptClientServiceFallbackFactory。

Spring Cloud Hystrix的DeptClientServiceFallbackFactory实现代码:
@Component // 不要忘记添加
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService>
{
@Override
public DeptClientService create(Throwable throwable)
{
return new DeptClientService() {
@Override
public Dept get(long id)
{
Dept dept = new Dept();
dept.setDeptno(id);
dept.setDname("该ID:" + id + "没有没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭");
dept.setDb_source("no this database in MySQL");
return dept;
}
@Override
public List<Dept> list() { return null; }
@Override
public boolean add(Dept dept) { return false; }
};
}
}

3.微服务的service限流降级处理机制。

Spring Cloud Hystrix对限流降级接口统一fallback处理:
@FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)
public interface DeptClientService
{
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
public Dept get(@PathVariable("id") long id);
}

4.因Sentinel无代码侵入,所以不需要修改业务代码,登录Sentinel控制台。

5.在左侧导航栏单击簇点链路。

6.在簇点链路页面,找到想要操作的资源,单击操作栏中的降级。

2.png

后续内容

专有云Spring Cloud应用限流降级--Series2:应用部署
专有云Spring Cloud应用限流降级--Series3:配置控制台规则

我们是阿里云智能全球技术服务-SRE团队,我们致力成为一个以技术为基础、面向服务、保障业务系统高可用的工程师团队;提供专业、体系化的SRE服务,帮助广大客户更好地使用云、基于云构建更加稳定可靠的业务系统,提升业务稳定性。我们期望能够分享更多帮助企业客户上云、用好云,让客户云上业务运行更加稳定可靠的技术,您可用钉钉扫描下方二维码,加入阿里云SRE技术学院钉钉圈子,和更多云上人交流关于云平台的那些事。

image.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

阿里云智能全球技术服务部SRE团队,是阿里集团高可用基础技术核心缔造团队,也是阿里为确保客户平台稳定、业务连续而打造的核心支撑团队

官方博客
官网链接