Подробнее CLOSE_WAIT об использовании keycloak-spring-security-adapter - PullRequest
0 голосов
/ 31 января 2019

При запуске нагрузочного теста в моем приложении с пружинной загрузкой я мог видеть, что другие порты накапливались в состоянии CLOSE_WAIT.Дальнейшее изучение привело меня к выводу, что CLOSE_WAIT находится на портах, привязанных к keycloak.

Я использую

keycloak-spring-security-adaptor Ver 3.4.3.Final

Есть ли способ установить тайм-аут keepalive в адаптере Keycloak, как мы делаем с HttpClient.

Я попытался запустить и keycloak, и мое приложение с локального хоста и захватил вывод netstat и предоставил его здесь

docker exec spanugo_api netstat -tan |grep CLOSE_WAIT tcp 32 0 172.20.0.6:50276 54.81.249.191:11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:33204 34.235.253.108:11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:50228 54.81006
tcp 32 0 172.20.0.6:50232 54.81.249.191:11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:50286 54.81.249.191:11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:33182 34.235.26.108CLOSE_WAIT
tcp 32 0 172.20.0.6:50224 54.81.249.191:11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:50234 54.81.249.191:11006 CLOSE_WAIT
tcp 32 0 172.20.0.6.2.253.2:11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:50282 54.81.249.191:11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:33186 34.235.253.108:11006 CLOSE_WAIT
tcp 32 0 172.20.0.6.249: 11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:33190 34.235.253.108:11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:50218 54.81.249.191:11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:50249.191: 11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:50230 54.81.249.191: 11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:33194 34.235.253.108:11006 CLOSE_WAIT
tcp 32 0 172.20.0.6:50278 54.81.249.191:11006 CLOSE_WAIT

также проводвывод ниже для одного порта на CLOSE_WAIT

enter image description here

Я расширил " KeycloakWebSecurityConfigurerAdapter "

Я мог понятьчто добавление ConnectionKeepAliveStrategy решило бы проблему, но не смогло получить ручку при добавлении так же, как нигде, где я мог получить объект httpclient.

1 Ответ

0 голосов
/ 22 февраля 2019

Я создал простое решение, которое ограничивает количество подключений одним.

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter {

    @Value("${keycloak.json.path:classpath:keycloak.json}")
    private Resource keycloakJSON;

    /**
     * Registers the KeycloakAuthenticationProvider with the authentication manager.
     */
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(keycloakAuthenticationProvider());
    }

    /**
     * Defines the session authentication strategy.
     */
    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new NullAuthenticatedSessionStrategy();
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        super.configure(http);
        //...
    }

    @Bean
    public FilterRegistrationBean keycloakAuthenticationProcessingFilterRegistrationBean(KeycloakAuthenticationProcessingFilter filter) {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
        registrationBean.setEnabled(false);
        return registrationBean;
    }

    @Bean
    public FilterRegistrationBean keycloakPreAuthActionsFilterRegistrationBean(KeycloakPreAuthActionsFilter filter) {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
        registrationBean.setEnabled(false);
        return registrationBean;
    }

    @Bean
    public KeycloakConfigResolver keycloakConfigResolver() {
        return new KeycloakConfigResolver() {

            private KeycloakDeployment keycloakDeployment;

            @Override
            public KeycloakDeployment resolve(HttpFacade.Request facade) {
                try {
                    // here is an important part!!!!
                    if (keycloakDeployment == null) {
                        keycloakDeployment = KeycloakDeploymentBuilder.build(keycloakJSON.getInputStream());
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

                return keycloakDeployment;
            }
        };
    }

}
...