美文网首页
SpringCloud微服务服务间调用之OpenFeign介绍(

SpringCloud微服务服务间调用之OpenFeign介绍(

作者: 不1见2不3散4 | 来源:发表于2018-12-09 12:29 被阅读0次

    前提:
    阅读本文前请先参考《SpringCloud微服务服务间调用之OpenFeign介绍(一) 》

    问题由来

    使用Feign可以完成服务间调用,但是总存在一种情况:服务提供方没有注册到注册中心、服务提供方还没开发完成(因为也就无法调用)等等。此时如果我们需要完成服务间调用该如何做呢?
    Feign提供了fallback机制,也就是当对方服务还没ready(一般情况是服务提供方在注册中心上没有可用的实例),可以返回信息供服务进行下,也就是服务降级。

    解决办法

    官方文档:http://cloud.spring.io/spring-cloud-openfeign/single/spring-cloud-openfeign.html#spring-cloud-feign-hystrix-fallback

    完整的代码在这里: user-servicehystrix-user-service, 欢迎加星、fork。
    主要使用consul 1.2.0, Spring Boot 1.5.12, Spring Cloud Edgware.RELEASE。
    Feign结合Hystrix可以实现服务降级
    1, 需要引入Hystrix依赖并在启动类和配置文件中启用Hystrix

    pom文件增加如下依赖

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
            </dependency>
    

    启动类加上@EnableHystrix,@EnableHystrixDashboard,@EnableFeignClients

    @SpringBootApplication
    @EnableHystrix
    @EnableHystrixDashboard
    @EnableDiscoveryClient
    @EnableCircuitBreaker
    //@EnableTurbine
    @EnableFeignClients(basePackages = {"com.yq.client"})
    public class HystrixDemoApplication {
        private static final Logger logger = LoggerFactory.getLogger(HystrixDemoApplication.class);
    
        public static void main(String[] args) {
            SpringApplication.run(HystrixDemoApplication.class, args);
            logger.info("HystrixDemoApplication Start done.");
        }
    }
    

    配置文件中feign启用hystrix

    feign.hystrix.enabled=true
    

    2, 实现自己的fallback服务

    feignClient类

    @FeignClient(value = "user-service", fallback = UserServiceClientFallbackFactory.class)
    @Component
    public interface UserServiceClient {
        @RequestMapping(value = "/v1/users/{userId}", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
        String getUserDetail(@PathVariable("userId") String userId);
    }
    

    自定义的fallback类

    @Component
    @Slf4j
    public class UserServiceClientFallbackFactory implements UserServiceClient{
        @Override
        public String getUserDetail(String userId) {
            log.error("Fallback2, userId={}", userId);
            return "user-service not available2 when query '" + userId + "'";
        }
    }
    

    效果截图

    第一张截图
    虽然我们创建了fallback类,也引入了Hystrix,但是没有启用feign.hystrix.enabled=true,所以无法实现服务降级,服务间调用还是直接报异常。


    feign001_NoEnableHystrix.png

    第二张截图
    我们创建了fallback类,也引入了Hystrix,同时启用feign.hystrix.enabled=true,所以当user-service不可用时,顺利实现服务降级。


    feign002_EnableHystrix.png

    第三张, user-service服务正常, fallback不影响原有服务间调用正常进行。


    feign003_userServiceON.png

    相关文章

      网友评论

          本文标题:SpringCloud微服务服务间调用之OpenFeign介绍(

          本文链接:https://www.haomeiwen.com/subject/ohihhqtx.html