El software debe ser capaz de usar antes de su reutilización.
-> Lista de retorno columna <-
descarga Dirección: https://github.com/f641385712/netflix-learning
directorio
prefacio
Si ya sabe demasiado Netflix Hystrix
, entonces no son ajenos al modo de comando Comando. Lo mismo, la cinta también se utiliza para llevar a cabo el proceso en base a modo de comando RxJava para controlar una solicitud, que es el contenido básico de este artículo se explicará: LoadBalancerCommand
.
texto
modos de comando RxJava base, LoadBalancerCommand
B representa la carga de comandos de equilibrio para solicitud de transferencia al equilibrador de carga ILoadBalancer
. No es mucho clases, la siguiente captura de pantalla relacionado:
Uno de los más importantes fue, sin duda, LoadBalancerCommand
la API, antes de eso, el primer RBI de su clase base.
ServerOperation
Esta interfaz es muy simple, se trata de una interfaz de función Function
única: "comer" en un servidor, un asador Observable<T>
. rxjava basada en observable de apoyo
// 仅仅继承自Func1,暴露出结果泛型T
public interface ServerOperation<T> extends Func1<Server, Observable<T>> {}
Como movimiento, como un paso en la referencia LoadBalancerCommand#submit()
presentado al procesamiento de comandos.
ExecutionInfo
Un POJO, en nombre de la aplicación de la información.
public class ExecutionInfo {
private final Server server;
// 在该Server上已经尝试过的总次数
private final int numberOfPastAttemptsOnServer;
// 已经尝试过的Server总个数
private final int numberOfPastServersAttempted;
// 构造器是私有化的。该静态方法用于创建实例
public static ExecutionInfo create(Server server, int numberOfPastAttemptsOnServer, int numberOfPastServersAttempted) {
return new ExecutionInfo(server, numberOfPastAttemptsOnServer, numberOfPastServersAttempted);
}
}
Se utiliza principalmente como un parámetro para pasar ExecutionListener
, de manera que la persona que llama se puede realizar para husmear información.
ExecutionInfoContext
Es LoadBalancerCommand
una clase interna, la información de registro info contexto cuando se ejecuta.
LoadBalancerCommand:
class ExecutionInfoContext {
// 当前Server,每次调用set方法,此值就会变哦~~~~
// serverAttemptCount记录了当前请求已经换了几次Server了~~~
Server server;
// 已经重试的Server总数(每次换台Server就+1)
int serverAttemptCount = 0;
// 这次请求的重试总数(包括相同Server,以及换Server,总之是个总数)
int attemptCount = 0;
public ExecutionInfo toExecutionInfo() {
return ExecutionInfo.create(server, attemptCount-1, serverAttemptCount-1);
}
public ExecutionInfo toFinalExecutionInfo() {
return ExecutionInfo.create(server, attemptCount, serverAttemptCount-1);
}
}
El contexto es principalmente una solicitud de registro a la número de contexto de reintentos cuando se ejecuta, generar una final de ExecutionInfo
ejemplo para el oyente , el usuario puede completar la determinación de personalización (tales como una limitación: el reintento no tendría múltiples reintentos).
ExecutionContext (importante)
En cada equilibrador de carga de ejecución de inicio se crea objeto de contexto, los metadatos contienen algunos de los equilibrador de carga y los datos variables de estado.
public class ExecutionContext<T> {
// 存储元数据的Map
private final Map<String, Object> context;
// ChildContext继承自ExecutionContext
private final ConcurrentHashMap<Object, ChildContext<T>> subContexts;
// 请求。requestConfig的优先级比clientConfig的高哦,具有“覆盖”效果
private final T request;
private final IClientConfig requestConfig;
private final RetryHandler retryHandler;
private final IClientConfig clientConfig;
// 子上下文:它增加了一个属性ExecutionContext<T> parent;
// 这样便可以让两个ExecutionContext关联起来
private static class ChildContext<T> extends ExecutionContext<T> {
private final ExecutionContext<T> parent;
ChildContext(ExecutionContext<T> parent) {
super(parent.request, parent.requestConfig, parent.clientConfig, parent.retryHandler, null);
this.parent = parent;
}
@Override
public ExecutionContext<T> getGlobalContext() {
return parent;
}
}
... // 省略构造器赋值
// default访问权限的方法:获取子执行上下文
// 没有就会new一个然后放在ConcurrentHashMap缓存起来。key就是obj
ExecutionContext<T> getChildContext(Object obj) { ... }
...
// 获得指定name的value。一个简单的k-v而已
public void put(String name, Object value) {
context.put(name, value);
}
public Object get(String name) {
return context.get(name);
}
// 先去requestConfig里找,若没找再去clientConfig里找
public <S> S getClientProperty(IClientConfigKey<S> key) { ... }
// 注意:子上下文ChildContext的该方法返回的是parent,所以就打通了
public ExecutionContext<T> getGlobalContext() {
return this;
}
}
Por el contexto Padre, Hijo de diseño, para asegurar que cada uno listener
tiene su propioExecutionContext
, pero también puede ExecutionContext#getGlobalContext()
ser obtenido por todas listener
contexto compartido a nivel mundial.
ExecutionListener
Los oyentes llaman equilibrador de carga en diferentes fases de ejecución.
// I:input类型,给ExecutionContext用。这样ExecutionContext#getRequest()就能拿到这个请求对象
// O:负载均衡器执行的output输出
public interface ExecutionListener<I, O> {
// 在执行即将开始时调用。
public void onExecutionStart(ExecutionContext<I> context) throws AbortExecutionException;
// 当服务器被选中,请求**将在服务器上执行时**调用。
public void onStartWithServer(ExecutionContext<I> context, ExecutionInfo info) throws AbortExecutionException;
// 当在服务器上执行请求时接收到异常时调用(这时木有Response,只有异常信息)
public void onExceptionWithServer(ExecutionContext<I> context, Throwable exception, ExecutionInfo info);
// 执行正常,有response
public void onExecutionSuccess(ExecutionContext<I> context, O response, ExecutionInfo info);
// 在**所有重试**后认为请求失败时调用
// finalException:最终的异常。有可能包装着重试时的各种异常
public void onExecutionFailed(ExecutionContext<I> context, Throwable finalException, ExecutionInfo info);
}
Y se ha de esta interfaz ninguna realización integrada, se deja al usuario de un gancho.
ExecutionContextListenerInvoker
Se puede considerar como una clase de utilidad: para el contexto de ejecución ExecutionContext
para llamar en una variedad de ExecutionListener
ellos. Funcionar muy parecido a lo familiar primavera de arranque carril SpringApplicationRunListeners
para ejecutar SpringApplicationRunListener
el oyente.
public class ExecutionContextListenerInvoker<I, O> {
// 执行上下文
private final ExecutionContext<I> context;
// 执行时的监听器们
private final List<ExecutionListener<I, O>> listeners;
private final IClientConfig clientConfig;
// key表示的是ExecutionListener实现类的全类名
// value:IClientConfigKey。它的值是"listener." + key+ ".disabled"
// 因为CommonClientConfigKey.valueOf()比较耗时,所以这里用了缓存
private final ConcurrentHashMap<String, IClientConfigKey> classConfigKeyMap;
... // 省略构造器
public void onExecutionStart() {
onExecutionStart(this.context);
}
public void onExecutionStart(ExecutionContext<I> context) {
for (ExecutionListener<I, O> listener : listeners) {
// 若这个Listener没有被禁用,那就执行它
if (!isListenerDisabled(listener)) {
// 请注意:这里的上下文使用的是子上下文哦
// 所以保证了每个监听器均有一个自己的上下文,各有一份自己的数据,线程安全
listener.onExecutionStart(context.getChildContext(listener));
}
}
}
... // 执行监听器其它方法的逻辑一毛一样,略
// 判断一个监听器是否被禁用。可通过动态配置来开/关
// "listener." + className + ".disabled":禁用
private boolean isListenerDisabled(ExecutionListener<?, ?> listener) {
if (clientConfig == null) {
return false;
} else {
String className = listener.getClass().getName();
IClientConfigKey key = classConfigKeyMap.get(className);
if (key == null) {
key = CommonClientConfigKey.valueOf("listener." + className + ".disabled");
IClientConfigKey old = classConfigKeyMap.putIfAbsent(className, key);
if (old != null) {
key = old;
}
}
return clientConfig.getPropertyAsBoolean(key, false);
}
}
}
- escucha la cinta se deja a los desarrolladores involucrados en el proceso de ejecución de balanceo de carga del gancho, el más importante (sin ningún tipo de realización construida)
- Cada oyente ejecutado por su propio contexto, seguro para hilos
- Puede ser configurado por el exterior de:
"listener." + className + ".disabled"
una manera de desactivar la ejecución del oyente, una cierta flexibilidad para satisfacer el diseño
resumen
Sobre la cinta Load Balancing comando: LoadBalancerCommand (a) sobre la base de la clase RBI introducido por primera vez a esta parte. Este artículo es relativamente sencillo, sobre todo para los siguientes servicios, así que estad atentos.
declaración
El original no es fácil, no es fácil de palabra de código, gracias por su pulgar, colección, atención. 把本文分享到你的朋友圈是被允许的,但拒绝抄袭
. También puede código de exploración [Izquierda / o añadir WX: fsx641385712] Los invito a unirse a la Ingeniería de Java, Arquitecto Serie aprendizaje en grupo familiar y la comunicación.
- [Aprende a disfrutar de Netflix] a, configuración de Apache Commons: expertos en gestión de configuración que le rodean
- [Aprende a disfrutar de Netflix] dos, de configuración de Apache Commons mecanismo detector de eventos implementar y usar ReloadingStrategy actualización caliente
- [Aprende a disfrutar de Netflix] tres, Apache Commons Configuration2.x nuevo evento - mecanismo de detección
- [Aprende a disfrutar de Netflix] cuatro, Apache Commons Configuration2.x sistema de archivos posicionamiento FileLocator y FileHandler
- [Aprende a disfrutar de Netflix] cinco, Apache Commons Configuration2.x diferentes tipos de modo de Constructor: ConfigurationBuilder
- [Aprende a disfrutar de Netflix] seis, Apache Commons Configuration2.x rápidamente herramientas de construcción Parámetros y Configuraciones
- [Aprende a disfrutar de Netflix] siete, Apache Commons Configuration2.x cómo presentar la carga de calor actualización / caliente?
- [Aprende a disfrutar de Netflix] ocho, diferencia Apache Commons Configuration2.x en comparación con lo que trajo en el uso 1.x?
- [Aprende a disfrutar de Netflix] nueve, Archaius biblioteca de gestión de la configuración: primera experiencia y explicar la API subyacente
- [Aprende a disfrutar de Netflix] diez, extensiones Archaius al núcleo de la aplicación de configuración API de configuración de los Comunes
- [Ciencia disfrutar de Netflix] once, Archaius administrador de configuración ConfigurationManager y propiedades dinámicas a DynamicPropertySupport apoyo
- [Aprende a disfrutar de Netflix] propiedades dinámicas doce, Archaius DynamicProperty explicar los principios (importante)
- [Aprende a disfrutar de Netflix] trece, propiedad Archaius abstracta propiedad y PropertyWrapper Detallada
- [Aprende a disfrutar de Netflix] catorce, Archaius cómo proporcionar soporte de configuración para multi-medio ambiente, multizona, el despliegue nublado?
- [Aprende a disfrutar de Netflix] quince años, y la primavera Archaius nube de integración: la primavera en la nube-arranque-Netflix-archaius
- [Aprende a disfrutar de Netflix] dieciséis años, Hystrix interruptor: experiencia inicial y RxJava Perfil
- [Science disfrutar de Netflix] diecisiete, MAMMALIA, y propiedades abstractas y lograr la integración Archaius configuración externa, dinámico
- [Ciencia disfrutar de Netflix] dieciocho años, Hystrix Eliminación: configuración de la instancia global y
- [Aprende a disfrutar Netflix] diecinueve, Hystrix plug-in mecanismo: SPI Interface Descripción detallada y HystrixPlugins
- [Aprende a disfrutar de Netflix] veinte, la transferencia de datos a través de hilos Hystrix Solución: HystrixRequestContext
- [Ciencia disfrutar de Netflix] veintiuno, la recopilación de datos de índice Hystrix (calentamiento): algoritmo de ventana deslizante (con código de ejemplo)
- [Aprende a disfrutar de Netflix] veintidós, origen del evento Hystrix y un flujo de eventos: HystrixEvent y HystrixEventStream
- [Aprende a disfrutar de Netflix] veintitrés años, Hystrix cubo de contador: BucketedCounterStream
- [Aprende a disfrutar de Netflix] veinticuatro, estadísticas Hystrix en la ventana deslizante: BucketedRollingCounterStream, HealthCountsStream
- [Science disfrutar de Netflix] veinticinco, estadísticas acumuladas MAMMALIA, el flujo, la distribución, el flujo máximo concurrente fluir, configuración de flujo, función de flujo (con ejemplo de código)
- [Ciencia disfrutar de Netflix] veintiséis años, Hystrix colector de datos de índice: HystrixMetrics (fuentes de datos HystrixDashboard)
- [Aprende a disfrutar de Netflix] veintisiete, Hystrix ¿Cuál es el estado medio abierto del interruptor de circuito? HystrixCircuitBreaker detallada
- [Aprende a disfrutar de Netflix] veintiocho, Hystrix EventCounts contador de eventos y los resultados ExecutionResult
- [Aprende a disfrutar de Netflix] veintinueve, Hystrix interfaz de núcleo de ejecución: HystrixExecutable, HystrixObservable y HystrixInvokableInfo
- [Aprende a disfrutar de Netflix] y media, Hystrix el repliegue de repliegue / rebaja interpretación lógica Fuente: getFallbackOrThrowException
- [Ciencia disfrutar de Netflix] XXXI, cinco casos y degradado muestra la lógica de código de retorno del gatillo Hystrix
- [Aprende a disfrutar de Netflix] treinta y dos, Hystrix tiro HystrixBadRequestException por qué la excepción no se dispara el fusible?
- [Aprende a disfrutar de Netflix] 33 o cuando la ejecución Hystrix del método de destino, cómo llamar a los recursos de uso de hilo?
- [Science disfrutar de Netflix] treinta y cuatro, método Hystrix de realizar cierta interpretación fuente lógica: executeCommandAndObserve
- [Aprende a disfrutar de Netflix] treinta y cinco, ejecución Hystrix de un maestro: AbstractCommand Comentarios
- [Ciencia disfrutar de Netflix] treinta y seis, orden de petición de Hystrix: HystrixCommand y HystrixObservableCommand
- [Aprende a disfrutar de Netflix] treinta y siete, Primal cinta Introducción - cliente equilibrador de carga
- [Ciencia disfrutar de Netflix] treinta y ocho años, la cinta fuente de análisis sintácticos núcleo API: En la cinta de núcleo (a) solicitar iClient cliente
- [Aprende a disfrutar de Netflix] treinta y nueve, la cinta de código fuente API central de análisis: Cinta-núcleo (dos) de configuración en detalle IClientConfig
- [Science disfrutar de Netflix] cuarenta, la cinta fuente análisis sintácticos núcleo API: cinta-core (tres) procesador de reintento RetryHandler
- [Aprende a disfrutar de Netflix] cuarenta y uno, análisis de código fuente API central de la cinta: la cinta anormal-core (cuatro) cliente ClientException
- [Aprende a disfrutar de Netflix] cuarenta y dos, LoadBalancer cinco componentes de la cinta: Iping latido del corazón
- [Aprende a disfrutar de Netflix] cuarenta y tres, LoadBalancer cinco componentes de la cinta: la lista de los servicios ServerList
- [Aprender a disfrutar de Netflix] cuarenta y cuatro, Netflix estadísticas detalladas, le enseñó cómo escribir una versión simple súper del sistema de monitoreo
- [Aprende a disfrutar de Netflix] cuarenta y cinco años, el estado del servidor de la cinta: ServerStats su principio disyuntor
- [Aprende a disfrutar de Netflix], el control total del estado de equilibrio de carga del servidor de directivas de la cinta cuarenta y seis: LoadBalancerStats
- [Aprende a disfrutar de Netflix] cuarenta y siete, cinta multi-región de selección: ZoneAvoidanceRule.getAvailableZones () obtiene el área disponible
- [Ciencia disfrutar de Netflix] cuarenta y ocho, servidor de filtrado de la cinta componentes básicos de lógica: AbstractServerPredicate
- [Aprende a disfrutar de Netflix] cuarenta y nueve, LoadBalancer cinco componentes de la cinta: Lista Filtrar Servicio ServerListFilter
- [Aprende a disfrutar de Netflix] cincuenta, LoadBalancer los cinco componentes de la cinta: la lista de los servicios de actualización ServerListUpdater
- [Ciencia disfrutar de Netflix] cincuenta y uno, la cinta LoadBalancer los cinco componentes de: iRule (a) y de votación ponderada de round-robin
- [Aprende a disfrutar de Netflix] cincuenta y dos, cinta LoadBalancer de los cinco componentes de: iRule (II) utilizados en el cluster a gran escala de reglas configurables
- [Aprende a disfrutar de Netflix] cincuenta y tres años, la cinta LoadBalancer de los cinco componentes de: iRule (iii) al azar y vuelva a intentar todo Resumen iRule dan cuenta
- [Aprender a disfrutar de Netflix] cincuenta y cuatro años, la cinta de iniciar la operación de conexión: IPrimeConnection detectar Server es capaz de proporcionar servicios
- [Aprende a disfrutar de Netflix] cincuenta y cinco años, contexto de ejecución equilibrador de carga de la cinta: LoadBalancerContext
- [Ciencia disfrutar de Netflix] cincuenta y seis, la cinta equilibrador de carga ILoadBalancer (a): BaseLoadBalancer
- [Aprende a disfrutar de Netflix] cincuenta y siete, equilibrador de carga de la cinta ILoadBalancer (dos): ZoneAwareLoadBalancer tiene conciencia regional, lista de servicios equilibrador de carga dinámica