微服务(五) 【手摸手带你搭建Spring Cloud】 Feign是什么 Feign怎么配置熔断器 Feign怎么配置日志级别 Feign怎么配置ribbon Feign如何配置请求压缩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、Feign简介二、实现2.1 导入启动器依赖2.2 开启Feign功能2.3 编写Feign客户端2.4 编写一个处理器 UserFeignController2.5 导入启动器以来前言接下来,我么开始学习使用Feign进行远程调用 。为什么要使用Feign呢?因为在前面呢,虽然使用了Spring Cloud 的Rib
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
这一章,带领大家一起学习使用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中刚才测试熔断器的延时注释。
可以看到控制台输出请求信息
本章例程
下一章我们介绍一下网关的内容。
更多推荐
所有评论(0)