Невозможно использовать @LoadBalanced с OAuth2RestTemplate, настроенным на ClientCredentials

Я хочу использовать поток OAuth2 ClientCredentials для межсервисного взаимодействия между двумя серверами ресурсов. Все работает нормально, за исключением того, что я не могу использовать имя службы (функция балансировки нагрузки ленты) вместо имени хоста в моих вызовах OAuth2RestTemplate на удаленный сервер ресурсов.

Один из моих серверов ресурсов (который вызывает другой сервер ресурсов) имеет следующую конфигурацию:

Spring Boot 1.5.13
Spring Cloud Edgware.SR3

build.gradle содержит записи для эврики и ленты

compile('org.springframework.cloud:spring-cloud-starter-ribbon')
compile('org.springframework.cloud:spring-cloud-starter-eureka')


@Configuration
class RestTemplateConfig {

    @Bean
    @ConfigurationProperties("security.oauth2.client")
    public ClientCredentialsResourceDetails oauth2ClientCredentialsResourceDetails() {
        return new ClientCredentialsResourceDetails();
    }

    @LoadBalanced
    @Bean(name = "oauthRestTemplate")
    public OAuth2RestOperations oAuthRestTemplate(ClientCredentialsResourceDetails oauth2ClientCredentialsResourceDetails) {
        return new OAuth2RestTemplate(oauth2ClientCredentialsResourceDetails);
    }
}

Сервис, использующий этот OAuth2RestTemplate

@Service
class TestService {

    @Autowired
    @Qualifier("oauthRestTemplate")
    private OAuth2RestOperations oAuth2RestOperations;

    public void notifyOrderStatus(long orderId, OrderStatus newStatus) {
        oAuth2RestOperations.exchange("http://notification-service/api/order/{id}/status/{status}", HttpMethod.POST, null, Void.class, orderId, newStatus.name());
    }
}

Исключение появляется при вызове удаленного сервиса с использованием имени сервиса, т.е. http://notification-service вместо фактического имени хоста и порта удаленного сервера ресурсов. Если я использую фактическое имя хоста + порт, то все работает нормально, но я не хочу, чтобы мой единственный ресурс знал хост / пост другого сервера ресурсов.

Исключение:

Caused by: java.net.UnknownHostException: notification-service 

У меня есть несколько вопросов:

  1. Если мой RestTemplate помечен @LoadBalanced, то все работает нормально. Поддерживает ли OAuth2RestTemplate эту аннотацию и можем ли мы использовать имя службы вместо имени хоста? Если да, любая ссылка или документация будет оценена.
  2. Является ли хорошей идеей использовать учетные данные клиента oauth2 для межсервисной безопасности между двумя серверами ресурсов? Я не вижу образцы для того же в документации?

1 ответ

@LoadBalanced RestTemplate работает, когда мы используем RestTemplateCustomizer настроить вновь созданный OAuth2RestTemplate, как показано в приведенном ниже коде:

@Bean(name = "MyOAuthRestTemplate")
@LoadBalanced
public OAuth2RestOperations restTemplate(RestTemplateCustomizer customizer, ClientCredentialsResourceDetails oauth2ClientCredentialsResourceDetails) {
    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(oauth2ClientCredentialsResourceDetails);
    customizer.customize(restTemplate);
    return restTemplate;
}

Использование имени службы вместо фактического имени хоста прекрасно работает с использованием этого шаблона RestTemplate.

Другие вопросы по тегам