Red de conocimiento informático - Aprendizaje de programación - Dubo adaptable

Dubo adaptable

El Adaptive mencionado aquí es la anotación en dubbo: @Adaptive. De la definición de esta anotación, podemos ver @Target ({ElementType.TYPE, ElementType.METHOD}), que muestra que @Adaptive se puede usar para clases, interfaces y métodos.

@Adaptive representa la capacidad de adaptación dinámica de dubbo SPI. Si @Adaptive está anotado en la clase de implementación del punto de extensión, entonces el punto de extensión es una clase decorada que encapsula la instancia del punto de extensión real; si @Adaptive está anotado en el método, entonces la instancia del punto de extensión es un proxy dinámico, como el Protocolo; $Objeto adaptable.

La adaptación tiene como objetivo identificar clases conocidas fijas y ampliar clases desconocidas.

Representa la implementación manual e implementa una clase de decoración (modo de decoración en modo de diseño). Su función principal es arreglar clases conocidas. Actualmente solo hay dos en todo el sistema, AdaptiveCompiler y AdaptiveExtensionFactory.

Representa una clase adaptable dinámica generada y compilada automáticamente con @Adaptive en el método. Todos los métodos que contienen @Adaptive pueden obtener dinámicamente los puntos de extensión que necesitan implementar en función de los parámetros del método. Se utiliza principalmente para SPI, porque la clase spi no es una extensión fija desconocida, por lo que se diseña la clase dinámica $Adaptive

El método ExtensionLoader.getAdaptiveExtension devuelve el $Adaptive generado por compilación dinámica

Por ejemplo: la clase spi del protocolo tiene muchas clases de extensión desconocidas, como injvm, dubbo, registro, filtro, oyente, etc. ExtensionLoader.getAdaptiveExtension compilará dinámicamente la clase de Protocol$Adaptive y luego llamará a ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(spi class);

En Dubbo, normalmente primero obtienes la extensión adaptativa a través de ExtensionLoader.getAdaptiveExtension. Este método primero encontrará todas las clases que implementan la interfaz del punto de extensión para ver si contienen la anotación @Adaptive. Si es así, devolverá directamente una instancia de la clase. De lo contrario, busca métodos en la interfaz del punto de extensión que contienen la anotación @Adaptive y compila dinámicamente una clase que implementa la interfaz y extiende el método que contiene la anotación @Adaptive.

Cualquier implementación de extensión de Protocol no tiene anotación @Adaptive, y la interfaz de extensión contiene dos métodos de anotación @Adaptive: exporter() refer(), por lo que dubbo generó una clase dinámica Protocol$Adaptive, que implementa el Interfaz de protocolo para ampliar estos dos métodos adaptativos. La interfaz del punto de extensión y la clase Protocol$Adaptive final generada dinámicamente son los siguientes:

Explicación del método export(com.alibaba.dubbo.rpc.Invoker arg0):

Este hace que cada método pueda obtener dinámicamente los puntos de extensión reales que requieren en función de los parámetros del método.