Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用

Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用

Spring Cloud OpenFeign是一个声明式的服务调用框架,基于Feign并整合了Ribbon和Hystrix;目标是简化分布式系统中编写服务间调用的代码,并提供一种更加优雅和便捷的方式来进行服务之间的通信

创建feign-service模块

  • 依赖导入
java 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix -eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • application.yml配置
yml 复制代码
server:
  port: 8701
spring:
  application:
    name: feign-service
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8001/eureka/
  • 启动类上添加@EnableFeignClients注解来启用Feign的客户端功能
java 复制代码
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class FeignServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignServiceApplication.class, args);
    }
}
  • 添加UserService接口完成对user-service服务的接口绑定
java 复制代码
@FeignClient(value = "user-service")
public interface UserService {
    @PostMapping("/user/create")
    CommonResult create(@RequestBody User user);

    @GetMapping("/user/{id}")
    CommonResult<User> getUser(@PathVariable Long id);
}
  • 添加UserFeignController调用UserService实现服务调用
java 复制代码
@RestController
@RequestMapping("/user")
public class UserFeignController {
    @Autowired
    private UserService userService;
    
    @PostMapping("/create")
    public CommonResult create(@RequestBody User user) {
        return userService.create(user);
    }
    
    @GetMapping("/{id}")
    public CommonResult getUser(@PathVariable Long id) {
        return userService.getUser(id);
    }
}

Feign中的服务降级

微服务架构中,服务降级是一种应对高并发或系统故障的策略,用于保证系统的可用性和稳定性;Feign是一个声明式的Web服务客户端,可以与Spring Cloud等微服务框架集成,简化服务之间的调用

  • 添加服务降级实现类UserFallbackService
java 复制代码
@Component
public class UserFallbackService implements UserService {
    @Override
    public CommonResult create(User user) {
        User defaultUser = new User(-1L, "defaultUser", "123456");
        return new CommonResult<>(defaultUser);
    }

    @Override
    public CommonResult<User> getUser(Long id) {
        User defaultUser = new User(-1L, "defaultUser", "123456");
        return new CommonResult<>(defaultUser);
    }

    @Override
    public CommonResult<User> getByUsername(String username) {
        User defaultUser = new User(-1L, "defaultUser", "123456");
        return new CommonResult<>(defaultUser);
    }

    @Override
    public CommonResult update(User user) {
        return new CommonResult("调用失败,服务被降级",500);
    }

    @Override
    public CommonResult delete(Long id) {
        return new CommonResult("调用失败,服务被降级",500);
    }
}
  • 修改UserService接口,设置服务降级处理类为UserFallbackService
java 复制代码
@FeignClient(value = "user-service",fallback = UserFallbackService.class)
public interface UserService {
}
  • 修改application.yml,开启Hystrix功能
yml 复制代码
feign:
  hystrix:
    enabled: true #在Feign中开启Hystrix

日志打印功能

Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http请求的细节

日志级别

  • NONE:默认的,不显示任何日志
  • BASIC:仅记录请求方法、URL、响应状态码及执行时间
  • HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
  • FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据

通过配置开启更为详细的日志

  • 通过java配置来使Feign打印最详细的Http请求日志信息
java 复制代码
@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}
  • application.yml中配置需要开启日志的Feign客户端;配置UserService的日志级别为debug
java 复制代码
logging:
  level:
    com.macro.cloud.service.UserService: debug

Feign的常用配置

java 复制代码
feign:
  hystrix:
    enabled: true #在Feign中开启Hystrix
  compression:
    request:
      enabled: false #是否对请求进行GZIP压缩
      mime-types: text/xml,application/xml,application/json #指定压缩的请求数据类型
      min-request-size: 2048 #超过该大小的请求会被压缩
    response:
      enabled: false #是否对响应进行GZIP压缩
logging:
  level: #修改日志级别
    com.macro.cloud.service.UserService: debug
相关推荐
Rain的Java大神之路4 天前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
需要8264 天前
MySQL 索引 B+ 树与“查询为什么变慢了
java·spring boot·spring·spring cloud·tomcat
需要8264 天前
Arthas 一个命令排查线上问题
java·jvm·spring·spring cloud
苏渡苇5 天前
Spring Insight 里如何把 Span 画成瀑布时间线
后端·spring·spring cloud·springboot·监控·apm
叶总没有会5 天前
Nacos—注册中心
spring cloud·微服务
苏渡苇6 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring·spring cloud·系统监控·apm
叶总没有会6 天前
微服务--分布式基础
java·spring·spring cloud·微服务
孙启超7 天前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
行百里er8 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring cloud·监控
砍材农夫8 天前
spring|spring web|拦截器、过滤器、aop
java·spring boot·spring·spring cloud