feign整合了ribbon和hystrix,除了提供这两者的强大功能之外, 它还提供了一种声明式的web服务客户端定义方式

快速入门

依赖

  1. <!--openfeign-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. </dependency>

配置

  1. server:
  2. port: 30004
  3. eureka:
  4. client:
  5. # 指定注册中心地址
  6. service-url:
  7. defaultZone: http://localhost:30000/eureka/
  8. spring:
  9. application:
  10. name: FEIGN-CONSUMER

启动类

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. @EnableFeignClients
  4. public class FeignConsumerApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(FeignConsumerApplication.class, args);
  7. }
  8. }

接口, 服务名不区分大小写

  1. @FeignClient("HELLO-SERVICE")
  2. public interface HelloService {
  3. @GetMapping("/hello")
  4. String test();
  5. }

使用测试

  1. @RestController
  2. public class FeignController {
  3. @Autowired
  4. private HelloService helloService;
  5. @GetMapping("/test")
  6. public String test() {
  7. for (int i = 0; i < 10; i++) {
  8. helloService.test();
  9. }
  10. return helloService.test();
  11. }
  12. }

继承特性

简言之,

  1. 抽出一个api项目, 将接口和接口用到的实体定义在api项目中;
  2. 服务提供方的controller实现此接口,并提供具体的实现;
  3. 服务消费方(feign调用方)构造一个“具体的service”继承此接口,在其他代码中注入“具体的service”, 并使用

好处: 将接口的定义从controller剥离, 轻易实现对接口定义的共享, 实现在构建期的接口绑定,从而有效减少服务客户端的绑定配置。

缺点: 接口变动对项目构建产生影响,可能服务提供方修改了一个接口定义,那么直接会导致客户端工程的构建失败

相关配置

这本书的配置方式可能过期了,仅做参考

ribbon配置

feign的负载均衡是通过ribbon来实现的

  • 全局配置

ribbon.=

  • 指定服务配置, 针对特定的服务配置ribbon参数

.ribbon.=
此处的client是在@FeignClient()中定义的客户端名称

  • 重试机制

指ribbon的重试,需要在配置文件中开启,注意hystrix的超时时间要大于ribbon的超时时间

hystrix配置

默认情况下, feign会将所有的Feign客户端的方法封装进Hystrix命令中进行服务保护

  • 全局配置

image.png

  • 禁用hystrix

全局关闭

  1. feign:
  2. hystrix:
  3. enabled: false

指定某一个服务关闭

  1. @Configuration
  2. public class DisableHystrixConfig {
  3. @Bean
  4. @Scope("prototype")
  5. public Feign.Builder feignBuilder() {
  6. return Feign.builder();
  7. }
  8. }
  1. @FeignClient(value = "HELLO-SERVICE",configuration = DisableHystrixConfig.class)
  2. public interface HelloService {
  3. @GetMapping("/hello")
  4. String test();
  5. }
  • 指定命令配置

对指定的接口名称进行配置,用的太少, 略

  • 服务降级配置

配置服务降级类

  1. /**
  2. * 服务降级类
  3. * @author xinzhang
  4. * @date 2020/9/21 16:21
  5. */
  6. @Service
  7. public class HelloFallbackServiceImpl implements HelloService {
  8. @Override
  9. public String test() {
  10. return "请求失败!";
  11. }
  12. }
  1. /**
  2. * @author xinzhang
  3. * @date 2020/9/21 14:58
  4. */
  5. @FeignClient(value = "HELLO-SERVICE",fallback = HelloFallbackServiceImpl.class)
  6. public interface HelloService {
  7. @GetMapping("/hello")
  8. String test();
  9. }
  • 请求压缩

image.png

  • 日志记录

feign在构建@FeignClient修饰的服务客户端时,会为每一个客户端构建一个feign.logger实例,使用方法
配置文件中开启日志记录

  1. logging:
  2. level:
  3. top:
  4. xinzhang0618:
  5. feign:
  6. service:
  7. HelloService: DEBUG

日志全局配置,feign默认是NONE

  1. @Configuration
  2. public class FeignLoggerConfig {
  3. @Bean
  4. Logger.Level feignLoggerLevel() {
  5. return Logger.Level.FULL;
  6. }
  7. }

客户端引用配置

  1. @FeignClient(value = "HELLO-SERVICE", configuration = FeignLoggerConfig.class, fallback =
  2. HelloFallbackServiceImpl.class)
  3. public interface HelloService {
  4. @GetMapping("/hello")
  5. String test();
  6. }

测试

  1. 2020-09-21 16:32:00.957 DEBUG 10680 --- [io-30004-exec-2] t.x.feign.service.HelloService : [HelloService#test] hello! search-demo!
  2. 2020-09-21 16:32:00.957 DEBUG 10680 --- [io-30004-exec-2] t.x.feign.service.HelloService : [HelloService#test] <--- END HTTP (19-byte body)
  3. 2020-09-21 16:32:00.958 DEBUG 10680 --- [io-30004-exec-2] t.x.feign.service.HelloService : [HelloService#test] ---> GET http://HELLO-SERVICE/hello HTTP/1.1
  4. 2020-09-21 16:32:00.958 DEBUG 10680 --- [io-30004-exec-2] t.x.feign.service.HelloService : [HelloService#test] ---> END HTTP (0-byte body)
  5. 2020-09-21 16:32:00.960 DEBUG 10680 --- [io-30004-exec-2] t.x.feign.service.HelloService : [HelloService#test] <--- HTTP/1.1 200 (2ms)
  6. 2020-09-21 16:32:00.960 DEBUG 10680 --- [io-30004-exec-2] t.x.feign.service.HelloService : [HelloService#test] connection: keep-alive
  7. 2020-09-21 16:32:00.960 DEBUG 10680 --- [io-30004-exec-2] t.x.feign.service.HelloService : [HelloService#test] content-length: 19
  8. 2020-09-21 16:32:00.960 DEBUG 10680 --- [io-30004-exec-2] t.x.feign.service.HelloService : [HelloService#test] content-type: text/plain;charset=UTF-8
  9. 2020-09-21 16:32:00.960 DEBUG 10680 --- [io-30004-exec-2] t.x.feign.service.HelloService : [HelloService#test] date: Mon, 21 Sep 2020 08:32:00 GMT
  10. 2020-09-21 16:32:00.960 DEBUG 10680 --- [io-30004-exec-2] t.x.feign.service.HelloService : [HelloService#test] keep-alive: timeout=60

image.png