一、服务调用Feign简介
Feign是springcloud中的声明式服务调用组件,可以让开发者 只需要定义接口和配置注解,在调用接口方法时,Feign会根据注解配置 帮我们调用对应的目标服务和方法
二、Feign入门案例
(1)、导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)、Feign的客户端
创建接口
@FeignClient("user-service") // 通过value属性指定服务名称
public interface UserFeignApi {
@GetMapping("/user/{id}")
public Map findById(@PathVariable("id") String username);
}
- 首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟mybatis的mapper很像
- @FeignClient,声明这是一个Feign客户端,同时通过value属性指定服务名称
- 接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果
新建FeignController,使用userFeignApi访问
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
UserFeignApi userFeignApi;
@GetMapping("{id}")
public Map queryById(@PathVariable("id") String id){
return userFeignApi.findById(id);
}
}
(3)、开启Feign功能
启动类上,添加注解,开启Feign功能
@SpringCloudApplication
@EnableFeignClients // 开启Feign功能
// RestTemplate的注册被我删除了。Feign中已经自动集成了Ribbon负载均衡
public class ConsumerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerDemoApplication.class, args);
}
}
三、负载均衡的支持
1、修改超时时长
Fegin内置的ribbon默认设置了请求超时时长,默认是1000ms
application.yml文件
ribbon:
ReadTimeout: 2000 # 读取超时时长
ConnectTimeout: 1000 # 建立链接的超时时长
2、重试机制
ribbon内部有重试机制,一旦超时,会自动重新发起请求。如果不希望重试,可以添加配置
application.yml文件中
ribbon:
ConnectTimeout: 500 # 连接超时时长
ReadTimeout: 1000 # 数据通信超时时长
MaxAutoRetriesNextServer: 2 # 切换重试多少次服务
MaxAutoRetries: 1 # 当前服务器的重试次数
OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试
四、Feign集成Hystix
默认是关闭的,需手动开启
application.yml文件中
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
定义一个类,实现刚才编写的UserFeignClient,作为fallback的处理类
@Component
public class UserFeignFallback implements UserFeignApi {
@Override
public Map findById(String username) {
Map map = new HashMap();
map.put("msg","对不起,网络出现异常请稍后重试");
return map;
}
}
在UserFeignClient中,指定刚才编写的实现类
@FeignClient(value = "user-service",fallback = UserFeignFallback.class)
public interface UserFeignApi {
@GetMapping("/user/{id}")
public Map findById(@PathVariable("id") String username);
}
五、日志调试
设置com.rrx.feign包下的日志级别为debug
logging:
level:
com.rrx.feign: debug
编写配置类,定义日志级别
/**
* Fegin的自动配置类
*/
@Configuration
// 提取出api的时候使用
// 扫描FeignClient注解
@EnableFeignClients(basePackages = "org.feign")
// 扫描Spring注解
@ComponentScan(basePackages = "org.feign")
public class FeginConfiguration {
@Bean
Logger.Level feginLoggerLever(){
//- NONE:不记录任何日志信息,这是默认值。
//- BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
//- HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
//- FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
// 定义fegin的输出日志级别
return Logger.Level.FULL;
}
}