• Spring Cloud第七篇 | 声明式服务调用Feign


    本文是Spring Cloud专栏的第七篇文章,了解前六篇文章内容有助于更好的理解本文:

    1. Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览

    2. Spring Cloud第二篇 | 使用并认识Eureka注册中心

    3. Spring Cloud第三篇 | 搭建高可用Eureka注册中心

    4. Spring Cloud第四篇 | 客户端负载均衡Ribbon

    5. Spring Cloud第五篇 | 服务熔断Hystrix

    6. Spring Cloud第六篇 | Hystrix仪表盘监控Hystrix Dashboard

    一、Feign是什么

        Feign是Netflix公司开发的一个声明式的REST调用客户端; Ribbon负载均衡、 Hystrⅸ服务熔断是我们Spring Cloud中进行微服务开发非常基础的组件,在使用的过程中我们也发现它们一般都是同时出现的,而且配置也都非常相似,每次开发都有很多相同的代码,因此Spring Cloud基于Netflix Feign整合了Ribbon和Hystrix两个组件,让我们的开发工作变得更加简单, 就像Spring boot是对Spring+ SpringMVC的简化, Spring Cloud Feign对Ribbon负载均衡、 Hystrⅸ服务熔断进行简化,在其基础上进行了进一步的封装,不仅在配置上大大简化了开发工作,同时还提供了一种声明式的Web服务客户端定义方式。使用方式类似Dubbo的使用方式。

    二、使用Feign实现消费者

    1、创建消费者服务命名为(springcloud-service-feign)

    2、添加依赖

        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

    3、在启动类上添加注解

    @EnableFeignClients

    4、声明服务

        定义一个HelloService接口,通过@FeignClient注解来指定服务名称进而绑定服务,然后在通过Spring  MVC中提供的注解来绑定服务提供者的接口,如下:

    //使用feign的客户端注解绑定远程的名称,名称可以是大写,也可以小写
    @FeignClient(value = "springcloud-service-provider")
    public interface HelloService {
        //声明一个方法,这个方法就是远程的服务提供者提供的方法
        @RequestMapping("/provider/hello")
        public String hello();   
    }

    5、使用Controller中调用服务,代码如下

        @Autowired
        private HelloService helloService;
    
        @RequestMapping("/hello")
        public String hello(){
            //调用声明式接口方法,实现对远程服务的调用
            return helloService.hello();
        }

    6、application.yml配置如下

    spring:
      application:
        name: springcloud-service-feign
    server:
      port: 9091
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8700/eureka
        #客户端每隔30秒从Eureka服务上更新一次服务信息
        registry-fetch-interval-seconds: 30
        #需要将我的服务注册到eureka上
        register-with-eureka: true
        #需要检索服务
        fetch-registry: true
      #心跳检测检测与续约时间
      instance:
        #告诉服务端,如果我10s之内没有给你发心跳,就代表我故障了,将我剔除掉,默认90s
        #Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己)
        lease-expiration-duration-in-seconds: 10
        #每隔2s向服务端发送一次心跳,证明自已依然活着,默认30s
        #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则)
        lease-renewal-interval-in-seconds: 2

    7、启动测试,访问地址http://localhost:9091/feign/hello

    三、使用Feign支持的特性

    负载均衡:

        Spring Cloud提供了Ribbon来实现负载均衡,使用Ribbo直接注入一个RestTemplate对象即可, RestTemplate已经做好了负载均衡的配置在Spring Cloud下,使用 Feign也是直接可以实现负载均衡的,定义一个有@FeignClient注解的接口,然后使用@RequestMappin注解到方法上映射远程的REST服务,此方法也是做好负责均衡配置的。

    服务熔断:

    1、在 application.yml文件开启hystrix功能

    #开启hystrix熔断机制
    feign:
      hystrix:
        enabled: true

    2、指定熔断回调逻辑

    @FeignClient(value = "springcloud-service-provider", fallback = MyFallback.class)
    @Component
    public class MyFallback implements HelloService {
        @Override
        public String hello() {
            return "远程服务不可用,暂时采用本地逻辑代替。。。。。";
        }
    }

    3、测试,让服务提供者超时就行了

    如果需要捕获提供者抛出的异常可以用:

    @FeignClient(value = "springcloud-service-provider", fallbackFactory = MyFallbackFactory.class)
    @Component
    public class MyFallbackFactory implements FallbackFactory<HelloService> {
        @Override
        public HelloService create(Throwable throwable) {
    
            return new HelloService() {
                @Override
                public String hello() {
                    return throwable.getMessage();
                }
            };
        }
    }

    详细参考案例源码:https://gitee.com/coding-farmer/springcloud-learn

  • 相关阅读:
    java基础--字符转换Unicode
    java基础---集合框架
    洛谷 P2049 魔术棋子(vector)
    洛谷 P3133 [USACO16JAN]Radio Contact G
    洛谷 P2679 子串
    洛谷 P2549 计算器写作文
    洛谷 P2758 编辑距离
    洛谷 P1481 魔族密码
    洛谷 P1754 球迷购票问题
    洛谷 P2782 友好城市
  • 原文地址:https://www.cnblogs.com/coding-farmer/p/12034706.html
Copyright © 2020-2023  润新知