微服务(五) 【手摸手带你搭建Spring Cloud】 Feign是什么 Feign怎么配置熔断器 Feign怎么配置日志级别 Feign怎么配置ribbon Feign如何配置请求压缩

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

这一章,带领大家一起学习使用Feign进行远程调用 。为什么要使用Feign呢? 因为在前面呢,虽然使用了Spring Cloud 的Ribbon负载均衡功能,大大简化了远程调用时的代码,但是呢里面服务地址还是需要拼接和使用RestTemplate

 String url = "http://user-service/user/"+id;
        return "<div><h1>custom-Service[通过注册中心拉取服务]回应:</h1><div>"+restTemplate.getForObject(url, String.class);

这样的话,代码量多,重复率高,每次都要拼接URL,如果使用Feign,能够让代码更加简洁地实现服务的访问。


一、Feign简介

Feign也叫伪装:
Feign可以把Rest的请求进行隐藏,伪装成类似Spring mvc的Controller一样,不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。

二、Feign客户端实现

2.1 导入启动器依赖

在custom-demo工程的pom中添加依赖(这个没什么疑问,用它就引入它)

  <!-- openfeign -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
      <version>2.2.5.RELEASE</version>
    </dependency>

2.2 开启Feign功能

custom-service启动类上加上注解,启动的时候开启Feign功能

@EnableFeignClients

CustomService

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
@EnableFeignClients
public class CustomService {
    public static void main(String[] args) {
        SpringApplication.run(CustomService.class, args);
    }
    @Bean
    @LoadBalanced //负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

2.3 编写Feign客户端

custom-service建个client包,创建一个UserClient接口
Feign客户端能够自动拼接url
如下客户端能够自动拼接http://user-service/user/id
代替我们之前的手动拼接

//声明当前类是一个Feign客户端,指定服务名为user-service
@FeignClient("user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    public String doGet(@PathVariable Long id);
}

2.4 编写一个处理器 UserFeignHandller

控制器收到请求,调用feign客户端的方法。

@RestController
@RequestMapping("user/feign")
public class UserFeignHanller {
    @Autowired
    private UserClient userClient;

    @GetMapping("/{id}")
    public String doGet(@PathVariable Long id){
        return "<div><h1>通过Feign去调用</h1><div>"+ userClient.doGet(id);
    }
}

2.5 运行

访问http://localhost:9001/user/feign/2
能够看到时通过feign客户端去请求服务。
在这里插入图片描述

三、Feign负载均衡及熔断

在本章之前已经学习了ribbon组件和Hystrix组件
那么使用Feign之后如何使用这些组件?
因此在Feign客户端中也有内置ribbon配置项和Hystrix熔断的FallBack配置,还有请求压缩,日志级别也可以配置
Feign中本身已经继承了Ribbon依赖喝自动配置,因此不需要额外引入对象,也不用注册RestTemplate对象
在这里插入图片描述

3.1 ribbon

因此只需要添加配置项即可。
在客户端添加如下配置

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

正常运行
在这里插入图片描述
模拟超时,修改user-service中的方法

package org.antry.service;
import org.springframework.stereotype.Service;
/**
 * @ClassName UserService
 * @Description 实现类
 * @Autor T_Antry
 * @Date 2020/11/11 11:26
 * @Version 1.0
 */
@Service
public class UserServiceImpl implements UserService{
   @Override
   public String doGetUser(Long id){
       try {
           Thread.sleep(2000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       return "<div><h2>User-Service回应:</h2></div>" +
               "<div><h1>T_Antry工作室-springcloud动手了解</h1></div>" +
               "userService:"+String.valueOf(id);
   }
}

随后重启user-service访问
在这里插入图片描述
发现报错了。
是因为,请求失败了,且没有服务降级,因此直接就报错了。

3.2 hystrix

添加配置

custom-service添加配置,开启熔断功能,默认是关闭的。

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

UserClientFallback

因为对应的请求失败,需要跳到fallback的方法中,且fallback的方法名与feign客户端的方法名相同,因此,我们在client包下新建一个fallback包,包下新建UserClientFallback类去继承client接口

package org.antry.client.fallback;

import org.antry.client.UserClient;
import org.springframework.stereotype.Component;

@Component
public class UserClientFallback implements UserClient {
    @Override
    public String doGet(Long id) {
        return "<div><h1>Feign出发熔断</h1><div>";
    }
}

UserClient

指定fallback类

//声明当前类是一个Feign客户端,指定服务名为user-service
@FeignClient(value = "user-service",fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    public String doGet(@PathVariable Long id);
}

运行

在这里插入图片描述
此时,就发生了熔断。

3.3 请求压缩

Spring Cloud Feign支持对请求和响应进行GZIP压缩,以减少通信中的性能损耗,同时,也可以对请求的数据类型,以及触发压缩的大小下限进行设置。
配置如下

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

但由于这测试看不出什么效果,配置完可以运行,暂且默认生效了。

3.4 日志级别

通过logging.level.xx=debug来设置的日志级别,对Feign客户端而言不会产生效果。
@FeignClient注解修改的客户端代理时,都会创建一个新的Feign.Logger实例,需要额外指定日志级别。
在custom-service的配置文件中设置开启org.antry包下的日志级别为DEBUG

logging:
  level:
    org.antry: debug

在custom-service中编写FeignConfig配置类,定义日志级别,当然为了规范,我们把这个类放在一个新建的config包下,
日志有四种记录级别:

级别描述
NONE不记录任何日志信息,这是默认值
BASIC仅记录请求方法,URL以及响应状态码喝执行时间
HEADERS在BASIC基础上,额外记录了请求喝响应的头信息
NONE记录所有请求和响应的明细,包括头信息,请求体,元数据

类在写的时候要注意引入的Logger的包是feign.Logger

package org.antry.config;

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
        /**
         * NONE| 不记录任何日志信息,这是默认值
         * BASIC| 仅记录请求方法,URL以及响应状态码喝执行时间
         * HEADERS| 在BASIC基础上,额外记录了请求喝响应的头信息
         * NONE| 记录所有请求和响应的明细,包括头信息,请求体,元数据
         */
    }
}

随后我们还需要在Feign客户端的配置的@FeignClient注解加上属性 configuration = FeignConfig.class,因为这个配置时给Feign的,所有不是在启动类上配置,而是在Feign客户端上配置
接下来可以启动工程,启动前记得将user-service中刚才测试熔断器的延时注释。
在这里插入图片描述
可以看到控制台输出请求信息
在这里插入图片描述

本章例程
下一章我们介绍一下网关的内容。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值