Search in sources :

Example 1 with LoadBalancer

use of com.github.df.restypass.lb.LoadBalancer in project RestyPass by darren-fu.

the class RestyProxyInvokeHandler method invoke.

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    if (isSpecialMethod(method)) {
        return handleSpecialMethod(proxy, method, args);
    }
    Object result;
    // 创建请求载体,RestyCommand
    RestyCommand restyCommand = new DefaultRestyCommand(method.getDeclaringClass(), method, method.getGenericReturnType(), args, restyCommandContext);
    // 获取过滤器
    List<CommandFilter> filterList = commandFilterContext.getFilterList();
    // 执行过滤器
    for (CommandFilter commandFilter : filterList) {
        if (CommandFilterType.BEFOR_EXECUTE.equals(commandFilter.getFilterType()) && commandFilter.shouldFilter(restyCommand)) {
            commandFilter.before(restyCommand);
        }
    }
    // 创建负载均衡器
    LoadBalancer loadBalancer = LoadBalanceFactory.createLoadBalancerForService(restyCommand.getServiceName(), restyCommand.getRestyCommandConfig().getLoadBalancer());
    // 为executor设置服务容器
    commandExecutor.setServerContext(serverContext);
    try {
        if (commandExecutor.executable(restyCommand)) {
            result = commandExecutor.execute(loadBalancer, restyCommand);
        } else {
            throw new IllegalStateException("Resty command is not executable:" + restyCommand);
        }
    } catch (RestyException ex) {
        if (fallbackExecutor.executable(restyCommand)) {
            if (log.isDebugEnabled()) {
                log.debug("{}使用降级服务", restyCommand.getPath());
            }
            try {
                result = fallbackExecutor.execute(restyCommand);
            } catch (FallbackException fe) {
                log.warn("服务{}降级发生异常:{}", restyCommand.getPath(), fe.getMessage());
                // 抛出原始Resty异常
                throw ex;
            }
        } else {
            log.warn("请求{}发生异常:{}", restyCommand.getPath(), ex.getMessage());
            throw ex;
        }
    }
    return result;
}
Also used : CommandFilter(com.github.df.restypass.filter.CommandFilter) RestyCommand(com.github.df.restypass.command.RestyCommand) DefaultRestyCommand(com.github.df.restypass.command.DefaultRestyCommand) RestyException(com.github.df.restypass.exception.execute.RestyException) LoadBalancer(com.github.df.restypass.lb.LoadBalancer) FallbackException(com.github.df.restypass.exception.execute.FallbackException) DefaultRestyCommand(com.github.df.restypass.command.DefaultRestyCommand)

Aggregations

DefaultRestyCommand (com.github.df.restypass.command.DefaultRestyCommand)1 RestyCommand (com.github.df.restypass.command.RestyCommand)1 FallbackException (com.github.df.restypass.exception.execute.FallbackException)1 RestyException (com.github.df.restypass.exception.execute.RestyException)1 CommandFilter (com.github.df.restypass.filter.CommandFilter)1 LoadBalancer (com.github.df.restypass.lb.LoadBalancer)1