Diseño de arquitectura: realice el modo de liberación gris en el modo de microservicio

Código fuente de este artículo: GitHub · haga clic aquí || GitEE · haga clic aquí

1. Lógica básica

La solicitud pasa el servicio 8001. En la regla gris, se leerá la lista de servicios de la siguiente solicitud y el servicio enrutado se seleccionará de acuerdo con la regla del parámetro del número de versión.

Configure el número de versión, distinga la versión gris y la versión normal predeterminada;
personalice el interceptor, administre el número de versión u otros parámetros de identificación que se pasarán en la solicitud;
personalice la estrategia de selección del servicio e identifique el servicio de enrutamiento según la versión;
si el servicio gris no existe, seleccione el servicio predeterminado según las reglas;

Dos, configuración de versión

Configure dos servicios en el clúster node12-server: configure la versión v7.0.0 en el puerto 8002 y configure la versión v7.0.1 en el puerto 8003 para probar la selección de versión gris.

Servicio 8002

eureka:
    metadata-map:
      version: v7.0.0

Servicio 8003

eureka:
    metadata-map:
      version: v7.0.1

Registro Eureka, lista de servicios:

Tres, transferencia de parámetros

Los microservicios administran el interceptor de solicitudes Feign entre servicios mediante la implementación de la interfaz RequestInterceptor. Antes de que la solicitud se enrute al servicio, se pueden realizar algunas operaciones de procesamiento en la solicitud. Operaciones comunes como pasar el número de versión, el token de usuario y otros atributos de la solicitud.

/**
 * 请求拦截器
 */
@Component
public class GrayReqInterceptor implements RequestInterceptor {
    
    

    private static final String VERSION_KEY = "versionId" ;

    /**
     * 处理请求头参数携带问题
     */
    @Override
    public void apply(RequestTemplate requestTemplate) {
    
    
        HttpServletRequest request =
                ((ServletRequestAttributes)
                RequestContextHolder.getRequestAttributes()).getRequest();

        String versionId = request.getHeader(VERSION_KEY);

        if (StringUtils.isNotEmpty(versionId)){
    
    
            requestTemplate.header(VERSION_KEY,versionId);
        }
    }
}

Aquí, se pasa un parámetro versionId como identificador principal para el siguiente servicio de enrutamiento de solicitudes.

Cuarto, la regla de la escala de grises

Agregue el número de versión para acceder en el encabezado del encabezado de la solicitud. Si hay un servicio coincidente, enrute todos los servicios de escala de grises solicitados, si no, regrese al servicio predeterminado.

@Configuration
public class GrayRule extends ZoneAvoidanceRule {
    
    

    @Bean
    public GrayReqInterceptor grayReqInterceptor(){
    
    
        return new GrayReqInterceptor();
    }

    private static final String VERSION_KEY = "versionId" ;

    @Override
    public Server choose(Object key) {
    
    

        HttpServletRequest request =
                ((ServletRequestAttributes)
                RequestContextHolder.getRequestAttributes()).getRequest();

        String versionId = request.getHeader(VERSION_KEY);

        // 服务匹配
        List<Server> serverList = this.getPredicate().getEligibleServers(this.getLoadBalancer().getAllServers(), key);
        Server toServer = getServer(serverList,versionId);
        if (toServer != null){
    
    
            return toServer ;
        } else {
    
    
            return getServer(serverList,GrayConstant.VERSION_DEF);
        }
    }

    private Server getServer (List<Server> serverList,String version){
    
    
        Server toServer = null ;
        for (Server server : serverList) {
    
    
            Map<String, String> metadata = ((DiscoveryEnabledServer) server).getInstanceInfo().getMetadata();

            String metaVersion = metadata.get("version");
            if (!StringUtils.isEmpty(metaVersion)) {
    
    
                if (metaVersion.equals(version)) {
    
    
                    toServer = server;
                }
            }
        }
        return toServer ;
    }
}

En el proceso real, la selección del servicio es muy complicada. Si no hay un servicio gris, las reglas de coincidencia de servicios deben formularse de acuerdo con la situación real, como el tiempo de respuesta o el sondeo predeterminado.

Una cosa más a tener en cuenta es que una vez que se usa la encapsulación secundaria de la API subyacente, el proyecto en general se verá afectado por la actualización de la versión del marco y es necesario seguir prestando atención al entorno del marco.

Cinco, proceso de prueba

1. Inicie los servicios relacionados y observe la lista de servicios de registro;

2. Solicite la interfaz del servicio 8001 y traiga el número de versión;

3. Observe los servicios de enrutamiento de diferentes números de versión;

4. No lleve el número de versión, observe la selección de servicio predeterminada;

Seis, dirección de código fuente

GitHub地址:知了一笑
https://github.com/cicadasmile/spring-cloud-base
GitEE地址:知了一笑
https://gitee.com/cicadasmile/spring-cloud-base

Lectura recomendada: sistema de programación de acabado

Número de serie nombre del proyecto Dirección de GitHub Dirección GitEE Recomendado
01 Java describe patrones de diseño, algoritmos y estructuras de datos GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆
02 Fundamentos Java, concurrencia, orientado a objetos, desarrollo web GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆
03 Explicación detallada del caso del componente básico del microservicio SpringCloud GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆
04 Caso completo de combate real de arquitectura de microservicio SpringCloud GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆
05 Comenzando con la aplicación básica de SpringBoot framework a avanzada GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆
06 SpringBoot framework integra y desarrolla middleware común GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆
07 Caso básico de gestión de datos, distribución, diseño de arquitectura GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆
08 Grandes series de datos, almacenamiento, componentes, informática y otros marcos GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆

Supongo que te gusta

Origin blog.csdn.net/cicada_smile/article/details/109830130
Recomendado
Clasificación