建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块
直达楼层
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

采纳成功

您已采纳当前回复为最佳回复

Huawei Cloud Expert

发帖: 6粉丝: 13

级别 : 版主

发消息 + 关注

发表于2019年08月27日 14:49:07 4248 1
直达本楼层的链接
楼主
显示全部楼层
[技术干货] 方志朋SpringCloud系列—Spring Cloud Alibba教程:Sentinel的使用

1. 什么是Sentinel

Sentinel,中文翻译为哨兵,是为微服务提供流量控制、熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的“雪崩”效应,为微服务系统提供了稳定性的解决方案。随着Hytrxi进入了维护期,不再提供新功能,Sentinel是一个不错的替代方案。通常情况,Hystrix采用线程池对服务的调用进行隔离,Sentinel才用了用户线程对接口进行隔离,二者相比,Hystrxi是服务级别的隔离,Sentinel提供了接口级别的隔离,Sentinel隔离级别更加精细,另外Sentinel直接使用用户线程进行限制,相比Hystrix的线程池隔离,减少了线程切换的开销。另外Sentinel的DashBoard提供了在线更改限流规则的配置,也更加的优化。

从官方文档的介绍,Sentinel 具有以下特征:

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

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

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

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

2  如何在Spring Cloud中使用Sentinel

Sentinel作为Spring Cloud Alibaba的组件之一,在Spring Cloud项目中使用它非常的简单。现在以案例的形式来讲解如何在Spring Cloud项目中使用Sentinel。本项目是在之前nacos教程的案例基础上进行改造。在工程的pom文件加上sentinel的Spring Cloud起步依赖,代码如下:

1.    <dependency>

2.         <groupId>org.springframework.cloud</groupId>

3.         <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>

4.         <version>0.9.0.RELEASE</version>

5.    </dependency>

在工程的配置文件application.yml文件中配置,需要新增2个配置:

§  spring.cloud.sentinel.transport.port: 8719 ,这个端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了1个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。

§  spring.cloud.sentinel.transport.dashboard: 8080,这个是Sentinel DashBoard的地址。

1.    server:

2.      port: 8762

3.    spring:

4.      application:

5.        name: nacos-provider

6.      cloud:

7.        nacos:

8.          discovery:

9.            server-addr: 127.0.0.1:8848

10.       sentinel:

11.         transport:

12.           port: 8719

13.           dashboard: localhost:8080

写一个RestController,在接口上加上SentinelResource注解就可以了。

1.    @RestController

2.    public class ProviderController {

3.     

4.        @GetMapping("/hi")

5.        @SentinelResource(value="hi")

6.        public String hi(@RequestParam(value = "name",defaultValue = "forezp",required = false)String name){

7.     

8.            return "hi "+name;

9.        }

10.    

11.   }

关于@SentinelResource 注解,有以下的属性:

§  value:资源名称,必需项(不能为空)

§  entryType:entry 类型,可选项(默认为 EntryType.OUT)

§  blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称,可选项

§  fallback:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。

启动Nacos,并启动nacos-provider项目。文末有源码下载链接。

3    Sentinel DashBoard

Sentinel 控制台提供一个轻量级的控制台,它提供机器发现、单机资源实时监控、集群资源汇总,以及规则管理的功能. Sentinel DashBoard下载地址:https://github.com/alibaba/Sentinel/releases

下载完成后,以以下的命令启动

1.    java -jar sentinel-dashboard-1.6.1.jar

默认启动端口为8080,可以-Dserver.port=8081的形式改变默认端口。启动成功后,在浏览器**问localhost:8080,就可以显示Sentinel的登陆界面,登陆名为sentinel,密码为sentinel。

登陆sentinel dashboard成功后,并多次访问nacos-provider的localhost:8080/hi接口,在nacos访问信息如下:

image.png

sentinel dashboard显示了nacos-provider的接口资源信息。

image.png

在/hi资源处设置接口的限流功能,在“+流控”按钮点击开设置界面如下,设置阈值类型为 qps,单机阈值为2。

image.png

