Sentinel-Lernen (2) – Verwendung von Sentinel, Einführung von Abhängigkeiten und Konfigurationen, Durchführen einer Flusskontrolle bei Verbrauchern sowie Durchführen von Leistungsschaltern und Downgrades bei Erzeugern

Vorwort

Sentinel ist eine Verkehrsverwaltungskomponente für verteilte, mehrsprachige heterogene Dienstarchitekturen. Sie verwendet hauptsächlich Verkehr als Einstiegspunkt und deckt Verkehrsrouting, Verkehrssteuerung, Verkehrsgestaltung, Leistungsschalterverschlechterung, systemadaptiven Überlastschutz, Hot-Spot-Verkehrsschutz usw. ab .Dimension, um Entwicklern dabei zu helfen, die Stabilität von Microservices sicherzustellen.

Dieser Blog stellt die Verwendung von Sentinel vor, stellt Abhängigkeiten und Konfigurationen vor und veranschaulicht anhand von Fallstudien die Flusskontrolle von Verbrauchern und Leistungsschaltern sowie die Herabstufung von Produzenten durch Sentinel.

Weitere Artikel über Sentinel sind wie folgt:

Sentinel-Lernen (1) – CAP-Theorie, Lawinenproblem in Microservices sowie Hystix-Lösungen und verwandte Konzepte von Sentinel + herunterladen und ausführen

Fügen Sie hier eine Bildbeschreibung ein

hinausbegleiten


1. Die Verwendung von Sentinel führt Abhängigkeiten und Konfigurationen ein;
2. Flusskontrolle für Verbraucher;
3. Leistungsschalter und Downgrades für Produzenten;

1. Vorbereitung für die Verwendung von Sentinel

1. Kontext und Ressourcen

Kontext (Kontext) und Kontextname
Kontext repräsentieren den Kontext des aufrufenden Links. Ist ein Stammknoten. Zu Beginn des gesamten aufrufenden Links erstellt Sentinel ein Kontextobjekt und weist ihm einen Namen zu, der der Stammressource entspricht. In Sentinel können verschiedene aufrufende Links dasselbe Kontextobjekt (einen gesamten Stammknoten) verwenden. Hier (in Spring MVC integriert) befinden sich unsere Aufruflinks alle in sentinel_spring_web_context:

Fügen Sie hier eine Bildbeschreibung ein

Ressourcen und Ressourcenname
befinden sich in Sentinel. Für jede Ressource weist Sentinel einen Namen zu (oder Sie geben ihn manuell an). Bei der Integration mit Spring MVC verwendet Sentinel den URI als Ressourcennamen der Controller-Methode (hier ist die Controller-Methode). die Ressource)

Fügen Sie hier eine Bildbeschreibung ein

2. Aufgabenteilung

Für Verbraucher: Wenn es um die Verkehrskontrolle geht, habe ich Angst, dass ich scheitere, wenn andere auf mich zugreifen. Deshalb möchte ich den Verkehr begrenzen, auf den andere auf mich zugreifen können.

Für den Hersteller wird der Leistungsschalter herabgestuft. Der Verbraucher ruft den Produzenten an, weil er befürchtet, dass der Hersteller ein Problem haben wird, daher wird der Leistungsschalter herabgestuft. Wenn der Angerufene, also der Hersteller, ein Problem hat, wird die entsprechende Antwort gegeben gegeben werden;

Fügen Sie hier eine Bildbeschreibung ein

3. Abhängigkeiten und Konfiguration einführen

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
spring:
  cloud:
    # nacos的配置
    nacos:
      discovery:
        # 能够注册
        register-enabled: true
        server-addr: http://192.168.111.130:8848/
        # 命名空间
        namespace: my-tianju
        # 组名
        group: DEV

    # sentinel的配置
    sentinel:
      transport:
        dashboard: 192.168.111.130:7777
        port: 8719
      # 这样一启动能够立马被发现,不用请求一次后才被监控
      eager: true
      # 链路相关的配置
      # 默认是true,开启上下文整合,所有链路在根节点下,链路监控就是将请求分开统计
      web-context-unify: false

  application:
    name: springCloud-consumer

#feign:
#  hystrix:
#    enable: true

# 打开阿里的 sentinel
feign:
  sentinel:
    enabled: true

2. Kontrollfluss der Verbraucher

QPS (Abfragen pro Sekunde) gibt die Anzahl der Abfragen pro Sekunde an. Das heißt, die Anzahl der Anfragen, auf die ein Server pro Sekunde antworten kann.

1. Einzelmaschinenschwelle

QPS (Abfragen pro Sekunde) gibt die Anzahl der Abfragen pro Sekunde an. Das heißt, die Anzahl der Anfragen, auf die ein Server pro Sekunde antworten kann.

Fügen Sie hier eine Bildbeschreibung ein

Es gab zu viele Anfragen und der Datenfluss wurde durch Sentinel eingeschränkt.

Fügen Sie hier eine Bildbeschreibung ein

2. Vorheizeinstellungen

Beim ersten Start des Systems werden weniger Anfragen zugelassen. Wenn sich das System allmählich stabilisiert, wird der Schwellenwert für die Zugriffsberechtigung erhöht.

Fügen Sie hier eine Bildbeschreibung ein

JMeter testet Post-Anfragen und muss Anforderungs-Header-Parameter hinzufügen.

Fügen Sie hier eine Bildbeschreibung ein

Ramp-up-Zeit: Das Intervall zwischen Thread-Starts. Wenn 100 Threads innerhalb von 10 s gestartet werden, stellen Sie „Ramp-up“ auf 100/10=10 s ein.

Fügen Sie hier eine Bildbeschreibung ein

Wellenformdiagramm

Fügen Sie hier eine Bildbeschreibung ein

Analyse des gesamten Prozesses:
1. Zu Beginn 3 Mal pro Sekunde zulassen;
2. Innerhalb der ersten 10 Sekunden allmählich steigern;
3. Nach 10 Sekunden einen stabilen Wert erreichen und 10 Mal pro Sekunde zulassen;

Fügen Sie hier eine Bildbeschreibung ein

3. Warten Sie in der Schlange

