SpringCloud-服務間兩種restful呼叫方式
阿新 • • 發佈:2018-12-09
假設有一個訂單服務和一個商品服務,訂單服務需要呼叫商品服務的某個介面。
商品服務介面如下
@RestController
public class ProductController {
@GetMapping("/msg")
public String msg(){
return "這裡是商品資訊";
}
}
接下來是訂單服務如何呼叫商品服務的方法
一、RestTemplate
1. 直接使用RestTemplate
@RestController @RequestMapping("/order") public class OrderController { @GetMapping("/getProductMsg") public Object getProductMsg() { RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject("http://localhost:8082/msg",String.class); return response; } }
2. 利用LoadBalancerClient通過應用名稱獲取URL,然後再使用RestTemplate,如果有多個商品應用,會採取負載均衡策略來選擇不同主機
@RestController @RequestMapping("/order") public class OrderController { @Autowired private LoadBalancerClient loadBalancerClient; @GetMapping("/getProductMsg") public Object getProductMsg() { // 利用LoadBalancerClient通過應用名稱獲取URL,然後再使用RestTemplate,如果有多個應用,會採取負載均衡策略來選擇不同的應用 ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT"); // 這裡的PRODUCT是指商品服務的例項名稱 String url = String.format("http://%s:%s",serviceInstance.getHost(), serviceInstance.getPort()) + "/msg"; System.out.println("請求地址:" + url); RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject(url,String.class); return response; } }
3. 利用@LoadBalanced,可直接在RestTemplate使用應用名字來訪問,如果有多個商品應用,會採取負載均衡策略來選擇不同的主機。
新建一個RestTemplateConfig.java
@Component
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
服務呼叫
@RestController public class OrderController { // 方法3 @Autowired private RestTemplate restTemplate; @GetMapping("/getProductMsg") public Object getProductMsg() { // (利用@LoadBalanced,可直接在RestTemplate使用應用名字來訪問),如果有多個應用,會採取負載均衡策略來選擇不同的應用 String response = restTemplate.getForObject("http://PRODUCT/msg", String.class); return response; } }
二、Feign
在訂單服務的pom.xml新增相關依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在啟動類新增@EnableFeignClients註解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
建立ProductClient介面,用於呼叫商品服務的介面
@FeignClient(name = "product") // name代表商品服務的例項名稱
public interface ProductClient {
@GetMapping("/msg") // 這個路由一定要跟商品服務的路由保持一致,方法名可以任意填寫
public String msg();
}
在Controller呼叫介面
@RestController
public class OrderController {
@Autowired
private ProductClient productClient;
@GetMapping("/getProductMsg")
public Object getProductMsg() {
String response = productClient.msg();
return response;
}
}
可以看出,我們當然是用feign更加方便啦。