Consumer和Provider以及服务注册之间的关系如图:
Consumer通过RestTemplete
和@FeignClient
方式来调用Peovider中的模块。实际上,调用的是Provider中模块中的Controller中的各种接口!!
利用RestTemplete来调用服务(Consumer模块操作)
- 在80模块中创建配置类(ApplicationContextConfig)
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplete(){
return new RestTemplate();
}
}
说明:由于RestTemplete
是一个组件,需要用@Bean
将该组件放到容器中。必须添加@LoadBalanced
注解
- 在80模块中调用Provider中的微服务
@RestController
public class OrderController {
public static final String PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";
@Autowired
public RestTemplate restTemplate;
@RequestMapping(value = "consumer/addPayment",method = RequestMethod.POST)
public Body addPayment(@RequestBody Payment payment){
return restTemplate.postForObject(PAYMENT_URL+"/addPayment", payment,Body.class);
}
@RequestMapping(value = "consumer/queryPayment",method = RequestMethod.GET)
public Body getPayment(@RequestParam("id") Long id){
return restTemplate.getForObject(PAYMENT_URL+"/queryPayment?id="+id, Body.class);
}
}
说明:RestTemlete
方法相当于利用Provider中接口的url地址来调用接口。restTemplete发送的请求类型与被调用接口的请求类型一样。三个参数分别为:Provider被调用接口的url地址;传入的参数;被调用接口返回的类型。
特别注意:由于Provider是以整体暴露在外的,因此上述代码中定义的url变量一定是Provider的名字CLOUD-PAYMENT-SERVICE
。
利用@FeignClient
注解调用微服务(Consumer模块)
- 导包(pom.xml)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 写配置(application.yml)
无 - 主程序类(OrderFeignMain80)
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain80.class, args);
}
}
说明:一定要添加@EnableFeignClients
注解。
- 业务配置——创建Service文件夹新建PaymentFeignService接口
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
@RequestMapping(value = "queryPayment",method = RequestMethod.GET)
public Body<Payment> queryPayment(@RequestParam("id") long id);
}
说明:
1.一定要添加@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
注解,value值表明调用的是名为CLOUD-PAYMENT-SERVICE
的provider中的模块中的接口。且该注解只能标注在接口上。
2.在接口中添加Procider中模块的接口(粘贴过来即可)。
- 业务配置——Contrller层中调用Service方法即可。
@RestController
@Slf4j
public class OrderFeignController {
@Autowired
private PaymentFeignService paymentFeignService;
@RequestMapping(value = "consumer/payment/get/{id}",method = RequestMethod.GET)
public Body<Payment> getPaymentById(@PathVariable("id") Long id){
Body paymentBody = paymentFeignService.queryPayment(id);
return paymentBody;
}
}
总结:
1.ReatTemplete
方法来调用Provider模块微服务,由于RestTemplete是组件类,不需要导包,配置,主程序类,只需要在业务层创建配置文件将该组件导入容器中,在利用Provider模块中接口的url直接调用即可。
2.@FeignClient
方法需要导包,配置主程序类(添加@@EnableFeignClients
)。业务类中需要创建Service文件,并在里面创建接口,因为@FeignClient
注解只能标注在接口上,接口里的方法直接将被调用接口去掉方法体,粘贴过来即可。在Controller层中调用Service层即可。这种方法,更符合业务层调用习惯,Controller层调用Service层,Service层调用Provider中模块的接口即可。
3.这两个方法均在Consumer模块中进行配置。