本節主要講解如何使用 Eureka 編寫服務消費者。
1)直接調用接口
創建服務消費者,消費我們剛剛編寫的 user/hello 接口,同樣需要先創建一個 Maven 項目 eureka-client-article-service,然後添加依賴,依賴和服務提供者的一樣,這裏就不貼代碼了。
創建啓動類 App,啓動代碼與前面所講也是一樣的。唯一不同的就是 application.properties 文件中的配置信息:
spring.application.name=eureka-client-article-service
server.port=8082
RestTemplate 是 Spring 提供的用於訪問 Rest 服務的客戶端,RestTemplate 提供了多種便捷訪問遠程 Http 服務的方法,能夠大大提高客戶端的編寫效率。我們通過配置 RestTemplate 來調用接口,代碼如下所示。
@Configuration
public class BeanConfiguration {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
創建接口,在接口中調用 user/hello 接口,代碼如下所示。
@RestController
public class ArticleController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/article /callHello")
public String callHello() {
return restTemplate.getForObject("http://localhost:8081/user/hello", String.class);
}
}
執行 App 啓動消費者服務,訪問 /article/callHello 接口來看看有沒有返回 Hello 字符串,如果返回了就證明調用成功。訪問地址爲 http://localhost:8082/article/callHello (http://localhost%EF%BC%9A8082/article/callHello)。
2)通過 Eureka 來消費接口
上面提到的方法是直接通過服務接口的地址來調用的,和我們之前的做法一樣,完全沒有用到 Eureka 帶給我們的便利。既然用了註冊中心,那麼客戶端調用的時候肯定是不需要關心有多少個服務提供接口,下面我們來改造之前的調用代碼。
首先改造 RestTemplate 的配置,添加一個 @LoadBalanced 註解,這個註解會自動構造 LoadBalancerClient 接口的實現類並註冊到 Spring 容器中,代碼如下所示。
@Configuration
public class BeanConfiguration {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
接下來就是改造調用代碼,我們不再直接寫固定地址,而是寫成服務的名稱,這個名稱就是我們註冊到 Eureka 中的名稱,是屬性文件中的 spring.application.name,相關代碼如下所示。
@GetMapping("/article/callHello2")
public String callHello2() {
return restTemplate.getForObject("http://eureka-client-user-service/user/hello", String.class);
}