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、启动服务并测试
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服务
正常访问:
停止服务提供者之后,访问:
此时触发了服务降级,调用了fallback指定的,Feign客户端配置类的子类方法。
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、测试
浏览器输入地址,控制台输出的信息如下: