Artículo Tabla de contenidos
Prefacio
Acumulación de conocimientos
Control de tráfico
Protección de carga
Degradación de fusión
Documentación oficial Ejercicio práctico Implementar panel centinela
Implementación directa de paquetes jar Docker-compose Orquestación Integración Springboot Infraestructura Sentinel Construir consola Sentinel Extensión de verificación Sentinel : Sistema de limitación de corriente adaptable Principio de reglas del sistema Escritura de página de configuración al final
01
—
prefacio
En el artículo anterior, conocimos Hystrix y lo integramos con el proyecto Springboot para implementar medidas de disyuntor, degradación y aislamiento para servicios. Sin embargo, Hystrix no controla muy bien el tráfico. Los semáforos por sí solos sólo pueden limitar el flujo de interfaces específicas. En cuanto al mecanismo de protección, Hystrix sólo puede fusionarse cuando se alcanza el objetivo. Entonces, ¿existe un middleware que pueda implementar con precisión el control de flujo y la protección de carga y al mismo tiempo sea compatible con la degradación del interruptor automático? La respuesta es, por supuesto, nuestro protagonista de hoy, Spring Cloud Alibaba Sentinel.
02
—
acumulación de conocimientos
Sentinel es un componente de protección de tráfico de alta disponibilidad para arquitectura de servicios distribuidos. Utiliza principalmente el tráfico como punto de entrada para ayudar a los desarrolladores a garantizar la estabilidad de los microservicios desde múltiples dimensiones, como limitación de corriente, configuración del tráfico, degradación de disyuntores, protección de carga del sistema y protección de puntos de acceso. .
control de flujo
Sentinel puede realizar el control de configuración de procesos de acuerdo con indicadores específicos para diferentes relaciones de llamada. Además, las estrategias de configuración incluyen tres modos: rechazo directo, precalentamiento de inicio lento y ecualizador. Los desarrolladores pueden seleccionar estrategias según sus propias necesidades para lograr un control preciso del tráfico.
protección de carga
Sentinel puede proporcionar un mecanismo de protección de carga preciso. Si el servicio llamado alcanza la carga máxima, la carga de solicitudes se equilibrará con otros proveedores de servicios. Si otros servicios también alcanzan la carga máxima, el mecanismo de protección de servicios se activará para permitir el tráfico de solicitudes. y carga de servicio para alcanzar el equilibrio.
degradación del disyuntor
Sentinel también proporciona un disyuntor básico y una función de degradación. Si el servicio se lanza una vez, se degradará directamente usando la lógica alternativa. Si es un indicador de configuración, se usará la lógica blockhander. Por supuesto, si el clúster de servicio alcanza la carga máxima, realizará una función de disyuntor para evitar avalanchas de servicio.
Documentación oficial
https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
03
—
Ejercicios practicos
Implementar panel centinela
Descargue el paquete jar
https://github.com/alibaba/Sentinel/releases
Implementación directa del paquete jar
nohup java -jar -Dserver.port=8109 sentinel-dashboard.jar &
orquestación de composición acoplable
Si es posible, puede utilizar la imagen del panel directamente. Si la extracción es lenta, considere crear la imagen usted mismo.
archivo acoplable
# this is sentinel-dashboard dockerfile
# version 1.0
# 基础镜像
FROM openjdk:8-jre
# 维护人
MAINTAINER senfel<[email protected]>
#jar
COPY ./sentinel-dashboard.jar /home/app.jar
# 端口
EXPOSE 8109
# 执行命令启动jar
ENTRYPOINT ["java","-jar","/home/app.jar"]
docker-compose.yml
version: '3.3'
services:
sentinel:
build: ./
image: senfel/sentinel-dashboard
container_name: sentinel-dashboard
ports:
- 8109:8109
environment:
JVM_OPTS: -server -Xmx512M -Xms512M -XX:MaxMetaspaceSize=256M -XX:CompressedClassSpaceSize=50M -XX:ReservedCodeCacheSize=240M -XX:MaxDirectMemorySize=400M
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "1"
volumes:
- "/home/test/demo/sentinel/logs:/root/logs"
- "/home/test/demo/sentinel/logs:/app-logs"
command: [
"--server.port=8109",
"--logging.file.path=/app-logs"
]
Construya e inicie el contenedor.
docker-compose up -d --build
Ver contenedor centinela
docker ps | grep sentinel
centinela integrado springboot
Construcción de infraestructura
Reglas de control de tráfico persistentes, otras reglas solo necesitan agregar configuración.
Sentinel persiste en nacos. Si no es persistente, las reglas se borrarán cada vez que se reinicie.
Agregar dependencia de maven
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--sentinel持久化到nacos 不持久每次重启都会清除规则-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.0</version>
</dependency>
Agregue bootstrap.yml para configurar nacos para que lo construya usted mismo
server:
port: 9999
spring:
application:
name: test-demo
profiles:
active: uat
cloud:
nacos:
config:
server-addr: 10.10.18.16:8848,10.10.18.16:2848,10.10.18.16:5848
username: nacos
password: nacos
file-extension: yaml
discovery:
server-addr: 10.10.18.16:8848,10.10.18.16:2848,10.10.18.16:5848
username: nacos
password: nacos
sentinel:
transport:
dashboard: 10.10.22.174:8109
port: 8719
datasource:
ds1:
nacos:
server-addr: 10.10.18.16:8848,10.10.18.16:2848,10.10.18.16:5848
dataId: test-demo-sentinel.json
data-type: json
rule-type: flow
username: nacos
password: nacos
#开启sentinel
feign:
sentinel:
enabled: true
circuitbreaker:
enabled: true
nacos nueva configuración de limitación actual
Recurso de control de flujo :
límite de nombre de recurso Aplicación: grado de aplicación de origen
: tipo de umbral, 0 representa el número de subprocesos, 1 representa el recuento de QPS : estrategia de
umbral de clic : modo de control de flujo, 0 representa directo, 1 representa asociación, 2 representa control de enlace Comportamiento: control de flujo Efecto, 0 representa falla rápida, 1 representa calentamiento, 2 representa espera en línea Modo de clúster: si se debe agrupar
-Otras reglas son similares y no se repetirán aquí.
-La configuración de Nacos no tiene nada que ver con este artículo y no se repetirá aquí.
[
{
"resource": "testFeign",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
Inicia la clase para habilitar fingir y nacos.
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@Slf4j
public class TestDemoApplication implements ApplicationRunner {
public static void main(String[] args) {
SpringApplication.run(TestDemoApplication.class, args);
}
}
caso de prueba
/**
* testFeign
* fallback只负责业务异常
* blockHandler只负责sentinel配置超标
* 两个都配置,如果都出错,会进入blockHandler
* @param str
* @author senfel
* @date 2023/7/11 14:26
* @return java.lang.String
*/
@SentinelResource(value = "testFeign",blockHandler = "blockHandler",fallback = "handlerFallback")
@GetMapping("/testFeign")
public String testFeign(String str){
if(str.contains("y")){
throw new RuntimeException();
}
return testMQService.testFeign(str);
}
/**
* 异常阻塞处理
* @param str
* @author senfel
* @date 2023/7/11 14:44
* @return java.lang.String
*/
private String blockHandler(String str, BlockException blockException){
return "blockHandler"+"-"+str;
}
/**
* 降级处理
* @param str
* @author senfel
* @date 2023/7/11 14:44
* @return java.lang.String
*/
private String handlerFallback(String str,Throwable throwable){
return "handlerFallback"+"-"+str;
}
caso de prueba de degradación de openfeign
/**
* @author senfel
* @version 1.0
* @date 2023/7/03 15:04
*/
@Service
@FeignClient(value = "test-demo",fallback = FallbackService.class)
public interface TestService {
/**
* 测试sentinel
*/
@GetMapping("/feign")
String feign(@RequestParam String str);
}
/**
* FallbackService
* @author senfel
* @version 1.0
* @date 2023/7/3 15:26
*/
@Service
public class FallbackService implements TestService {
@Override
public String feign(String str) {
return ">>>>>客户端服务降级>>>>>";
}
}
consola centinela
Consulte http://10.10.22.174:8109/ después de la solicitud del cartero
Cargar automáticamente reglas de tráfico configuradas
verificación centinela
Verificar el tráfico de control activo
127.0.0.1:9999/testFeign?str=fffffffffss
Verificar el tráfico de control anormal
127.0.0.1:9999/testFeign?str=ffffffffffyy
Verifique que el cliente finja una degradación
127.0.0.1:9999/testFeign?str=fffffffffss
Ver monitoreo en tiempo real
04
—
Extensión: limitación de corriente adaptativa del sistema
Reglas del sistema
Las reglas de protección del sistema se controlan desde el tráfico de ingreso a nivel de la aplicación y los indicadores de la aplicación se monitorean desde varias dimensiones, como la carga de una sola máquina, el uso de la CPU, el RT promedio, el QPS de ingreso y la cantidad de subprocesos simultáneos, para que el sistema pueda ejecutarse a el máximo rendimiento posible, garantizando al mismo tiempo la estabilidad general del sistema.
Las reglas de protección del sistema se aplican en la dimensión general, no en la dimensión de recursos, y solo tienen efecto en el tráfico de entrada. El tráfico de entrada se refiere al tráfico que ingresa a la aplicación (EntryType.IN), como las solicitudes recibidas por los servicios web o los servidores Dubbo, todos pertenecen al tráfico de entrada.
Las reglas del sistema admiten los siguientes modos:
Carga adaptativa (válido solo para máquinas tipo Linux/Unix): la carga1 del sistema se utiliza como indicador heurístico para la protección adaptativa del sistema. La protección del sistema (fase BBR) se activará cuando la carga del sistema1 exceda el valor heurístico establecido y el número actual de subprocesos simultáneos en el sistema exceda la capacidad estimada del sistema. La capacidad del sistema se estima mediante maxQps * minRt del sistema. El valor de referencia de configuración es generalmente núcleos de CPU * 2,5.
Uso de CPU (versión 1.5.0+): cuando el uso de CPU del sistema excede el umbral, se activa la protección del sistema (rango de valores 0.0-1.0), que es relativamente sensible.
RT promedio: cuando el RT promedio de todo el tráfico de entrada en una sola máquina alcanza el umbral, se activa la protección del sistema. La unidad es milisegundos.
Número de subprocesos simultáneos: cuando el número de subprocesos simultáneos para todo el tráfico de entrada en una sola máquina alcanza el umbral, se activa la protección del sistema.
QPS de ingreso: cuando el QPS de todo el tráfico de ingreso en una sola máquina alcanza el umbral, se activa la protección del sistema.
principio
Imaginamos el proceso de procesamiento de solicitudes del sistema como una tubería de agua. Las solicitudes entrantes se llenan con agua en esta tubería de agua. Cuando el sistema procesa sin problemas, la solicitud no necesita estar en cola y pasa directamente a través de la tubería de agua. El RT de esta solicitud es el más corto; por el contrario, cuando las solicitudes se acumulan, el tiempo para procesarlas será: tiempo de cola + tiempo mínimo de procesamiento.
Página de configuración
05
—
aprobar
El uso real de Sentinel para lograr control de flujo, degradación de disyuntores y protección de carga es relativamente simple: solo necesita integrarse y configurarse de acuerdo con el artículo oficial. El control de tráfico, la protección de carga y el alto rendimiento de Sentinel son mejores que los de hystrix y proporciona una consola visual. Si se encuentra en un escenario de clúster de servicios donde la disponibilidad y la confiabilidad son altas e importantes, se le puede dar prioridad a Sentinel.