1. 程式人生 > >SpringCloud-服務間兩種restful呼叫方式

SpringCloud-服務間兩種restful呼叫方式

假設有一個訂單服務和一個商品服務,訂單服務需要呼叫商品服務的某個介面。

商品服務介面如下

@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更加方便啦。