Sentinel es compatible con varios marcos de código abierto

Sentinel es un excelente marco de control de flujo. En la producción real, nuestros proyectos utilizarán marcos como Spring Boot y Dubbo. Si se implementa el control de flujo en estos marcos, ¿qué configuración es la mejor solución? Este artículo El artículo se centra en analizar cómo se adapta Sentinel a varios marcos de código abierto.

servlet web

Sentinel proporciona integración nativa para Servlets, que pueden controlar el flujo de solicitudes web. Los siguientes módulos deben introducirse al usarlo (tome Maven como ejemplo):

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-web-servlet</artifactId>
    <version>x.y.z</version>
</dependency>

Agregue la configuración en Spring y defina Bean:

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean sentinelFilterRegistration() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new CommonFilter());
        registration.addUrlPatterns("/*");
        registration.setName("sentinelFilter");
        registration.setOrder(1);

        return registration;
    }
}

De hecho, se intercepta a través del mecanismo Filter, y la clase que implementa específicamente el control de flujo es CommonFilter.

1) Limpiar la URL

Los usuarios deben implementar la interfaz UrlCleaner para limpiar los recursos (por ejemplo, colocar direcciones URL que satisfagan /foo/:id en /foo/* recursos) y luego registrarlas en WebCallbackManager. De lo contrario, la cantidad de recursos será demasiado grande y las reglas para el exceso de recursos no surtirán efecto cuando se exceda el umbral del número de recursos (actualmente 6000).

// Clean and unify the URL.
// For REST APIs, you have to clean the URL (e.g. `/foo/1` and `/foo/2` -> `/foo/:id`), or
// the amount of context and resources will exceed the threshold.
UrlCleaner urlCleaner = WebCallbackManager.getUrlCleaner();
if (urlCleaner != null) {
    target = urlCleaner.clean(target);
}

Web.png

En la adaptación Web Servlet, admite la limitación de flujo según la fuente. El recurso es la URL procesada, y el nombre del método también se puede empalmar. El tipo de recurso definido es Web.

dubbo

En Dubbo, se puede dividir en Proveedor de Servicios y Consumidor de Servicios.El enfoque de las dos dimensiones es un poco diferente.

Proveedor de servicio

Para evitar que el proveedor se vea arrastrado por la oleada de tráfico y afecte la estabilidad, puede configurar el límite de flujo del modo QPS para el proveedor, de modo que cuando la cantidad de solicitudes por segundo exceda el umbral establecido, muchas solicitudes serán automáticamente rechazado. La granularidad limitante actual puede ser de dos tipos de granularidad: interfaz de servicio y método de servicio.

La implementación específica se basa en Dubbo Filter y el mecanismo SPI.

provider.png

El tipo de recurso definido es RPC.

Consumidor de servicios

Service Consumer 作为客户端去调用远程服务。每一个服务都可能会依赖几个下游服务,若某个服务 A 依赖的下游服务 B 出现了不稳定的情况,服务 A 请求 服务 B 的响应时间变长,从而服务 A 调用服务 B 的线程就会产生堆积,最终可能耗尽服务 A 的线程数。我们通过用并发线程数来控制对下游服务 B 的访问,来保证下游服务不可靠的时候,不会拖垮服务自身。基于这种场景,推荐给 Consumer 配置线程数模式的限流,来保证自身不被不稳定服务所影响。

代码基本与 Provider一致,Entry方向为 EntryType.OUT。

gRPC

在使用 Sentinel gRPC Adapter 时,只需要将对应的 Interceptor 注册至对应的客户端或服务端中。其中客户端的示例如下:

public class ServiceClient {

    private final ManagedChannel channel;

    ServiceClient(String host, int port) {
        this.channel = ManagedChannelBuilder.forAddress(host, port)
            .intercept(new SentinelGrpcClientInterceptor()) // 在此处注册拦截器
            .build();
        // 在此处初始化客户端 stub 类
    }
}

服务端的示例如下:

import io.grpc.Server;

Server server = ServerBuilder.forPort(port)
     .addService(new MyServiceImpl()) // 添加自己的服务实现
     .intercept(new SentinelGrpcServerInterceptor()) // 在此处注册拦截器
     .build();

grpc.png

Supongo que te gusta

Origin juejin.im/post/7235435351049076792
Recomendado
Clasificación