SpringCloud简介
Spring Cloud是Spring旗下的项目之一
Spring Cloud并不是一个组件 而是许多组件的集合
其将当下非常流行的一些技术整合到了一起 实现了多个分布式开发中的重要功能
协调了分布式环境中各个系统 并且为各类服务提供模板性的配置
其主要涉及的组件包括:
- Eureka:注册中心
- Zuul或Spring Cloud Gateway:服务网关
- Ribbon:负载均衡
- Feign:服务调用
- Hystrix或Resilience4j:熔断器
【在本篇中 将介绍Feign服务调用】
Feign服务调用
Feign意即伪装
Feign可以将Rest的请求进行隐藏 然后伪装成类似于SpringMVC的Controller一样的形式
无需自己进行指定服务名称 拼接url 拼接参数等繁琐操作 一切都可以交给Feign去做
一、使用步骤
注:在服务消费端进行操作 因为是服务消费端需要使用Feign进行便捷的服务调用
1、添加Feign的Maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、在启动类上添加/@EnableFeignClients注解以开启Feign服务调用功能
@SpringCloudApplication
// 开启Feign服务调用功能
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);;
}
}
3、编写Feign客户端
在接口上添加@FeignClient注解 用于声明当前类为Feign客户端 然后并且指定服务名称即可
需要注意的是 Feign客户端其实是一个接口
// @FeignClient注解声明了当前类为Feign客户端 并且指定服务名称 这样即可自动拼接了
@FeignClient("user-service")
public interface UserClient {
// 自动拼接成http://user-service/user/{id}
@GetMapping("/user/{id}")
User queryById(@PathVariable Long id);
}
4、编写控制器
在控制器中引入写好的Feign客户端 然后直接调用Feign客户端中的方法即可
@RestController
@RequestMapping("/consumerfeign")
public class ConsumerFeignController {
// 引入写好的Feign客户端
@Autowired
private UserClient userClient;
@GetMapping("/{id}")
public User queryById(@PathVariable Long id)
{
// 直接调用Feign客户端中的方法即可
return userClient.queryById(id);
}
}
二、Feign的负载均衡和熔断器
Feign已经内置了Ribbon负载均衡和Hystrix熔断器
其实包括负载均衡 服务熔断 请求压缩 日志级别 这些功能都可通过配置项在Feign中开启以使用
1、Ribbon负载均衡配置:
ribbon:
# 连接超时时长 单位为毫秒
ConnectTimeout: 1000
# 数据通信超时时长 单位为毫秒
ReadTimeout: 2000
# 当前服务器的重试次数
MaxAutoRetries: 0
# 重试多少次服务
MaxAutoRetriesNextServer: 0
# 是否对所有的请求方式都重试
OkToRetryOnAllOperations: false
2、Hystrix熔断器配置:
Feign集成的Hystrix默认情况下是关闭的 需要手动在配置中开启:
feign:
hystrix:
# 开启Feign的熔断功能
enabled: true
然后再配置熔断方法Fallback
指定在Feign客户端中当某个方法请求失败 需要调用哪个回调方法
因此 方法名需要一致 即实现该接口即可
// 作为一个组件 记得要加上@Component注解
@Component
public class UserClientFallback implements UserClient {
@Override
public User queryById(Long id) {
User user=new User();
user.setId(id);
user.setName("用户异常,查询失败。");
return user;
}
}
最后 Feign客户端的注解也需要修改一下:
- value属性代表要自动调用的服务名称
- fallback属性代表服务降级类的class
// @FeignClient注解声明了当前类为Feign客户端 并且指定服务名称 这样即可自动拼接了
@FeignClient(value = "user-service",fallback = UserClientFallback.class)
public interface UserClient {
// 自动拼接成http://user-service/user/{id}
@GetMapping("/user/{id}")
User queryById(@PathVariable Long id);
}
测试成功:
三、请求压缩
Feign支持对请求和响应进行GZIP压缩以减少通信过程中的性能损耗
通过以下参数即可开启请求与响应的压缩功能:
feign:
compression:
request:
# 开启GZIP请求压缩
enabled: true
# 设置压缩的数据类型
mime-types: text/html,application/xml,application/json
# 设置触发压缩的大小下限
min-request-size: 2048
response:
# 开启GZIP响应压缩
enabled: true
四、日志级别
首先 在配置文件中开启日志记录:
# 开启日志记录
logging:
level:
# 这里的属性名为包名 意为记录该包下的所有日志
net.zjitc: debug
然后编写配置类 在配置类中设置日志级别:
Feign支持4种日志级别:
- NONE:不记录任何日志信息(默认)
- BASIC:仅记录请求的方法 URL以及响应状态码和执行时间
- HEADERS:在BASIC日志级别的基础上额外记录了请求和响应的头信息
- FULL:记录所有请求和响应的明细 包括头信息 请求体 元数据
// 配置类
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel()
{
return Logger.Level.FULL;
}
}
最后 在Feign客户端中进行设置即可:
- configuration属性代表Feign配置类的class
// @FeignClient注解声明了当前类为Feign客户端 并且指定服务名称 这样即可自动拼接了
@FeignClient(value = "user-service",fallback = UserClientFallback.class,configuration = FeignConfig.class)
public interface UserClient {
// 自动拼接成http://user-service/user/{id}
@GetMapping("/user/{id}")
User queryById(@PathVariable Long id);
}
测试:
日志记录成功