【SpringCloud】Consumer中的模块调用Provider中的模块

Consumer和Provider以及服务注册之间的关系如图:
在这里插入图片描述
Consumer通过RestTemplete@FeignClient方式来调用Peovider中的模块。实际上,调用的是Provider中模块中的Controller中的各种接口!!

利用RestTemplete来调用服务(Consumer模块操作)

  1. 在80模块中创建配置类(ApplicationContextConfig)

在这里插入图片描述

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplete(){
        return new RestTemplate();
    }
}

说明:由于RestTemplete是一个组件,需要用@Bean将该组件放到容器中。必须添加@LoadBalanced注解

  1. 在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模块)

  1. 导包(pom.xml)
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 写配置(application.yml)
  2. 主程序类(OrderFeignMain80)
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderFeignMain80.class, args);
    }
}

说明:一定要添加@EnableFeignClients注解。

  1. 业务配置——创建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中模块的接口(粘贴过来即可)。

  1. 业务配置——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模块中进行配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值