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 |
OpenFeign - 远程调用
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)……