Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何在运行时更新下拖配置?_Spring Boot_Spring Cloud Config_Undertow - Fatal编程技术网

Spring boot 如何在运行时更新下拖配置?

Spring boot 如何在运行时更新下拖配置?,spring-boot,spring-cloud-config,undertow,Spring Boot,Spring Cloud Config,Undertow,首先,请原谅我英语不好 您好,我正在使用spring boot和undertow开发小型反向代理服务器 我正在使用注册WebServerFactoryCustomizer运行应用程序,如下所示 @Component public class MyWebServerFactoryCustomizer implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> { private final En

首先,请原谅我英语不好

您好,我正在使用spring boot和undertow开发小型反向代理服务器

我正在使用注册WebServerFactoryCustomizer运行应用程序,如下所示

@Component
public class MyWebServerFactoryCustomizer implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {

    private final Environment env;

    private final HandlerLookupService handlerLookupService;

    @Override
    public void customize(UndertowServletWebServerFactory factory) {
        factory.addBuilderCustomizers(builder -> builder
                .setDirectBuffers(//blah blah)
                .setServerOption(//blah blah)
                .setSocketOption(//blah blah)
                .addHttpsListener(//blah blah)
                .setWorkerThreads(200));
        factory.addDeploymentInfoCustomizers(
                deploymentInfo -> deploymentInfo.addInitialHandlerChainWrapper(
                        handler -> handlerLookupService.getRootHandler()
                ));
        factory.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error"));
    }

}
@组件
公共类MyWebServerFactoryCustomizer实现WebServerFactoryCustomizer{
私人最终环境保护;
专用最终HandlerLookupService HandlerLookupService;
@凌驾
public void自定义(位于TowServletWebServerFactory下){
factory.addBuilderCustomizers(生成器->生成器
.setDirectBuffers(//诸如此类)
.setServerOption(//诸如此类)
.setSocketOption(//诸如此类)
.addHttpsListener(//诸如此类)
.setWorkerThreads(200));
factory.addDeploymentInfoCustomizers(
deploymentInfo->deploymentInfo.addInitialHandlerChainWrapper(
handler->handlerLookupService.getRootHandler()
));
factory.addErrorPages(新错误页(HttpStatus.INTERNAL_SERVER_ERROR,“/ERROR”);
}
}
属性(包括目标服务器地址、重试策略等)写入应用程序yml文件,并与SpringCloudConfigServer同步

注入的HandlerLookupService实例使用这样的属性

@ConfigurationProperties(prefix = "gateway.application")
public class ApplicationProps {

    private String name;   
    
    private List<Map<String, Object>> props;    
    private List<ReverseProxyGroup> reverseProxyGroup;

    private Map<String, String> authorization;

    ///

    @Data
    public static class ReverseProxyGroup {
 
        private String name;    
        
        private String myHostName;      
        private String scheme = "http://";
        private int port = 8080;

        private boolean legacy = false;

        private String hostName;
        private int problemServerRetry; 
        private int connectionsPerThread; 
        private int maxRequestTime;
        private int maxQueueSize;
        .........

    }    
    

    @Data
    public static class ReverseProxy {
 
        private int weight;
        private String group;   
        // http://10.22.222.112
        private String lvsServer;
        private List<String> servers;
    }

    @Data
    public static class Routing {
        private String target;
        private List<String> pattern;
    }

}


@Override
    public HttpHandler getRootHandler() {
        
        NameVirtualHostHandler handler = 
                Handlers.virtualHost(new PathHandler(getVirtualHostHandler())); // http://www.localhost:8080/metrics
        
        applicationProps.getReverseProxyGroup().forEach(group -> {          
            ProxyWrapper proxyWrapper = handlerFactory.getProxyHandler(group);
            map.put(group.getName(), proxyWrapper);
        });

        applicationProps.getReverseProxyGroup().forEach(group -> {
            handler.addHost(group.getMyHostName(),
                    new TimingHttpHandler(getHandler(group), group.getHostName()));
        });

        handler.addHost("mydomain.com", getAdminHandler());

        return handler;
    }
@ConfigurationProperties(prefix=“gateway.application”)
公共类应用程序道具{
私有字符串名称;
私人列表道具;
私有列表组;
私有地图授权;
///
@资料
公共静态类ReverseProxy组{
私有字符串名称;
私有字符串myHostName;
私有字符串scheme=“http://”;
专用int端口=8080;
私有布尔值=false;
私有字符串主机名;
私有int问题;
私有int连接perthread;
私有整数maxRequestTime;
私有整数最大队列大小;
.........
}    
@资料
公共静态类ReverseProxy{
私有整数权重;
私有字符串组;
// http://10.22.222.112
私有字符串lvsServer;
私有列表服务器;
}
@资料
公共静态类路由{
私有字符串目标;
私有列表模式;
}
}
@凌驾
公共HttpHandler getRootHandler(){
NameVirtualHostHandler处理程序=
Handlers.virtualHost(新路径处理程序(getVirtualHostHandler());//http://www.localhost:8080/metrics
applicationProps.getReverseProxyGroup().forEach(组->{
ProxyWrapper ProxyWrapper=handlerFactory.getProxyHandler(组);
put(group.getName(),proxyWrapper);
});
applicationProps.getReverseProxyGroup().forEach(组->{
handler.addHost(group.getMyHostName(),
新的TimingHttpHandler(getHandler(group),group.getHostName());
});
addHost(“mydomain.com”,getAdminHandler());
返回处理程序;
}
因此,我想在运行时通过更改config server的属性来更新反向代理服务器配置(例如删除一些目标服务器或添加)

我认为在spring boot应用程序类上添加@EventListener receivesRefreshScopeRefreshedEvent是可能的,但在事件实例中没有任何用处

有人愿意帮助我吗?谢谢