目前,我正在遵循一些教程,使用 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 错误,因为第一个服务无法访问第二个服务(我相信)。那么我该如何防止这种情况发生呢?
编辑:修复复制粘贴错误(重复代码)
最佳答案
我认为当在两个服务中启用安全性时,您需要在其余模板调用的 header 中发送 session 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();`
这可能有助于在微服务之间进行剩余模板调用(此剩余模板调用将相应更改)。
关于java - Spring Cloud微服务,与其他微服务一起使用受密码保护的微服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43230398/