Feign/RestTemplate
- 增加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 在启动主类增加注解
@EnableFeignClients
- 定义feign调用商品微服务的接口
访问PRODUCT服务下的接口
@FeignClient(name = "PRODUCT")
public interface ProductClient {
/**
* 从商品微服务中获取一个测试信息
* @return
*/
@GetMapping("/msg")
String productMsg();
/**
* 根据一组商品ID获取商品列表
* @param productIdList
* @return
*/
@PostMapping("/listForOrder")
List<ProductInfoOutput> listForOrder(@RequestBody List<String> productIdList);
/**
* 扣库存
* @param decreaseStockInputList
*/
@PostMapping("/decreaseStock")
void decreaseStock(@RequestBody List<DecreaseStockInput> decreaseStockInputList);
}
- 调用feign接口
@Api(tags="RestTemplate/feign调用微服务API")
@RestController
@Slf4j
public class ClientController {
/*第二种方式*/
/* @Autowired
private LoadBalancerClient loadBalancerClient;*/
/* 第三种方式
@Autowired
private RestTemplate restTemplate;*/
/*第四种方式feign*/
@Autowired
private ProductClient productClient;
@ApiOperation("获取一个测试信息")
@GetMapping("/msg")
public String getProductMsg(){
//第一种方式 直接使用RestTemplate,URL固定
//RestTemplate restTemplate = new RestTemplate();
//String response = restTemplate.getForObject("http://localhost:8080/productserver/msg",String.class);
//第二种方式 直接使用RestTemplate,URL利用LoadBalancerClient获取
/*RestTemplate restTemplate = new RestTemplate();
ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");
String url = String.format("http://%s:%s/msg",serviceInstance.getHost(),serviceInstance.getPort());
String response = restTemplate.getForObject(url,String.class);*/
//第三种,将 RestTemplate 作为一个Bean 配制到项目,使用注解@LoadBalanced,在restTemplate直接使用应用名字
//String response = restTemplate.getForObject("http://PRODUCT/msg",String.class);
//4.feign
String response = productClient.productMsg();
log.info("response={}",response);
return response;
}
}
第三种方式使用注解@LoadBalanced的配制文件
@Component
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
or
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
//return new RestTemplate();
return new RestTemplateBuilder().basicAuthentication("oauth", "123").build();
}
}
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
map.add(“grant_type”, “password”);
map.add(“client_id”, “oauth”);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, header);
MyToken myToken = restTemplate.postForObject(“http://192.168.88.108:30002/oauth/token”,request,MyToken.class);
// build http headers
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization","bearer "+myToken.getAccess_token());
ResponseEntity<ClientUser[]> responseEntity = restTemplate.exchange(RBAC_SERVER+POST_ALL_USER, HttpMethod.GET,new HttpEntity<String>(headers),ClientUser[].class);