Spring boot 如何在运行时更新下拖配置?
首先,请原谅我英语不好 您好,我正在使用spring boot和undertow开发小型反向代理服务器 我正在使用注册WebServerFactoryCustomizer运行应用程序,如下所示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
@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是可能的,但在事件实例中没有任何用处
有人愿意帮助我吗?谢谢