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/spirngcloud-learn

?

原文地址:https://www.cnblogs.com/coding-farmer/p/12034706.html

时间: 2024-10-12 01:33:38

Spring Cloud第七篇 | 声明式服务调用Feign的相关文章

005声明式服务调用Feign

1.POM配置 和普通Spring Boot工程相比,添加了Eureka Client.Feign.Hystrix.Spring Boot Starter Actuator依赖和Spring Cloud依赖管理 <dependencies> <!--Eureka Client依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>sprin

Spring Cloud 声明式服务调用 Feign

一.简介 在上一篇中,我们介绍注册中心Eureka,但是没有服务注册和服务调用,服务注册和服务调用本来应该在上一章就应该给出例子的,但是我觉得还是和Feign一起讲比较好,因为在实际项目中,都是使用声明式调用服务.而不会在客服端和服务端存储2份相同的model和api定义.Feign在RestTemplate的基础上对其封装,由它来帮助我们定义和实现依赖服务接口的定义.Spring Cloud Feign 基于Netflix Feign 实现的,整理Spring Cloud Ribbon 与 S

【第三章】声明式服务调用(Feign)

当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻.那么有没有更好的解决方案呢?答案是确定的有,Netflix已经为我们提供了一个框架:Feign. Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单.Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数.格

干货分享微服务spring-cloud(5.声明式服务调用feign)

Spring cloud feign基于Netflix feign实现,整合了spring cloud ribbon与spring cloud hystrix,除了提供这两者的强大功能之外,它还提供了一种声明式的web服务客户端定义方式 新建spring boot工程并命名为demo-springcloud-feign-consumer,新建启动类FeignApplication,通过@ EnableFeignClients注解来开启spring cloud feign的功能支持 定义YhqSe

Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现

介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移. 服务注册和发现对于微服务架构而言,是非常重要的.有了服务发现和注册,只需要使用服务的标识符就可以访问到服务,而不需要修改服务调用的配置文件.该功能类似于 Dubbo 的注册中心,比如 Zookeeper. Eureka

Spring Cloud(四)服务提供者 Eureka + 服务消费者 Feign

上一篇文章,讲述了如何通过RestTemplate + Ribbon去消费服务,这篇文章主要讲述如何通过Feign去消费服务. Feign简介 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单. 使用Feign,只需要创建一个接口并注解,它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解,Feign支持可插拔的编码器和解码器,Feign默认集成了Ribbon, 并和Eureka结合,默认实现了负载均衡的效果. Feign 具有如下特性: 可插拔的注解支持,

Spring Cloud(十一)声名式服务调用:Feign的使用 (第一部分)

一.写在前边 最近开发任务比较忙,下班也开始锻炼了,这个系列的文章就放了很久,看github我提交的Feign的入门程序已经好久了,今天正好得空,这就更上一贴,准备分几部分写 注意:之前几个项目中,笔者忽略了一个问题,pom文件中如果parent节点下的是spring-cloud-starter-parent而不是spring-boot-starter-parent的话,这样就可以不用写如下代码了 <dependencyManagement> <dependencies> <

申明式服务调用Feign之一:入门示例

新建一个spring-boot工程,取名为feign-consumer,在它的pom文件引入Feign的起步依赖spring-cloud-starter-feign.Eureka的起步依赖spring-cloud-starter-eureka.Web的起步依赖spring-boot-starter-web,pom代码如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w

SpringCloud无废话入门03:Feign声明式服务调用

1.Feign概述 在上一篇的HelloService这个类中,我们有这样一行代码: return restTemplate.getForObject("http://hello-service/hello",String.class); 对于代码有一定洁癖的你来说,一定感觉到了,这个url应该是可以被配置的.既然说到配置,那我们首先想到的就是使用java注解的方式.Feign就是这样一个注解框架,它也是netflix为我们提供的,方便我们整合ribbon和hystrix(后面会学习)