设置成功后可以在流控规则这一栏进行查看,如图所示:

image.png

4    测试

多次快速访问nacos-provider的接口资源http://localhost:8762/hi,可以发现偶尔出现以下的信息:

Blocked by Sentinel (flow limiting)

正常的返回逻辑为

hi forezp

由以上可只,接口资源/hi的限流规则起到了作用。

5    在FeignClient中使用Sentinel

Hystrix默认集成在Spring Cloud 的Feign Client组件中,Sentinel也可以提供这样的功能。现以案例的形式来讲解如何在FeignClient中使用Sentinel,z本案例是在之前的nacos教程案例的nacos-consumer工程上进行改造,除了引入spring-cloud-starter-alibaba-sentinel,还需要引入spring-cloud-starter-openfeign,代码如下:

1.        <dependency>

2.                <groupId>org.springframework.cloud</groupId>

3.                <artifactId>spring-cloud-starter-openfeign</artifactId>

4.            </dependency>

5.            <dependency>

6.                <groupId>org.springframework.cloud</groupId>

7.                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>

8.                <version>0.9.0.RELEASE</version>

9.            </dependency>

在配置文件中需要加上sentinel.transport. dashboard配置外,还需要加上feign.sentinel.enabled的配置,代码如下:

1.    server:

2.      port: 8763

3.    spring:

4.      application:

5.        name: nacos-consumer

6.      cloud:

7.        nacos:

8.          discovery:

9.            server-addr: 127.0.0.1:8848

10.       sentinel:

11.         transport:

12.           port: 8719

13.           dashboard: localhost:8080

14.    

15.   feign.sentinel.enabled: true

写一个FeignClient,调用nacos-provider的/hi接口:

1.    @FeignClient("nacos-provider")

2.    public interface ProviderClient {

3.     

4.        @GetMapping("/hi")

5.        String hi(@RequestParam(value = "name", defaultValue = "forezp", required = false) String name);

6.    }

写一个RestController调用ProviderClient,代码如下:

1.    @RestController

2.    public class ConsumerController {

3.     

4.        @Autowired

5.        ProviderClient providerClient;

6.     

7.        @GetMapping("/hi-feign")

8.        public String hiFeign(){

9.           return providerClient.hi("feign");

10.       }

11.   }

在FeignClient中,Sentinel为Feign调用生成了资源名策略定义,定义规则为httpmethod:protocol://requesturl。启动nacos-consumer工程,在Sentinel DashBoard生成了如下的资源信息:

image.png

添加流控,QPS为2,在浏览器上快速多次点击访问http://localhost:8763/hi-feign,浏览器在正常情况下是能够正常返回如下的信息:

hi feign

在被限流的时候返回错误信息。

需要注意的是,被限流的时候FeignClient并不会调用nacos-provider的接口,而是在nacos-consumer工程里直接报错。

6    源码下载

https://github.com/forezp/SpringCloudLearning/tree/master/springcloud-alibaba/nacos-discovery-sentinel

7    参考资料

https://github.com/alibaba/Sentinel/releases

https://github.com/alibaba/Sentinel/tree/master/sentinel-dashboard

https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/Sentinel

https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0

原创作者:方志朋

作者简介:

SpringCloud中国社区联合创始人,博客访问量突破一千万,爱好开源,热爱分享,活跃于各大社区,保持着非常强的学习驱动力,终身学习践行者,终身学习受益者。目前就职于国内某家知名互联网保险公司,担任DEVOPS工程师,对微服务领域和持续集成领域研究较深,精通微服务框架Spring Cloud


举报
分享

分享文章到朋友圈

分享文章到微博

采纳成功

您已采纳当前回复为最佳回复

我们都是云专家

发帖: 122粉丝: 147

级别 : 版主

发消息 + 关注

发表于2019年08月27日 14:58:01
直达本楼层的链接
沙发
显示全部楼层

(*@ο@*) 哇~,给力,期待老师更多分享

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册

结贴

您对问题的回复是否满意?
满意度
非常满意 满意 一般 不满意
我要反馈
0/200