Warteschlangen und Warten: Auch Traffic Shaping genannt, ermöglicht es, dass Anfragen mit einer einheitlichen Geschwindigkeit weitergeleitet werden. Der Schwellenwert für eine einzelne Maschine ist die Anzahl der Durchläufe pro Sekunde. Der Rest wird in der Warteschlange eingereiht und wartet eine gewisse Zeit lang (d. h. Die von uns festgelegte Zeit in Millisekunden. Diese Zeit wird nicht überschritten. Kann rechtzeitig verarbeitet werden. Wenn nach dieser Wartezeit kein Thread zur Verarbeitung der angeforderten Schnittstelle vorhanden ist, wird eine Ausnahme ausgelöst.

Fügen Sie hier eine Bildbeschreibung ein

JMeter-Parametereinstellungen

Fügen Sie hier eine Bildbeschreibung ein

Wellenformdiagramm

Fügen Sie hier eine Bildbeschreibung ein

Aktueller Begrenzungsrichtlinienprozess:
1. 10 pro Sekunde zulassen
2. 50 senden, 10 übergeben und die restlichen 40 in die Warteschlange zum Warten eingeben:
3. Wenn keine Anforderungen vorhanden sind, durch die in der Warteschlange wartenden Anforderungen

Fügen Sie hier eine Bildbeschreibung ein

4. Assoziationsmodus

Assoziation: Die Bedeutung der Schnittstelle /important ist höher als die der Schnittstelle /normal. Wenn der Zugriffsdruck der Schnittstelle /important sehr hoch ist, kann die Schnittstelle /normal` „geopfert“ werden, um den normalen Betrieb der Schnittstelle sicherzustellen /wichtige Schnittstelle.

Fügen Sie hier eine Bildbeschreibung ein

JMeter-Parametereinstellungen

Fügen Sie hier eine Bildbeschreibung ein

Einstellung der Thread-Nummer

Fügen Sie hier eine Bildbeschreibung ein

Add ist erfolgreich, Get ist begrenzt

Fügen Sie hier eine Bildbeschreibung ein

In Situationen mit hoher Parallelität schlägt die Add-Schnittstelle nicht fehl.

Fügen Sie hier eine Bildbeschreibung ein

Ergänzung: Angepasste Ausnahmerückgabe bei Strombegrenzung

Die von Sentinel zurückgegebenen Standardinformationen sind von Sentinel blockiert (Flussbegrenzung). Wenn Sie mit den Standardantwortinformationen nicht zufrieden sind, können Sie die flussbegrenzenden Rückgabeinformationen anpassen.

Sentinel stellt die BlockExceptionHandler-Schnittstelle bereit. Unabhängig davon, was Sentinel dazu veranlasst, die normale Anforderung des Benutzers zu blockieren, „betritt“ Sentinel die Implementierungsklasse der benutzerdefinierten BlockExceptionHandler-Schnittstelle, führt die Handle-Methode aus und übergibt die aktuelle Anforderung, das Antwortobjekt und das Ausnahmeobjekt sowie die Ausführung Das Ergebnis der Handle-Methode wird an den Benutzer zurückgegeben.

package com.tianju.test;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
    
    
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response,
                       BlockException ex) throws Exception {
    
    
        String msg = null;
        if (ex instanceof FlowException) {
    
    
            msg = "该请求限流了,请稍后重试";
        } else if (ex instanceof DegradeException) {
    
    
            msg = "被熔断了";
        } else {
    
    
            msg = "其它原因";
            // ParamFlowException "热点参数限流";
            // SystemBlockException "系统规则(负载/...不满足要求)";
            // AuthorityException "授权规则不通过";
        }
        // http 状态码
        response.setStatus(500);
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type", "application/json;charset=utf-8");
        response.setContentType("application/json;charset=utf-8");
        new ObjectMapper().writeValue(response.getWriter(), msg);
    }
}

Es ist zu beachten, dass: Es sind nicht nur die Gründe für die Strombegrenzung und den Leistungsschalter, die die Ausführung der Handle-Methode von BlockExceptionhandler verursachen, sondern auch andere Gründe, die diese Handler-Methode ebenfalls aufrufen. Daher ist es notwendig, eine Instanzbeurteilung durchzuführen auf dem BlockException-Parameterobjekt der Handle-Methode.

5.Link-Modus

Die Ideen der Verbindungsstrombegrenzung und der Assoziationsstrombegrenzung sind sehr ähnlich. Angenommen, wir möchten einen bestimmten Mikrodienst anfordern. Der Mikrodienst verfügt über zwei Schnittstellen (/query und /add), und diese beiden Schnittstellen rufen dieselbe Serviceschicht auf. Methode (z. B : doSomething()-Methode), dann können wir es aus der Perspektive der doSomething-Methode festlegen: Wenn die /query-Schnittstelle die doSomething-Methode der Serviceschicht aufruft, ist der Strom begrenzt und /add Es gibt keine Strombegrenzung für Aufruf der Schnittstelle, oder es kann eine entspanntere Flusskontrolle eingestellt werden.

Deaktivieren Sie die URL-Konvergenzfunktion von Sentinel über die Konfiguration

Fügen Sie hier eine Bildbeschreibung ein

package com.tianju.consumer.service;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;

@Service
public class ConsumerService {
    
    
    @SentinelResource("hello")
    public String hello(){
    
    
        return "consumerService";
    }
}

Fügen Sie hier eine Bildbeschreibung ein

Link-Modus aus Sicht der Service-Layer-Methoden

Fügen Sie hier eine Bildbeschreibung ein

Schnittstelle zum Hinzufügen hoher Parallelität, kein Fehler

Fügen Sie hier eine Bildbeschreibung ein

Klicken Sie schnell auf die Get-Methode, und es tritt eine ungültige Situation auf.

Fügen Sie hier eine Bildbeschreibung ein

3. Leistungsschalter und Herabstufung der Produzenten

3 Sicherungszustände:

  • Geschlossen: Geschlossener Zustand, auf alle Anforderungen wird normal zugegriffen.

  • Offen: Offener Zustand, alle Anfragen werden herabgestuft.

    Hystrix zählt die Anfragen. Wenn der Prozentsatz der fehlgeschlagenen Anfragen innerhalb eines bestimmten Zeitraums den Schwellenwert erreicht, wird die Sicherung ausgelöst und der Leistungsschalter vollständig geöffnet. Der Standardschwellenwert für die Fehlerquote liegt bei 50 % und die Anzahl der Anforderungen beträgt mindestens 20. Der Standardwert beträgt 20 Anfragen innerhalb von fünf Sekunden. Wenn 10 Mal fehlschlagen (50 %), kann auf die Anfrage nicht normal zugegriffen werden.

  • Halboffen: Halboffener Zustand. Der offene Zustand ist nicht dauerhaft. Nach dem Öffnen wechselt er in den Ruhezustand (Standard ist 5S). Der Leistungsschalter geht dann automatisch in den halboffenen Zustand über.

    Zu diesem Zeitpunkt werden einige Anforderungen freigegeben. Wenn diese Anforderungen ordnungsgemäß sind, wird der Leistungsschalter vollständig geschlossen. Andernfalls bleibt er geöffnet und der Sleep-Timer wird erneut gestartet.

Fügen Sie hier eine Bildbeschreibung ein

1. Anzahl der Ausnahmen

Die folgende Konfiguration: Senden Sie 2 Anfragen innerhalb einer Sekunde. Wenn ein Fehler (ungewöhnlich) auftritt, wird der Leistungsschalter direkt getrennt und dann herabgestuft.

Fügen Sie hier eine Bildbeschreibung ein

Parameter einstellen

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

2. Abnormale Proportionen

Fügen Sie hier eine Bildbeschreibung ein

Fallback-Methode festlegen

Fügen Sie hier eine Bildbeschreibung ein

package com.tianju.config;

import com.tianju.common.dto.StorageDto;
import com.tianju.common.result.HttpResp;
import com.tianju.config.fallback.StorageFeignFallback;
import com.tianju.entity.Order;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient(value = "storage-server",fallback = StorageFeignFallback.class)
public interface StorageFeign {
    
    

    @PostMapping("/storage/sub")
    HttpResp subStorage(@RequestBody StorageDto storageDto);

}

openfeign legt die Fallback-Methode fest

Fügen Sie hier eine Bildbeschreibung ein

package com.tianju.config;

import com.tianju.common.dto.StorageDto;
import com.tianju.common.result.HttpResp;
import com.tianju.config.fallback.StorageFeignFallback;
import com.tianju.entity.Order;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient(value = "storage-server",fallback = StorageFeignFallback.class)
public interface StorageFeign {
    
    
    @PostMapping("/storage/sub")
    HttpResp subStorage(@RequestBody StorageDto storageDto);
}

Beim Produzenten ist eine Anomalie aufgetreten

Fügen Sie hier eine Bildbeschreibung ein

Test mit Postbote

Fügen Sie hier eine Bildbeschreibung ein

package com.tianju.config.fallback;

import com.tianju.common.dto.StorageDto;
import com.tianju.common.result.HttpResp;
import com.tianju.config.StorageFeign;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 调用库存的feign异常时的返回
 */
@Component
@Slf4j
public class StorageFeignFallback implements StorageFeign {
    
    
    @Override
    public HttpResp subStorage(StorageDto storageDto) {
    
    
        System.out.println("#########################进入了减库存方法的异常中....###########################");
        log.debug("进入了减库存方法的异常中....");
        return HttpResp.failed("减库存的openFeign调用失效,请稍后重试");
    }
}

Fügen Sie hier eine Bildbeschreibung ein

package com.tianju.config.fallback;

import com.tianju.common.dto.StorageDto;
import com.tianju.common.result.HttpResp;
import com.tianju.config.StorageFeign;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 调用库存的feign异常时的返回
 */
@Component
@Slf4j
public class StorageFeignFallback implements StorageFeign {
    
    
    @Override
    public HttpResp subStorage(StorageDto storageDto) {
    
    
        System.out.println("#########################进入了减库存方法的异常中....###########################");
        log.debug("进入了减库存方法的异常中....");
        return HttpResp.failed("减库存的openFeign调用失效,请稍后重试");
    }
}

3. Langsames Anrufverhältnis

Die folgende Konfiguration: Senden Sie 5 Anfragen innerhalb einer Sekunde. Wenn die Antwortzeit jeder Anfrage 500 Millisekunden überschreitet und das Verhältnis 0,5 (50 %) erreicht, wird ein Leistungsschalter ausgeführt. Die Dauer des Leistungsschalters beträgt 10 Sekunden. Beispiel: Es gibt 5 Anfragen innerhalb von 1 Sekunde und die Antwortzeit von 3 davon überschreitet 500 Millisekunden, dann beträgt das Verhältnis 60 %. Wenn es größer als 50 % ist, wird die Verbindung zu diesem Zeitpunkt unterbrochen und dann herabgestuft.

Fügen Sie hier eine Bildbeschreibung ein

Getestet mit Jmeter: Wenn im Programm id=1 ist, dauert jede Antwort 800 Millisekunden. Daher dauert jede Anforderung länger als 500 Millisekunden und die Fehlerrate beträgt 100 %. Zu diesem Zeitpunkt kann die Anforderung der Ressource mit der ID = 4 nicht angefordert werden, da der Leistungsschalter defekt ist und daher direkt herabgestuft wird. Es ist normal, id=4 nach 10 Sekunden erneut anzufordern.


Zusammenfassen

1. Die Verwendung von Sentinel führt Abhängigkeiten und Konfigurationen ein;
2. Flusskontrolle für Verbraucher;
3. Leistungsschalter und Downgrades für Produzenten;

おすすめ

転載: blog.csdn.net/Pireley/article/details/133420975