SpringCloud微服务之服务调用-OpenFeign的使用
- 前言
- 一、Feign和OpenFeign的区别
- 二、服务调用实现负载均衡
- 三、openFeign使用步骤
- 1.引入库
- 2.启动类添加@EnableFeignClients
- 3.新建service接口
- 4.controller
- 5.超时控制
- 6.日志增强
- 总结
前言
springcloud技术栈:
一、Feign和OpenFeign的区别
Feign是Netflix开源的一个HTTP客户端工具,用于简化HTTP请求,并提供了一个基于接口的编程模型。OpenFeign是在Feign基础上开发的一个库,为了更好地集成Spring Cloud和Spring Boot而开发,可以通过注解来实现调用远程服务的功能。
主要区别如下:
- 依赖不同:Feign和OpenFeign的Maven依赖不同,OpenFeign需要添加spring-cloud-starter-openfeign和spring-cloud-starter-netflix-eureka-client两个依赖。
- 注解不同:Feign使用@FeignClient注解来指定调用的服务,而OpenFeign使用@FeignClient和@RibbonClient注解来实现负载均衡和服务调用。
- 默认配置不同:Feign默认不支持Hystrix熔断机制,而OpenFeign默认支持。
- 功能不同:OpenFeign增强了Feign的功能,例如支持Spring MVC注解、支持多参数、支持文件上传等。
总的来说,Feign和OpenFeign都是用于简化HTTP请求的工具,OpenFeign在Feign的基础上增强了功能并更好地集成了Spring Cloud和Spring Boot,可以根据具体需求选择使用。
二、服务调用实现负载均衡
Spring Cloud中的负载均衡常用的有两种方式:Ribbon和Nacos(后续也会更新)。
Ribbon是Netflix开源的负载均衡解决方案,Spring Cloud中默认集成了Ribbon。可以通过在RestTemplate上添加@LoadBalanced注解来实现负载均衡。同时,可以通过自定义IRule接口实现自定义的负载均衡策略,这种实现方式可以看上一篇文章,。
Nacos则是阿里开源的服务发现和配置管理平台,也提供了负载均衡的功能。Nacos中的负载均衡支持四种算法:随机、轮询、最不经常使用(Least Active)和一致性哈希(Consistent Hash)。使用Nacos作为注册中心,可以通过在Feign客户端上添加@FeignClient注解来实现负载均衡。
总的来说,两种方式在使用上都比较简单,可以根据具体需求选择使用。
三、openFeign使用步骤
1.引入库
代码如下(示例):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.启动类添加@EnableFeignClients
代码如下(示例):
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain.class, args);
}
}
3.新建service接口
GetMapping地址是服务者模块的controller路径。
增加@FeignClient注解,feign会根据value值获取对应的服务。
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
@GetMapping(value = "/payment/get/{id}")
CommonResult<Payment> getById(@PathVariable("id") Long id);
}
4.controller
注入新建接口PaymentFeignService ,接口访问即可。
@RestController
@Slf4j
public class OrderController {
@Resource
private PaymentFeignService feignService;
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
CommonResult<Payment> byId = feignService.getById(id);
return byId;
}
}
5.超时控制
比如服务方有延时的业务逻辑,这时客户端就会报读取超时的错误,所以需要在yml文件设置客户端的超时时间。
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
或者(feign里默认支持ribbon)
ribbon:
ReadTimeout: 5000
ConnectTimeout: 5000
6.日志增强
yml增加配置,增强的是上述新建的service的路径,下图是调用时打印的详细日志。
logging:
level:
com.zy.cloud.service.PaymentFeignService: debug
总结
若是有疑问,可以参考上下篇文章。