微服务的学习--OpenFeign

5 篇文章 0 订阅
4 篇文章 0 订阅

认识学习

OpenFeign是一个基于Spring Cloud的声明式服务调用框架,它简化了微服务架构中的服务间通信。它提供了一组注解和默认集成的功能,使得服务调用变得更加简单和便捷。

为什么要使用OpenFeign呢???

OpenFeign的主要特点和功能包括:

  • 声明式API定义:通过使用@FeignClient注解,可以轻松定义和标记一个RESTful服务的接口,并指定要调用的服务名称。这样,就可以像调用本地方法一样调用远程服务,无需手动编写服务间的HTTP请求代码。

  • 与Spring Cloud集成:OpenFeign与Spring Cloud的其他组件紧密集成,特别是服务注册与发现组件(如Eureka、Nacos),可以自动利用服务名进行负载均衡。

  • 内置支持负载均衡:OpenFeign默认集成了Ribbon负载均衡器,可以根据负载均衡策略自动选择可用的服务实例进行调用。

  • 熔断器支持:OpenFeign内置集成了Hystrix熔断器,可以通过简单的配置实现服务调用的容错和熔断处理,提高系统的可靠性和稳定性。

  • 日志记录:OpenFeign提供了日志记录的功能,可以方便地查看请求和响应的详细信息,帮助排查问题。

使用OpenFeign可以避免手动编写大量的服务调用代码,简化了服务间通信的开发工作。它在提高开发效率、减少重复代码、支持负载均衡和熔断等方面都具有很大的优势,是构建微服务架构中不可或缺的一部分。

使用

  1. 引入依赖
<!--feign客户端-->
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 在服务启动类上添加@EnableFeignClients注解开启OpenFeign的功能
  2. 编写FeignClient接口
@FeignClient("userservice")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}
  1. 使用FeignClient代替我们的RestTemplate
@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;
	// 注入依赖Feign接口依赖
    @Autowired
    private UserClient userClient;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2. 用feign远程调用
        User user = userClient.findById(order.getUserId());
        // 3. 封装到order
        order.setUser(user);
        // 4.返回
        return order;
    }
}

这样便完成了OpenClient的使用

日志配置

默认日志级别为NONE
实现方式有两种:

  1. 通过配置文件进行配置(application.yml)
feign:
  client:
    config:
      # default为全局配置,服务名称为局部配置
      default:
        loggerLevel: FULL
  1. 通过java代码实现
  • 创建配置类
public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level logLevel() {
        return Logger.Level.BASIC;
    }
}
  • 选择配置全局还是特定服务
// 全局是在服务启动类上
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
// 特定服务是在feign客户端类上
@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)

Feign优化

  1. 日志级别降低尽量为BASIC
  2. 使用HttpClient或OKHttp代替URLConnection

①引入依赖

<!-- httpclient-->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

②配置文件中开启功能

feign:
  httpclient:
    enabled: true
    max-connections: 200
    max-connections-per-route: 50

最佳实践

  1. 让我们的服务提供者的controller和服务消费者的feignClient实现同一接口
  2. 将client、POJO、Feign的默认配置定义到一个项目中供所有消费者使用。 推荐

新建module将client、pojo、feign的相关配置和类放入该模块,之后在原模块中添加依赖

<!-- 引入feign的统一api-->
<dependency>
    <groupId>cn.itcast.demo</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

因为服务启动类的扫描包是当前启动类所在包及其子包,无法实现client的注入
解决方式

// 1. 指定FeignClient所在包(批量获取所有)
@EnableFeignClients(basePackages="feign模块的client所在包")
// 2. 指定FeignClient字节码
@EnableFeignClients(clients = UserClient.class)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值