SpringCloud微服务之服务调用-OpenFeign的使用

  • 前言
  • 一、Feign和OpenFeign的区别
  • 二、服务调用实现负载均衡
  • 三、openFeign使用步骤
  • 1.引入库
  • 2.启动类添加@EnableFeignClients
  • 3.新建service接口
  • 4.controller
  • 5.超时控制
  • 6.日志增强
  • 总结



前言

springcloud技术栈:

openfeign 和dubbo区别_服务发现


一、Feign和OpenFeign的区别

Feign是Netflix开源的一个HTTP客户端工具,用于简化HTTP请求,并提供了一个基于接口的编程模型。OpenFeign是在Feign基础上开发的一个库,为了更好地集成Spring Cloud和Spring Boot而开发,可以通过注解来实现调用远程服务的功能。

主要区别如下:

  1. 依赖不同:Feign和OpenFeign的Maven依赖不同,OpenFeign需要添加spring-cloud-starter-openfeign和spring-cloud-starter-netflix-eureka-client两个依赖。
  2. 注解不同:Feign使用@FeignClient注解来指定调用的服务,而OpenFeign使用@FeignClient和@RibbonClient注解来实现负载均衡和服务调用。
  3. 默认配置不同:Feign默认不支持Hystrix熔断机制,而OpenFeign默认支持。
  4. 功能不同: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

openfeign 和dubbo区别_spring cloud_02


总结

若是有疑问,可以参考上下篇文章。