主要有两种方式一种 Feign,一种 RestTemplate。
Feign
1. 新增依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
2. 在启动类上新增注解
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients
@SpringCloudApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
3. 准备好需要调用那个服务的那些接口
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
// name 是需要调用的服务名
@FeignClient(name = "product")
public interface ProductClient {
// 需要调用的地址
@GetMapping("/msg")
String productMsg();
}
4. 通过 Autowired 的方式调用
import com.imooc.order.config.ProductClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ClientController {
@Autowired
private ProductClient productClient;
@GetMapping("/testProductMsg")
public String getProductMsg() {
String response = productClient.productMsg();
return response;
}
}
RestTemplate
方式一:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ClientController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/testProductMsg")
public String getProductMsg() {
RestTemplate restTemplate = new RestTemplate();
ServiceInstance serviceInstance = loadBalancerClient.choose("server_name");
// 使用 loadBalancerClient 通过应用名获取 url,再用 restTemplate 调用
String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort());
// getForObject 第二个参数是返回类型
String response = restTemplate.getForObject(url, String.class);
return response;
}
}
方式二:
先使用注解的方式定义 RestTemplateConfig
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Component
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
再使用 Autowired 的方式使用。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ClientController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/testProductMsg")
public String getProductMsg() {
// url 为服务名+地址
String response = restTemplate.getForObject("http://server_name/xxx/xx",String.class);
return response;
}
}
网友评论