SpringCloud之sentinel(一)

2020/06/13 SpringCloud

springcloud中的流量哨兵sentinel

sentinel简介

    在springcloud开发中,针对高并发系统经常会有限流降级的需求;提到限流降级,最常见的是netflix的hystrix和Alibaba的sentinel,sentinel相比hystrix功能更加强大,比如它可以将流控粒度细化控制到某一个具体接口甚至是接口传过来的具体数值(热点数据);但是sentinel也有一定的缺点,就是不能持久化,关于如何解决持久化问题,参考我的另一篇博客,SpringCloud之sentinel(二);链接:https://side-wipe.github.io/2020/06/15/sentinel/

本篇就将介绍sentinel基本用法。

sentinel基本用法

1.环境准备


    需要准备三个东西,springcloud的注册中心nacos,数据库mysql,以及sentinel-dashboard。
    简单说一下sentinel-dashboard,这是一个Alibaba开源的项目,简单说就是一个springboot工程(jar包),安装启动后做为一个sentinel控制台使用,我们想进行流控的微服务工程也同样要注册到这个控制台,可以通过这个控制台来配置你想要的流控降级规则。
    这三个东西我都是配置在linux环境下,也可以配置在windows环境下,具体相关配置操作百度即可,都比较简单就不在这里详细说了。需要的工具包(nacos和sentinel-dashboard)以及sql文件在我的github项目目录下(https://github.com/side-wipe/sentinel-pro/tree/master/tools),可自行下载。

2.使用示例


这里我们结合feign来进行使用,完整代码已上传github;地址:https://github.com/side-wipe/sentinel-pro/

  • 项目结构简单说明:

 

    如上所示:根据springcloud的架构习惯,common工程中都是一些项目通用的实体类;mapper-dao就是将调用mysql的dao层作为一个工程;feign-api工程就是所有feign调用的接口;这三个子工程都是给其他工程依赖的,无需启动。
    建立两个微服务,order-center(订单服务),product-center(产品服务);模拟订单服务通过feign调用产品服务,并对订单服务就行限流降级控制。

  • 核心代码     除了基础的配置外(数据源,注册中心等),还需要sentinel的配置;既然是对订单服务进行配置,就要在订单服务的yml文件中配置sentinel,如下图:
    需要注意的是,sentinel要配置两个端口,一个端口是微服务用来注册到sentinel控制台,一个是用于微服务和控制台通信

 

配置完成后,接下来只需要对feign-api的api接口进行改造就可以了;可以看到,这种方式对业务代码入侵非常低。

@FeignClient(name = "product-center",fallbackFactory = ProductCenterFeignApiWithSentielFallbackFactory.class)
public interface ProductCenterFeignApiWithSentinel {

    /**
     * 声明式接口,远程调用http://product-center/selectProductInfoById/{productNo}
     * @param productNo
     * @return
     */
    @RequestMapping("/selectProductInfoById/{productNo}")
    ProductInfo selectProductInfoById(@PathVariable("productNo") String productNo);

}

ProductCenterFeignApiWithSentielFallbackFactory是sentinel包中提供给我们的一个回调接口。可通过实现此接口,当/selectProductInfoById/{productNo}路径被限流处理时,返回的异常可以在回调函数中处理。

@Component
@Slf4j
public class ProductCenterFeignApiWithSentielFallbackFactory implements FallbackFactory<ProductCenterFeignApiWithSentinel> {
    @Override
	//可以在这里捕获返回的异常,限流和降级的异常是不一样的,可以在这里区分。
    public ProductCenterFeignApiWithSentinel create(Throwable throwable) {  
        return new ProductCenterFeignApiWithSentinel(){  


            @Override
            public ProductInfo selectProductInfoById(String productNo) {
                ProductInfo productInfo = new ProductInfo();
                if (throwable instanceof FlowException){
                    productInfo.setProductName("我是限流的默认商品");
                }
                else {
                    productInfo.setProductName("我是降级的默认商品");

                }
                return productInfo;
            }
        };
    }
}

完整的代码请到github下载。

3.效果展示


  • 启动工程

    首先启动nacos和sentinel-dashboard(这两个我已经在linux环境下配置好了),启动后截图如下:

这里我用nginx和nacos在linux下配置了一个注册中心集群,一共三个节点(配置方式可参考我的另一篇博客),此时微服务工程未启动,可以看到服务列表为空。

nacos控制台:

 
 

sentinel控制台:

linux环境下,下载sentinel-dashboard-1.6.3.jar后,输入

nohup java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8888 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.6.3.jar  

即可,注意替换成自己的机器ip和端口

 

启动订单微服务和产品微服务,此时的nacos注册中心:

 

此时的sentinel控制台:

(注意:可能启动后还是没有,用浏览器或者postman调用一次接口就有了)

 

访问订单服务:

 

  • 添加限流规则

针对order-center进行流控: 配置规则为,每秒只允许一个访问通过,其他的都会进行拦截。

 

 

规则配置完成,再次访问,并不断刷新页面,会出现如图所示:

 

可以看到,发生了限流提示,而这个提示正是我们在feign-api工程中处理的,可以debug看一下:

 

同样的,如果在sentinel控制台设置降级规则,则会返回降级异常,根据我们的处理,返回的参数也有所不同。

    当然,sentinel的可配置规则不仅限于此,还有很多强大的功能,这里就不一一展示;但是也有一个问题,前文也说到了,就是不能持久化,通俗的说,就是无论你的控制台重启还是项目重启,在控制台配置的规则都会全部丢失,这显然是一个很大的问题,下一篇文章将会简述如何持久化。

Search

    我的微信

    闷骚的程序员

    Table of Contents