Spring Cloud微服务,使用密码保护的微服务与其他微服务

时间:2017-04-05 11:51:52

标签: java spring spring-boot spring-cloud netflix-eureka

目前我正在学习一些教程,用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错误,因为第一个服务无法访问第二个(我相信)。那么我该如何防止这种情况发生呢?

修改:修复了复制粘贴错误(重复代码)

1 个答案:

答案 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();`

这可能有助于在您的微服务之间进行休息模板调用(此休息模板调用将相应更改)。