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

简介: 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

相关文章
|
9月前
|
消息中间件 数据库
RabbitMQ消息的重复消费问题如何解决的
RabbitMQ消息的重复消费问题如何解决的
1162 0
|
12天前
|
消息中间件 负载均衡 监控
Kafka消费者:监听模式VS主动拉取,哪种更适合你?
Kafka消费者:监听模式VS主动拉取,哪种更适合你?
45 0
|
3月前
|
Java
用java实现生产者和消费者模式
用java实现生产者和消费者模式
29 1
|
6月前
|
消息中间件 存储 缓存
远程调用RPC和消息MQ区别
远程调用RPC和消息MQ区别
48 0
|
9月前
|
消息中间件
RabbitMQ消息的重复消费问题如何解决的?
RabbitMQ消息的重复消费问题是在分布式系统中常见的一个挑战,解决该问题可以采取以下几种策略:
496 0
|
9月前
|
消息中间件 缓存 数据库
RabbitMQ消息的重复消费问题如何解决的 ?
在RabbitMQ中,重复消费是一个常见的问题,但可以通过以下几种方式来解决
1180 0
|
9月前
|
Dubbo Java 应用服务中间件
<2>Dubbo中使用服务消费者调用生产者
接上一篇博客Dubbo快速入门 发布服务、启动服务
|
9月前
|
消息中间件
ActiveMQ消费者消费消息(点对点模式)
上篇博客写了生产者生产消息:ActiveMQ向消息队列存入消息
|
消息中间件
rabbitMq 直连模式实现多消费者轮询消费(一对多)
今天通过rabbitMq的直连模式(direct)来实现多个消费者对消息的轮询读取 前提是已经安装了rabbitMq! 话不多说,步入正题: 首先创建一个连接mq的服务器:
333 0
rabbitMq 直连模式实现多消费者轮询消费(一对多)
|
消息中间件 存储 前端开发
同步异步调用,并谈谈消息队列mq;RocketMQ发送消息和消费消息测试类
同步调用优点: 时效性强,打电话、直播,很快可以得到结果 同步调用的问题:
483 1