Spring Cloud快速开发入门第七篇---声明式服务调用Feign

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

  1. Spring Cloud快速开发入门第一篇---SpringCloud前言及其常用组件介绍概览
  2. Spring Cloud快速开发入门第二篇---使用并认识Eureka注册中心
  3. Spring Cloud快速开发入门第三篇---搭建高可用Eureka注册中心
  4. Spring Cloud快速开发入门第四篇---客户端负载均衡Ribbon
  5. Spring Cloud快速开发入门第五篇---服务熔断Hystrix
  6. Spring Cloud快速开发入门第六篇---Hystrix仪表盘监控

一、Feign是什么

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

二、使用Feign实现消费者

2-1、创建消费者命名为(springcloud-service-feign

2-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>

2-3、添加注解

@EnableFeignClients

2-4、声明服务

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

//使用feign的客户端注解绑定远程的名称,名称可以是大写,也可以小写
@FeignClient(value = "springcloud-service-provider")
public interface HelloService {

    //声明一个方法,这个方法就是远程的服务提供者提供的方法
    @RequestMapping("/provider/hello")
    public String hello();
    
}

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

  @Autowired
    private HelloService helloService;

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

2-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

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

三、使用Feign支持的特性

负载均衡:

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

服务熔断:

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

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

3-2、指定熔断回调逻辑

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

3-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();
            }
        };
    }
}

详细参考案例源码。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值