消费者访问生产者的三种远程调用方式

简介: 1.FeignClient接口,不能使用@GettingMapping之类的组合注解 2.FeignClient接口中,如果使用到@PathVariable必须指定其value 3.只要参数是复杂对象,即使指定了是GET方法,feign依然会以POST方法进行发送请求,同时生产者必须支持POST请求并给参数添加@RequestBody注解 建议使用公共vo+@RequestBody方式 4.springcloud中feign访问其他服务并传参数出现错误的问题:status 405 reading LogisticsOrderService#get
  1. 消费者访问生产者的三种远程调用方式
    RestTemplate/WebClient/Feign(默认开启负载均衡)
  2. 使用RestTemplate
    ·1.创建 RestTemplateConfig

    @Configuration
    public class RestTemplateConfig {
        @Bean
        @LoadBalanced  //开启负载均衡,轮询方式
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    } 
    

    2.在Controller看使用RestTemplateConfig访问生产者

    String result = restTemplate.getForObject("http://user-service/sys/user/load?username=xmm", String.class);
    
  3. 使用WebClient(略)

    HttpClient/HttpsClient

  4. 使用Feign(建议)
    1.导入依赖

    <!--feign远程调用-->
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-openfeign</artifactId>
     </dependency>
    

    2.编写Feign接口

@Service
@FeignClient("user-service")
public interface UserFeign {

@RequestMapping(value = "/sys/user/load2", method = RequestMethod.POST)
String load2(UserVo userVo);

}

3.启动类添加@EnableFeignClients注解
4.调用Feign接口进行远程访问(消费者-->生产者)

5.几个注意事项

 1.FeignClient接口,不能使用@GettingMapping之类的组合注解
 2.FeignClient接口中,如果使用到@PathVariable必须指定其value
 3.只要参数是复杂对象,即使指定了是GET方法,feign依然会以POST方法进行发送请求,同时生产者必须支持POST请求并给参数添加@RequestBody注解
    建议使用公共vo+@RequestBody方式
 4.springcloud中feign访问其他服务并传参数出现错误的问题:status 405 reading LogisticsOrderService#getLogistics(Integer,String,Integer,Integer)
    当使用feign传参数的时候,需要加上@RequestParam注解,否则对方服务无法识别参数;    
    @GetMapping("/order/getLogistics")
    public ResponseObj getLogistics(
       @RequestParam(value = "logisticsType") Integer logisticsType,
       @RequestParam(value="token") String token,
       @RequestParam(value = "currentPage", defaultValue = "1") Integer currentPage,
       @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize);

   
  1. Feign综合示例
    1~N个参数
    @RequestParam Long bookId
    1个复杂对象DTO
    生产者接受参数时要添加@RequestBody
    将DTO对象定义到公共模块

附录一:远程调用的相关注解
@PathVariable
@RequestParam
@RequestBody

@RequestMapping
注解RequestMapping中produces属性可以设置返回数据的类型以及编码,可以是json或者xml:
@RequestMapping(value="/xxx",produces = {"application/json;charset=UTF-8"})
@RequestMapping(value="/xxx",produces = {"application/xml;charset=UTF-8"})

附录二:深入理解DTO、PO的概念、区别和用处
DTO(Data Transfer Object):数据传输对象,可以多个
将UI数据-->后台
将后台数据-->前端

PO(Persistent Object):持久化对象

附录三:对象映射框架orika

相关文章
|
5月前
|
消息中间件 存储 安全
【消息队列开发】 实现ConsumerManager类——消费消息的核心逻辑
【消息队列开发】 实现ConsumerManager类——消费消息的核心逻辑
|
3月前
|
消息中间件 存储 负载均衡
RocketMQ消费者消费消息核心原理(含长轮询机制)
这篇文章深入探讨了Apache RocketMQ消息队列中消费者消费消息的核心原理,特别是长轮询机制。文章从消费者和Broker的交互流程出发,详细分析了Push和Pull两种消费模式的内部实现,以及它们是如何通过长轮询机制来优化消息消费的效率。文章还对RocketMQ的消费者启动流程、消息拉取请求的发起、Broker端处理消息拉取请求的流程进行了深入的源码分析,并总结了RocketMQ在设计上的优点,如单一职责化和线程池的使用等。
RocketMQ消费者消费消息核心原理(含长轮询机制)
|
3月前
|
缓存 Dubbo Java
Dubbo服务消费者启动与订阅原理
该文章主要介绍了Dubbo服务消费者启动与订阅的原理,包括服务消费者的启动时机、启动过程以及订阅和感知最新提供者信息的方式。
Dubbo服务消费者启动与订阅原理
|
3月前
|
设计模式 安全 Python
生产者与消费者模式
生产者与消费者模式
|
4月前
|
消息中间件 负载均衡 Apache
【RocketMQ系列七】消费者和生产者的实现细节
【RocketMQ系列七】消费者和生产者的实现细节
94 1
|
5月前
|
消息中间件 监控 中间件
中间件消费者处理消息
【6月更文挑战第6天】
34 3
|
5月前
|
消息中间件 中间件 Java
中间件生产者发送消息
【6月更文挑战第6天】
46 3
|
4月前
|
微服务
微服务05----提供者与消费者,被其他微服务调用的服务,是提供者,调用其他服务的人是消费者,如果服务A调用服务B,服务B调用了服务C,那么服务B是什么角色,相对,坐地日行八万里,即可是消费者,提供者
微服务05----提供者与消费者,被其他微服务调用的服务,是提供者,调用其他服务的人是消费者,如果服务A调用服务B,服务B调用了服务C,那么服务B是什么角色,相对,坐地日行八万里,即可是消费者,提供者
|
6月前
|
Java
用java实现生产者和消费者模式
用java实现生产者和消费者模式
53 1
|
消息中间件 存储 缓存
远程调用RPC和消息MQ区别
远程调用RPC和消息MQ区别
111 0