你必须会的微服务之Feign

·  阅读 222

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

微服务已经成当前各大大厂追求的主流技术架构,学习微服务前景非常可观,而SpringCloud已成为主流微服务技术栈。本系列文章将以SpringCloud技术栈进行精讲,全方位剖析讲解SpringCloud技术栈在微服务场景下的实战应用,可以点赞关注,后续持续为大家更新。

Spring Cloud Feign

知识索引

  • Feign简介
  • 入门案例
  • 负载均衡
  • 请求响应压缩
  • 日志级别

1 Feign简介

在前面的章节中我们调用微服务都是通过RestTemplate完成,但这种调用方式需要我们编写url,编写url则需要我们清楚的知道被调用的服务代码,返回值也同样如此,我们需要知道返回的数据结构并且在调用方定义该接口来接受返回值。毫无疑问这种方式违背了面向接口编程的原则。而Feign就是用于解决这个问题。

Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级框架,是以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种方式更加直观符合面向接口编程的原则。

2 入门案例

Feign一般由服务提供方负责编写,由服务消费方依赖使用

2.1 创建feign模块

在实际开发中,该模块位于服务提供项目中,在服务发版完成后打包到maven私有仓库

创建service_provider_feign模块

image-20220313190256675

2.2 引入依赖

<dependencies>
    <!--配置feign-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR5</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
复制代码

2.3 编写feign

/**
 * Copyright (c) 2022 itmentu.com, All rights reserved.
 *
 * @Author: yang
 */
@FeignClient(value = "service-provider")
public interface HelloFeign {

    @GetMapping("/hello")
    String hello();
}
复制代码

2.4 消费者依赖该模块

service_consumer中依赖该模块

<dependency>
    <groupId>com.itmentu</groupId>
    <artifactId>service_provider_feign</artifactId>
    <version>${version}</version>
</dependency>
复制代码

2.5 代码修改

2.5.1 修改启动类

添加@EnableFeignClients注解,该注解表示开启feign功能

/**
 * Copyright (c) 2022 itmentu.com, All rights reserved.
 *
 * @Author: yang
 */
@SpringBootApplication
@EnableFeignClients
public class ServiceConsumerApplication {

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

    @Bean
    @LoadBalanced//开启负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
复制代码

2.5.2 修改ConsumerController新增接口

@Autowired
private HelloFeign helloFeign;

@GetMapping("/hello-feign")
public String hello3(){
    return helloFeign.hello();
}
复制代码

2.6 启动服务调用接口

可以看到已经调用成功

image-20220313190952914

3 负载均衡

Spring Cloud Feign已经集成了Ribbon无需额外依赖和配置,我们之前配置的负载均衡依然可以生效

由于原先配置了随机策略此时效果为:

实例1:

image-20220313191334084

实例2:

image-20220313191301845

4 请求压缩

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

通过配置开启请求与响应的压缩功能:

feign:
	compression:
        request:
            enabled: true # 开启请求压缩
        response:
            enabled: true # 开启响应压缩

复制代码

也可以对请求的数据类型,以及触发压缩的大小下限进行设置

#  Feign配置
feign:
	compression:
		request:
			enabled: true # 开启请求压缩
			mime-types:	text/html,application/xml,application/json # 设置压缩的数据类型
			min-request-size: 2048 # 设置触发压缩的大小下限
			#以上数据类型,压缩大小下限均为默认值

复制代码

5 配置日志级别

5.1 日志级别说明

在发送和接收请求的时候,Feign定义了日志的输出定义了四个等级:这里我们配置测试一下。

级别说明
NONE不做任何记录
BASIC只记录输出Http 方法名称、请求URL、返回状态码和执行时间
HEADERS记录输出Http 方法名称、请求URL、返回状态码和执行时间 和 Header 信息
FULL记录Request 和Response的Header,Body和一些请求元数据

5.2 案例演示

service_consumer的配置文件中设置com.itmentu包下的日志级别都为debug

# com.itmentu 包下的日志级别都为Debug
logging:
  level:
    com.itmentu: debug
复制代码

service_consumer编写配置类,定义日志级别

@Configuration
public class FeignLogConfig {

    //采用full打印日志
    @Bean
    public Logger.Level configLog(){
        return Logger.Level.FULL;
    }
}
复制代码

  

service_consumer的HelloFeign中指定配置类

/**
 * Copyright (c) 2022 itmentu.com, All rights reserved.
 *
 * @Author: yang
 */
@FeignClient(value = "service-provider",configuration = FeignLogConfig.class)
public interface HelloFeign {

    @GetMapping("/hello")
    String hello();
}
复制代码

重启项目,即可看到每次访问的日志

image-20220313192107507

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改