目前我正在学习一些教程,用spring和neflix堆栈在java中创建微服务。 我遇到的一个问题是,我启动的每项服务似乎都受到生成密码的保护。因此,另一个微服务不可能使用另一个微服务。 那么,一个微服务通过休息呼叫消费另一个微服务的最佳方式是什么?我是否必须进一步调整application.yml以及如何使用?
这是一个例子(非常粗略和基本)。我有一个微服务,使用以下功能调用另一个:
@RestController
@SpringBootApplication
public class BookstoreApplication {
@RequestMapping(value = "/recommended")
public String readingList(){
return "Spring in Action (Manning), Cloud Native Java (O'Reilly), Learning Spring Boot (Packt)";
}
public static void main(String[] args) {
System.setProperty("spring.config.name", "springTut2CircuitBreakers/circuitApplication");
SpringApplication.run(BookstoreApplication.class, args);
}
}
其他微服务正在使用以下代码收听该呼叫:
@RestController
@SpringBootApplication
public class ReadingApplication {
@RequestMapping("/to-read")
public String readingList() {
RestTemplate restTemplate = new RestTemplate();
URI uri = URI.create("http://localhost:8090/recommended");
return restTemplate.getForObject(uri, String.class);
}
public static void main(String[] args) {
System.setProperty("spring.config.name", "springTut2CircuitBreakers/readingApplication");
SpringApplication.run(ReadingApplication.class, args);
}
}
当我尝试在浏览器中使用第一项服务时,我被要求输入密码。当我进入时,我已经访问它,但它显示401错误,因为第一个服务无法访问第二个(我相信)。那么我该如何防止这种情况发生呢?
修改:修复了复制粘贴错误(重复代码)
答案 0 :(得分:0)
我认为在两种服务中启用安全性时,您需要在其余模板调用的标头中发送会话ID,如下所示,
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Cookie", "JSESSIONID=" + session.getValue());
HttpEntity requestEntity = new HttpEntity(null, requestHeaders);
ResponseEntity rssResponse = restTemplate.exchange(
"http://localhost:8090/recommended",
HttpMethod.GET,
requestEntity,
Rss.class);
Rss rss = rssResponse.getBody();`
这可能有助于在您的微服务之间进行休息模板调用(此休息模板调用将相应更改)。