使用SpringCloud实现Java分布式开发【part-4】:Feign服务调用的介绍及使用、Feign的负载均衡和熔断器、请求压缩和日期级别的配置

   日期:2020-09-24     浏览:165    评论:0    
核心提示:SpringCloud简介Spring Cloud是Spring旗下的项目之一Spring Cloud并不是一个组件 而是许多组件的集合其将当下非常流行的一些技术整合到了一起 实现了多个分布式开发中的重要功能协调了分布式环境中各个系统 并且为各类服务提供模板性的配置其主要涉及的组件包括:Eureka:注册中心Zuul或Gateway:服务网关Ribbon:负载均衡Feign:服务调用Hystrix或Resilience4j:熔断器【在本篇中 将介绍Feign服务调用】Feign服

SpringCloud简介

Spring Cloud是Spring旗下的项目之一
Spring Cloud并不是一个组件 而是许多组件的集合
其将当下非常流行的一些技术整合到了一起 实现了多个分布式开发中的重要功能
协调了分布式环境中各个系统 并且为各类服务提供模板性的配置

其主要涉及的组件包括:

  • Eureka:注册中心
  • Zuul或Spring Cloud Gateway:服务网关
  • Ribbon:负载均衡
  • Feign:服务调用
  • Hystrix或Resilience4j:熔断器

【在本篇中 将介绍Feign服务调用】

Feign服务调用

Feign意即伪装

Feign可以将Rest的请求进行隐藏 然后伪装成类似于SpringMVC的Controller一样的形式
无需自己进行指定服务名称 拼接url 拼接参数等繁琐操作 一切都可以交给Feign去做

一、使用步骤

注:在服务消费端进行操作 因为是服务消费端需要使用Feign进行便捷的服务调用

1、添加Feign的Maven依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、在启动类上添加/@EnableFeignClients注解以开启Feign服务调用功能

@SpringCloudApplication
// 开启Feign服务调用功能
@EnableFeignClients
public class ConsumerApplication { 

    public static void main(String[] args) { 
        SpringApplication.run(ConsumerApplication.class,args);;
    }
}

3、编写Feign客户端
在接口上添加@FeignClient注解 用于声明当前类为Feign客户端 然后并且指定服务名称即可
需要注意的是 Feign客户端其实是一个接口

// @FeignClient注解声明了当前类为Feign客户端 并且指定服务名称 这样即可自动拼接了
@FeignClient("user-service")
public interface UserClient { 

    // 自动拼接成http://user-service/user/{id}
    @GetMapping("/user/{id}")
    User queryById(@PathVariable Long id);
}

4、编写控制器
在控制器中引入写好的Feign客户端 然后直接调用Feign客户端中的方法即可

@RestController
@RequestMapping("/consumerfeign")
public class ConsumerFeignController { 

    // 引入写好的Feign客户端
    @Autowired
    private UserClient userClient;

    @GetMapping("/{id}")
    public User queryById(@PathVariable Long id)
    { 
        // 直接调用Feign客户端中的方法即可
        return userClient.queryById(id);
    }
}

二、Feign的负载均衡和熔断器

Feign已经内置了Ribbon负载均衡和Hystrix熔断器
其实包括负载均衡 服务熔断 请求压缩 日志级别 这些功能都可通过配置项在Feign中开启以使用

1、Ribbon负载均衡配置

ribbon:
  # 连接超时时长 单位为毫秒
  ConnectTimeout: 1000
  # 数据通信超时时长 单位为毫秒
  ReadTimeout: 2000
  # 当前服务器的重试次数
  MaxAutoRetries: 0
  # 重试多少次服务
  MaxAutoRetriesNextServer: 0
  # 是否对所有的请求方式都重试
  OkToRetryOnAllOperations: false

2、Hystrix熔断器配置

Feign集成的Hystrix默认情况下是关闭的 需要手动在配置中开启:

feign:
  hystrix:
    # 开启Feign的熔断功能
    enabled: true

然后再配置熔断方法Fallback
指定在Feign客户端中当某个方法请求失败 需要调用哪个回调方法
因此 方法名需要一致 即实现该接口即可

// 作为一个组件 记得要加上@Component注解
@Component
public class UserClientFallback implements UserClient { 

    @Override
    public User queryById(Long id) { 
        User user=new User();
        user.setId(id);
        user.setName("用户异常,查询失败。");
        return user;
    }
}

最后 Feign客户端的注解也需要修改一下:

  • value属性代表要自动调用的服务名称
  • fallback属性代表服务降级类的class
// @FeignClient注解声明了当前类为Feign客户端 并且指定服务名称 这样即可自动拼接了
@FeignClient(value = "user-service",fallback = UserClientFallback.class)
public interface UserClient { 

    // 自动拼接成http://user-service/user/{id}
    @GetMapping("/user/{id}")
    User queryById(@PathVariable Long id);
}

测试成功:

三、请求压缩

Feign支持对请求和响应进行GZIP压缩以减少通信过程中的性能损耗

通过以下参数即可开启请求与响应的压缩功能:

feign:
  compression:
    request:
      # 开启GZIP请求压缩
      enabled: true
      # 设置压缩的数据类型
      mime-types: text/html,application/xml,application/json
      # 设置触发压缩的大小下限
      min-request-size: 2048
    response:
      # 开启GZIP响应压缩
      enabled: true

四、日志级别

首先 在配置文件中开启日志记录:

# 开启日志记录
logging:
  level:
    # 这里的属性名为包名 意为记录该包下的所有日志
    net.zjitc: debug

然后编写配置类 在配置类中设置日志级别:
Feign支持4种日志级别:

  • NONE:不记录任何日志信息(默认)
  • BASIC:仅记录请求的方法 URL以及响应状态码和执行时间
  • HEADERS:在BASIC日志级别的基础上额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细 包括头信息 请求体 元数据
// 配置类
@Configuration
public class FeignConfig { 

    @Bean
    Logger.Level feignLoggerLevel()
    { 
        return Logger.Level.FULL;
    }
}

最后 在Feign客户端中进行设置即可:

  • configuration属性代表Feign配置类的class
// @FeignClient注解声明了当前类为Feign客户端 并且指定服务名称 这样即可自动拼接了
@FeignClient(value = "user-service",fallback = UserClientFallback.class,configuration = FeignConfig.class)
public interface UserClient { 

    // 自动拼接成http://user-service/user/{id}
    @GetMapping("/user/{id}")
    User queryById(@PathVariable Long id);
}

测试:
日志记录成功

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服