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

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

本最佳实践将为您介绍如何使用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>

2.微服务新增熔断机制。
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.在簇点链路页面,找到想要操作的资源,单击操作栏中的流控。

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

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.在簇点链路页面,找到想要操作的资源,单击操作栏中的降级。

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

后续内容

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

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

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

上一篇:微信小程序之结构目录、视图层、双线程模型、生命周期、事件传递冒泡、组件、request、登录授权及支付


下一篇:全栈项目|小书架|微信小程序-实现搜索功能