Невозможно использовать @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
У меня есть несколько вопросов:
- Если мой RestTemplate помечен @LoadBalanced, то все работает нормально. Поддерживает ли OAuth2RestTemplate эту аннотацию и можем ли мы использовать имя службы вместо имени хоста? Если да, любая ссылка или документация будет оценена.
- Является ли хорошей идеей использовать учетные данные клиента 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.