Spring Cloud Feign 声明式服务调用

在微服务的架构中,服务间通常会形成相互依赖的关系,比如现在有三个微服务节点:A,B和C,B为A的消费者,C为B的消费者。假如由于网络波动或者A服务自身故障,导致B调用A服务的线程被挂起进入长时间的等待。在高并发的情况下可能导致B的资源被耗竭随之崩溃,从而导致C服务也不可用。这种连环式的雪崩效应在微服务中较为常见,为了解决这个问题,服务熔断技术应运而出。熔断一词来自电路学,指的是电路在出现短路状况时,“断路器”能够及时地切断故障电路,避免电路过载发热引发火灾。

类似的,微服务架构中的断路器能够及时地发现故障服务,并向服务调用方返回错误响应,而不是长时间的等待。Spring Cloud Hystrix在Hystrix(又是一款由Netflix开发的开源软件,提供了服务熔断,服务降级,线程隔离等功能,通过这些功能可以提供服务的容错率。只不过Hystrix用起来麻烦,可以用Feign替代。

Spring Cloud Feign整合了Hystrix,提供声明式服务调用。在Spring Cloud Feign中编写服务调用代码非常简单。

服务一配置

application.yml

server:
  port: 8082
spring:
  application:
    name: server-provider # 指定服务名称为 server-provider
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:  
      defaultZone: http://localhost:8080/eureka/,http://localhost:8081/eureka/
feign:
  hystrix:
   enabled: true # 开启Hystrix
  compression:  #支持对请求与响应进行GZIP压缩,以减少通信过程中的性能损耗
   request:
     enabled: true      # 开启对请求得压缩
     mime-types: text/xml,application/xml,application/json # 压缩的请求格式
     min-request-size: 2048                                # 请求压缩的大小下限,只有超过这个大小的请求才会对其进行压缩
    response:
     enabled: true

// TestFeign.java
@FeignClient(value = "server-provider-two",// 要调用的服务名
fallback = TestServiceFeignFallback.class  // 服务降级执行的方法
)
public interface TestFeign {
    @GetMapping("test/test01")
    public String get(@RequestParam("id") String id);
}

// TestServiceFeignFallback.java
@Component
public class TestServiceFeignFallback implements TestFeign {
    @Override
    public String get(String id) {
        return  "出现异常,服务降级";
    }
}

// 启动类
@EnableDiscoveryClient
@SpringBootApplication //当前启动类是配置类
@EnableFeignClients
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

服务二配置

application.yml

server:
  port: 8083
spring:
  application:
    name: server-provider-two # 指定服务名称为 server-provider-two
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:  # 指定Eureka服务端的地址
      defaultZone: http://localhost:8080/eureka/,http://localhost:8081/eureka/


// Test.java
@RestController
@RequestMapping("test")
public class Test {
    @GetMapping("/test01")
    public String hello(@RequestParam("id") String id) {
      // 设置一个超时异常 服务一调用的时候会走降级方法
        for (int i = 0; i < 100000000; i++) {
            System.out.println(i);
        }
        System.out.println(id);
        return id;
    }
}

Last modification:July 26th, 2019 at 10:22 am

Leave a Comment