03、SpringCloud 系列:OpenFeign - 远程调用

SpringCloud 系列列表:

文章名文章地址
01、Eureka - 集群、服务发现https://blog.csdn.net/qq_46023503/article/details/128319023
02、Ribbon - 负载均衡https://blog.csdn.net/qq_46023503/article/details/128332288
03、OpenFeign - 远程调用https://blog.csdn.net/qq_46023503/article/details/128387961
04、Hystrix - 断路器https://blog.csdn.net/qq_46023503/article/details/128408601
05、Sleuth - 链路追踪https://blog.csdn.net/qq_46023503/article/details/128409339
06、Gateway - 网关https://blog.csdn.net/qq_46023503/article/details/128430842
07、Alibaba - 介绍https://blog.csdn.net/qq_46023503/article/details/128434080
08、Nacos - 安装、启动https://blog.csdn.net/qq_46023503/article/details/128460411
09、Nacos - 配置文件中心https://blog.csdn.net/qq_46023503/article/details/128460649
10、Nacos - 注册中心https://blog.csdn.net/qq_46023503/article/details/128460494

1 概述

  • Feign 是声明性(注解)Web 服务客户端。它使编写 Web 服务客户端更加容易。要使用 Feign, 请创建一个接口并对其进行注解。它具有可插入注解支持,包括 Feign 注解和 JAX-RS 注解。 Feign 还支持可插拔编码器和解码器。Spring Cloud 添加了对 Spring MVC 注解的支持,并 支持使用 HttpMessageConverters,Spring Web 中默认使用的注解。Spring Cloud 集成 了 Ribbon 和 Eureka 以及 Spring Cloud LoadBalancer,以在使用 Feign 时提供负载平衡 的 http 客户端
  • Feign 是一个远程调用的组件 (接口,注解) http 调用的
  • Feign 集成了 ribbon,ribbon 里面集成了 eureka

2 OpenFeign 快速入门

2.1 调用的设计图

在这里插入图片描述

2.2 项目搭建

注意:SpringBoot 版本为 2.3.12.RELEASE,SpringCloud 版本为 Hoxton.SR12

1、搭建一个 eureka service 服务
不会,参看 eureka 篇,eureka篇链接

**2、创建 provider-order-service **
Spring Boot 依赖为 Spring Web 和 Eureka Discover Client
启动类上添加 @EnableEurekaClient 注解

#yml文件
server:
  port: 8031
spring:
  application:
    name: orderservice
eureka:
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka #eureka service 的质地址,peer1也为localhost
  instance: #显示格式和显示 ip
    instance-id: ${spring.application.name}:${server.port}
    prefer-ip-address: true
//控制层代码
@RestController
public class OrderController {
    @GetMapping("doOrder")
    public String doOrder(){
        System.out.println("下单成功");
        return "下单成功";
    }
}

3、创建 consumer-user-service
Spring Boot 依赖为 Spring Web、Eureka Discover Client 和 OpenFeign
启动器上添加 @EnableEurekaClient、@EnableFeignClients 注解

#yml 文件
server:
  port: 8032 
spring:
  application:
    name: consumeruserservice
eureka:
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka/
  instance:
    instance-id: ${spring.application.name}:${server.port}
    prefer-ip-address: true
//OpenFeign 的核心,接口文件
//@FeignClient 声明是 feign 的调用,value = "orderservice",value 后面的值必须和提供者的服务名一致
@FeignClient(value = "orderservice")
public interface Openfeign {
    //下单的方法,这里的路径,名字,返回值等信息必须和提供者的一致   
    @GetMapping("doOrder")
    public String doOrder();
}
//控制层方法
@RestController
public class UserController {
    
    //注入上面的接口,可以调用到另一个服务的方法实现
    @Autowired
    private Openfeign openfeign;
    
    @GetMapping("/userDoOrder")
    public String userDoOrder(){
        System.out.println("用户调用了订单方法");
        return openfeign.doOrder();//调用的是注解value指定服务的相匹配的方法
    }
}

4、访问测试
访问 http://localhost:8032/userDoOrder,输出 下单成功

5、调用总结
consumer-user-service —> /userDoOrder —> 通过 feign 调用 /doOrder —> provider-order-service 下单成功

3 Feign 调用的负载均衡

3.1 启动多台 provider-order-service

3.2 测试访问,轮询出现结果

4 调用超时设置

因为 ribbon 默认调用超时时长为 1s , 可以修改 ,超时调整可以查看 DefaultClientConfigImpl

ribbon: #feign 默认调用 1s 超时
 ReadTimeout: 5000 #修改调用时长为 5s
 ConnectTimeout: 5000 #修改连接时长为 5s

5 调用参数处理

5.1 要求

  • 通过 URL 传参数,GET 请求,参数列表使用@PathVariable
  • 如果是 GET 请求,每个基本参数必须加@RequestParam
  • 如果是 POST 请求,而且是对象集合等参数,必须加@Requestbody 或者 @RequestParam

5.2 时间日期参数问题

使用 feign 远程调用时,传递 Date 类型,接收方的时间会相差 14 个小时,是因为时区造成 的 处理方案: 1. 使用字符串传递参数,接收方转换成时间类型(推荐使用)不要单独传递时间 2. 使用 JDK8 的 LocalDate(日期) 或 LocalDateTime(日期和时间,接收方只有秒,没有毫秒)

5.3 例子

Feign 接口和 其实现方法的方法签名一致

//单个参数
@GetMapping("testOneParam")
public BaseResult oneParam(@RequestParam("name") String name)……

//两个参数
@PostMapping("testTwoParam")
public BaseResult twoParam(@RequestParam("name") String name,@RequestParam("age") Integer age)……

//对象传参
@PostMapping("testObjectParam")
public BaseResult objectParam(@RequestBody Order order)……

//一个对象,一个参数
@PostMapping("testOneObjectOneParam")
public BaseResult oneObjectOneParam(@RequestBody Order order, @RequestParam String name)……

//url传参
@GetMapping("testUrlParam/{id}")
public BaseResult testUrlParam(@PathVariable("id") Integer id)……
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄天灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值