【SpringCloud组件学习笔记系列】(3)OpenFeign组件

本文详细介绍了如何在SpringCloud中使用Feign进行API隐藏调用,涵盖了依赖引入、配置、负载均衡、Hystrix集成、请求压缩和日志级别设置。通过实例演示了从配置到测试的全过程,并讨论了Feign如何支持Ribbon负载均衡和故障切换。
摘要由CSDN通过智能技术生成

SpringCloud组件学习笔记系列

【SpringCloud组件学习笔记系列】(1)Eureka组件
【SpringCloud组件学习笔记系列】(2)Hystrix组件
【SpringCloud组件学习笔记系列】(3)OpenFeign组件
【SpringCloud组件学习笔记系列】(4)Gateway组件
【SpringCloud组件学习笔记系列】(5)Config组件

完整代码已在Github开源:
https://github.com/Aliang99/SpringCloud_Bill

3、SpringCloud Netflix OpenFeign的使用以及讲解

Feign可以把Rest请求进行隐藏,伪装成类似SpringMVC的Controller一样,不用再自己拼接URL,拼接参数等等操作,Feign可以接管这些并自动完成。

3.1、Feign的使用

3.1.1、依赖引入

在consumer的pom文件中引入:

 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3.1.2、客户端配置

创建客户端接口类,添加添加@FeignClient注解,指定需要访问的服务名

/**
 * Feign客户端配置
 */
@FeignClient("User-Service") // user-service为服务提供者的微服务名称
public interface UserFeignClient {

    /**
     * Feign会通过动态代理,生成实现类
     * 添加了@FeignClient注解的接口,它的所有抽象方法,完全采用SpringMVC的注解,Feign会根据注解,自动生成URL,并访问获取结果
     * getmapping中给的地址,前面必须要斜杠,因为需要拼接,少了斜杠,拼接出来的地址会无法访问
     */
    @GetMapping("/user/queryById/{id}") // feign对该请求地址做处理成http://user-service/user/queryById/id,十分优雅
    public CommonVo<User> queryById(@PathVariable("id") Long id);
}
3.1.3、编写新的Controller
@RestController
@RequestMapping("/UserFeign")
public class UserByFeignController {

    @Autowired
    private UserFeignClient client; // 注入Feign的客户端,以供使用

    @GetMapping("/user/queryById/{id}")
    public CommonVo<User> queryById(@PathVariable("id") Long id){
        CommonVo<User> userCommonVo = client.queryById(id);
        return userCommonVo;
    }
}
3.1.4、启动类

添加开启Feign功能的注解**@EnabledFeignClients**

@SpringBootApplication//(exclude= {DataSourceAutoConfiguration.class}) //exclude 避免因导入的其它模块中有类需要链接数据库而报错
@EnableDiscoveryClient //开启Eureka客户端发现
@EnableCircuitBreaker // 开启熔断
@EnableFeignClients //开启Feign功能
public class SpringCloud_Consumer_80_Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloud_Consumer_80_Application.class,args);
    }
}
3.1.5、启动服务并测试

image-20220119225324328

3.2、负载均衡

Feign自身整合了Ribbon的依赖和自动配置,因此可以直接支持负载均衡

Feign内置的Ribbon默认设置了请求超时时长,默认值为1000ms,可以通过设置参数值来修改这个数值。

3.2.1、配置全局
ribbon: 
	ReadTimeout: 2000 # 读取超时时长
	ConnectTimeout: 1000 # 建立链接的超时时长
3.2.2、配置单个服务名称
User-Service: 
  ribbon: 
    ReadTimeout: 2000 # 读取超时时长
    ConnectTimeout: 1000 # 建立链接的超时时长

User-Service为服务提供者的服务名称。

Ribbon内部有重试机制,一旦超时,会自动重新发起一次请求。

这些也可以通过配置文件配置指定值。

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

3.3、Hystrix支持

3.3.1、开启Hystrix

Feign集成了Hystrix,不过默认是关闭的,需要在配置文件中开启。

feign: 
	hystrix: 
		enabled: true # 开启Feign的熔断功能
3.3.2、使用Hystrix

编写Feign客户端的实现类

/**
 * 编写 Feign客户端的实现类,用于对发生熔断的请求做相应的处理
 */
@Component
public class UserFallBack implements UserFeignClient{
    /**
     * 对 queryById这个请求地址做熔断处理,请求超时时,调用以下的方法,响应客户端
     * @param id
     * @return
     */
    @Override
    public CommonVo<User> queryById(Long id) {
        return new CommonVo<>(400,"抱歉,联通网络提醒您,您请求的服务暂时联不通,请稍后再试!!!",null);
    }
}

修改客户端中,@FeignClient注解的fallback属性的值为该接口的自定义实现类

/**
 * Feign客户端配置
 */
@FeignClient(value = "User-Service",fallback = UserFallBack.class) // user-service为服务提供者的微服务名称
public interface UserFeignClient {

    /**
     * Feign会通过动态代理,生成实现类
     * 添加了@FeignClient注解的接口,它的所有抽象方法,完全采用SpringMVC的注解,Feign会根据注解,自动生成URL,并访问获取结果
     * getmapping中给的地址,前面必须要斜杠,因为需要拼接,少了斜杠,拼接出来的地址会无法访问
     */
    @GetMapping("/user/queryById/{id}") // feign对该请求地址做处理成http://user-service/user/queryById/id,十分优雅
    public CommonVo<User> queryById(@PathVariable("id") Long id);
}
3.3.3、测试前后区别

开启消费者、提供者以及Eureka服务

正常访问:

image-20220119234255254

停止服务提供者之后,访问:

此时触发了服务降级,调用了fallback指定的,Feign客户端配置类的子类方法。

image-20220119234315204

image-20220119234341956

3.4、请求压缩(了解)

Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求与响应的压缩功能:

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

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

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

注意:以上皆为默认值。

3.5、日志级别(了解)

设置了日志级别,就可以在控制台看到压缩的具体信息。

@FeignClient注解修改的客户端在被代理时,会创建一个新的Feign.Logger示例。需要指定这个实例的日志级别。完成日志打印。

3.5.1、设置日志级别
logging: 
	level: 
		com.aliang: debug # com.aliang为包名
3.5.2、编写Feign配置类
/**
 * Feign的日志配置类
 */
@Configuration
public class FeignConfiguration {

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

这里指定的Level级别是FULL,Feign支持4种级别:

  • NONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
3.5.3、指定配置类
/**
 * Feign客户端配置
 */
// user-service为服务提供者的微服务名称
@FeignClient(value = "User-Service",fallback = UserFallBack.class,configuration = FeignConfiguration.class)  //configuration指定配置类
public interface UserFeignClient {
    @GetMapping("/user/queryById/{id}") 
    public CommonVo<User> queryById(@PathVariable("id") Long id);
}
3.5.4、测试

浏览器输入地址,控制台输出的信息如下:

image-20220119235728264

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值