(二)Sentinel微服务流控组件环境搭建

目录

  • 源码及官网
  • Sentinel是什么?
  • Sentinel解决的问题是什么?
    • 问题出现
    • 解决方案
  • Sentinel和Hystrix对比
  • Sentinel控制台搭建
  • SpringcloudAlibaba整合Sentinel
  • 微服务和Sentinel Dashboard通信原理

源码及官网

源码地址:https://github.com/alibaba/Sentinel
官方文档:https://github.com/alibaba/Sentinel/wiki

Sentinel是什么?

Sentinel是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性

Sentinel解决的问题是什么?

问题出现

在一个高度服务化的系统中,我们实现的一个业务逻辑通常会依赖多个服务。当其中一个服务不可用时,就会出现线程池里所有线程都因等待而被阻塞,从而造成服务雪崩

服务雪崩:因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程,就叫服务雪崩效应。导致服务不可用的原因: 程序Bug,大流量请求,硬件故障,缓存击穿。

在服务提供者不可用的时候,会出现大量重试的情况:用户重试、代码逻辑重试,这些重试最终导致:进一步加大请求流量。所以归根结底导致雪崩效应的最根本原因是:大量请求线程同步等待造成的资源耗尽。当服务调用者使用同步调用时, 会产生大量的等待线程占用系统资源。一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态, 于是服务雪崩效应产生了。

解决方案

  • 超时机制:请求超时,就释放资源。由于释放资源速度较快,一定程度上可以抑制资源耗尽的问题。
  • 服务限流(资源隔离):限制请求核心服务提供者的流量,使大流量拦截在核心服务之外,这样可以更好的保证核心服务提供者不出问题。
  • 服务熔断:远程服务不稳定或网络抖动时暂时关闭,就叫服务熔断。当依赖的服务有大量超时时,在让新的请求去访问根本没有意义,只会无谓的消耗现有资源。比如:我们设置了超时时间为1s,如果短时间内有大量请求在1s内都得不到响应,就意味着这个服务出现了异常,此时就没有必要再让其他的请求去访问这个依赖了,这个时候就应该使用断路器避免资源浪费。
  • 服务降级:有服务熔断,必然要有服务降级。 所谓降级,就是当某个服务熔断之后,服务将不再被调用,此时客户端可以自己准备一个本地的fallback(回退)回调, 返回一个缺省值。

Sentinel和Hystrix对比

(二)Sentinel微服务流控组件环境搭建_第1张图片

Sentinel控制台搭建

  • 根据(一)Nacos注册中心集群环境搭建中的版本说明,选择适配版本下载jar包,下载地址:https://github.com/alibaba/Sentinel/releases

  • 解压后,在可以在解压后的文件下添加application.properties配置文件:

    	#spring settings
    	server.servlet.encoding.force=true
    	server.servlet.encoding.charset=UTF-8
    	server.servlet.encoding.enabled=true
    
    	#cookie name setting
    	server.servlet.session.cookie.name=sentinel_dashboard_cookie
    
    	#logging settings
    	logging.level.org.springframework.web=INFO
    	logging.file.name=${user.home}/logs/csp/sentinel-dashboard.log
    	logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
    	#logging.pattern.console= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
    	
    	#auth settings
    	auth.filter.exclude-urls=/,/auth/login,/auth/logout,/registry/machine,/version
    	auth.filter.exclude-url-suffixes=htm,html,js,css,map,ico,ttf,woff,png
    	
    	#登录用户名/密码
    	# If auth.enabled=false, Sentinel console disable login
    	auth.username=sentinel
    	auth.password=sentinel
    	
    	# Inject the dashboard version. It's required to enable
    	# filtering in pom.xml for this resource file.
    	sentinel.dashboard.version=1.8.5
    	
    	# port  端口
    	server.port=8001
    
  • 启动控制台:

    #启动命令
    nohup java -jar  sentinel‐dashboard‐1.8.1.jar &
    
    #查看启动日志
    tail -f nohup.out
    
  • 访问控制台:http://192.168.145.129:8001/#/login 用户名/密码:sentinel/sentinel
    (二)Sentinel微服务流控组件环境搭建_第2张图片

  • 启动成功,注: Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包

SpringcloudAlibaba整合Sentinel

  1. 引入依赖
    	<!--actuator-->
    	<!--添加Sentinel后,需要暴露/actuator/sentinel端点,Springboot默认是没有暴露该端点的-->
    	<!--所以需要引入依赖并设置,测试 http://localhost:8800/actuator/sentinel-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    
        <!--sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
    
        <!--流控规则基于nacos推送-->
        <!--由于控制台配置的规则是在内存中没有进行持久化的,这里选择使用nacos进行持久化-->
        <!-- Sentinel Datasource Nacos 依赖 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
    
  2. 添加相关配置:
     spring: 
      application: 
       name: mall‐user‐sentinel‐demo 
        cloud: 
         nacos: 
          discovery: 
           server‐addr: 127.0.0.1:8848 
       	 sentinel: 
          transport: 
           # 添加sentinel的控制台地址 
           dashboard: 127.0.0.1:8080 
           # 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer 
           # port: 8719 
             
      #暴露actuator端点 
      management: 
       endpoints: 
        web: 
         exposure: 
          include: '*'
    

3.使用注解

@SentinelResource(value = "**",blockHandlerClass = **.class,
            blockHandler = "**",fallbackClass = **.class,fallback = "**")

4.nacos中规则配置,这里只是一个例子,具体参数含义和json可以参照官网文档

[
	{
	"resource": "**", //资源名
	"limitApp":"default",  //针对来源: 默认是default,当多个微服务都调用这个资源时,可以配置微服务名来对指定的微服务设置阈值
	"grade":1,  //阈值类型 QPS(1)和线程数(2)
	"count":2,  //单机阈值
	"strategy":0,  //流控模式
	"controlBehavior":0  //流控效果
	}
]

微服务和Sentinel Dashboard通信原理

Sentinel控制台与微服务端之间,实现了一套服务发现机制,集成了Sentinel的微服务都会将元数据传递给Sentinel控制 台,架构图如下所示:
(二)Sentinel微服务流控组件环境搭建_第3张图片

你可能感兴趣的:(环境搭建,sentinel,微服务,java)