我想使用OAuth2 ClientCredentials流进行两个资源服务器之间的服务间通信。一切正常,但我无法在OAuth2RestTemplate调用远程资源服务器时使用服务名称(功能区负载均衡器功能)而不是主机名。
我的一个资源服务器(调用另一个资源服务器)具有以下配置:
Spring Boot 1.5.13
Spring Cloud Edgware.SR3
build.gradle包含eureka和功能区的条目
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
我几乎没有问题:
答案 0 :(得分:1)
@LoadBalanced
当我们使用RestTemplateCustomizer
自定义新创建的OAuth2RestTemplate时,RestTemplate可以正常工作,如以下代码所示:
@Bean(name = "MyOAuthRestTemplate")
@LoadBalanced
public OAuth2RestOperations restTemplate(RestTemplateCustomizer customizer, ClientCredentialsResourceDetails oauth2ClientCredentialsResourceDetails) {
OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(oauth2ClientCredentialsResourceDetails);
customizer.customize(restTemplate);
return restTemplate;
}
使用服务名称而不是实际的主机名可以很好地使用此RestTemplate。