SpringCloud之Feign代理,声明式服务调用方式

目录
  • 引入相关依赖然后再主入口启用注解
  • 引入相关依赖然后再主入口启用注解:@Enabl
  • Feign配合Ribbon、Hystrix的超时策略配置如下
    • 1.pom
    • 2.主入口
    • 3.配置文件
    • 4.业务代码与实现
    • 5.controller测试

将其他微服务中的服务接口,用feign在本项目中进行调用。

Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定。它具备可插拔的注解支持,包括Feign注解、JAX-RS注解。它也支持可插拔的编码器和解码器。Spring Cloud Feign还扩展了对Spring MVC注解的支持,同时还整合了Ribbon和Hystrix来提供均衡负载的HTTP客户端实现。

对于Feign来讲,其实就是一个WEB接口而已,它内部自集成了Spring Ribbon 和Spring Hystrix 断路器功能,也就是说可以支持自动降级和负载均衡功能。可以说,在内部服务与服务之间的相互数据通信桥梁就是通过Feign来实现的。也就是说,我们可以像使用web service OR dubbo 一样对其进行声明式的配置,这非常棒~ 在我之前的工作中,就大量的使用了Feign代理,可以说使用spring cloud 就必须要学会如何深入使用Feign代理,当然它也非常的简单。

引入相关依赖然后再主入口启用注解

@EnableFeignClients    //启用代理服务
@EnableCircuitBreaker  //启用断路器

引入相关依赖然后再主入口启用注解:@Enabl

注意:我们feign在第四个版本后需要手工的开启断路器功能才可以生效。

了解完Feign的基础配置之后,我们当然要开始代码实现了。首先我们需要编写一个interface,并且这个interface一定是已知的服务(也就是注册到了Eureka上的接口服务,我们在这里需要使用interface的方式进行声明)

@FeignClient注解就是Feign的注解声明了,里面name属性表示了当前代理的服务APP NAME; fallback属性当然就是我们调用服务失败的降级策略了,也就是当网络闪段、异常等调用代理服务失败时,会根据断路器的超时时间降级到指定的fallback所赋予的HelloServiceHystrix类中,我们可以进行降级处理。

我们的Feign底层默认提供了重试机制,也就是底层使用Retryer类对调用服务进行重试调用操作,通过底层代码我们知道默认是每100ms去进行调用,调用次数是5次。既然Feign集成了Ribbon 与 Hystrix ,那么必然会使用两个超时机制,一个是Ribbon的超时时间,一个是Hystrix的超时时间.这两个超时时间的含义截然不同,千万要注意配置。

经验小结: 我们可以配置Hystrix的超时时间大于Ribbon的超时时间。并且如果想进行重试最好是Hystrix的超时时间设置为Ribbon的超时时间的倍数。

这样我们可以进行重试策略,如果Hystrix的超时时间小于Ribbon的超时时间,则不会重试,直接被断路器组件对调用请求执行请求段熔机制,服务降级。

Feign配合Ribbon、Hystrix的超时策略配置如下

1.pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>com.zx.dt2b.erp</artifactId>
        <groupId>com.zx.dt2b.erp</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
 
    <artifactId>feign</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <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-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
    </dependencies>
 
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <!-- <version>Dalston.SR5</version>  -->
                <version>Edgware.SR4</version>
                <!-- <version>Finchley.SR1</version>  -->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement> 
 
    <build>
        <finalName>feign</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.zx.dt2b.FeignApplication</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
 
</project>

2.主入口

package com.zx.dt2b; 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
 
@EnableFeignClients        //启用代理服务
@EnableCircuitBreaker    //启用断路器
@EnableDiscoveryClient    //标识具体的一个服务,需要向注册中心注册
@SpringBootApplication    //SpringBoot 核心配置
public class FeignApplication {
 
    public static void main(String[] args) { 
        SpringApplication.run(FeignApplication.class, args);
    } 
}

3.配置文件

feign:
  hystrix:
    enabled: true  #开启降级
  compression:
    request:
      min-request-size: 2048
      mime-types:
        - text/html, application/xml, application/json
spring:
  application:
    name: feign-consumer
  cloud:
    loadbalancer:
      retry:
        enabled: true
 
server:
  context-path: /
  port: 7005
 
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:8001/eureka
 
feign:
  hystrix:
    enabled: true
  compression:
    request:
      min-request-size: 2048
      mime-types:
        - text/html, application/xml, application/json
 
##设置断路器的超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 10000
 
##微服务的请求配置
customer-service:
  ConnectTimeout: 10000
  ReadTimeout: 3000
  ribbon:
    OkToRetryOnAllOperations: true ##对所有的请求都进行重试
    MaxAutoRetriesNextServer: 1 ##切换实例的次数
    MaxAutoRetries: 2    ##对当前实例重试的次数

4.业务代码与实现

@FeignClient(name="provider-service", fallback= IndexFeignFailback.class)

name表示微服务名称:前端直接从本项目访问其他项目服务接口

失败后IndexFeignFailback中对应的接口,进行降级。

代理服务中异常等要保持一致

package com.zx.dt2b.feign; 
import com.zx.dt2b.feign.hystrix.IndexFeignFailback;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
@FeignClient(name="customer-service", fallback= IndexFeignFailback.class)
public interface IndexFeignClient {
 
    @RequestMapping(value="/customerservice/index", method = {RequestMethod.GET})
    public String hello() throws Exception;
 
    @RequestMapping(value="/customerservice/hi", method = {RequestMethod.GET})
    public String hi() throws InterruptedException;
}
package com.zx.dt2b.feign.hystrix; 
import com.zx.dt2b.feign.IndexFeignClient;
import org.springframework.stereotype.Component;
 
@Component
public class IndexFeignFailback implements IndexFeignClient {
 
    @Override
    public String hello() throws Exception {
        return "-----hello接口的降级方法!--------";
    }
 
    @Override
    public String hi() throws InterruptedException {
        return "-----hi接口的降级方法!--------";
    } 
}

5.controller测试

package com.zx.dt2b.api; 
import com.zx.dt2b.feign.IndexFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class ConsumerController {
 
    @Autowired
    private IndexFeignClient indexFeignClient;
 
    @RequestMapping(value="/feign-hello")
    public String hello() throws Exception {
        return indexFeignClient.hello();
    }
 
    @RequestMapping(value="/feign-hi")
    public String hi() throws InterruptedException {
        return indexFeignClient.hi();
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringCloud实战之Feign声明式服务调用

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

  • Spring Cloud 系列之服务调用 OpenFeign的实现

    1.1 简介 1.1.1 概述   Feign 旨在使编写 Java Http 客户端变得更容易.在使用 Ribbon + RestTemplate 时,利用 RestTemplate 对 http 请求的封装处理,形成了一套模版化的调用方法.但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用.所以,Feign 在 Ribbon 基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义.在

  • spring cloud 之 Feign 使用HTTP请求远程服务的实现方法

    一.Feign 简介 在spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Apache的Http Client.Netty的异步HTTP Client, Spring的RestTemplate.但是,用起来最方便.最优雅的还是要属Feign了. Feign是一种声明式.模板化的HTTP客户端.在Spring Cloud中使用Feign, 我们可以做到使用

  • SpringCloud之Feign代理,声明式服务调用方式

    目录 引入相关依赖然后再主入口启用注解 引入相关依赖然后再主入口启用注解:@Enabl Feign配合Ribbon.Hystrix的超时策略配置如下 1.pom 2.主入口 3.配置文件 4.业务代码与实现 5.controller测试 将其他微服务中的服务接口,用feign在本项目中进行调用. Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端.它使得编写Web服务客户端变得更加简单.我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口

  • SpringCloud超详细讲解Feign声明式服务调用

    目录 入门案例 @FeignClient注解详解 Feign Client的配置 Feign请求添加headers 负载均衡 (Ribbon) 容错机制 Hystrix支持 Sentinel支持 Feign开启容错机制支持后的使用方式 请求压缩feign.compression 日志级别 入门案例 在服务消费者导入依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>

  • SpringCloud学习笔记之OpenFeign进行服务调用

    目录 前言 1.OpenFeign 1.1.OpenFeign概述 1.2.OpenFeign的使用步骤 1.3.超时控制 1.3.1.是什么? 1.3.2.修改代码设置超时错误 1.3.3.进行超时配置 1.4.日志打印 1.4.1.是什么? 1.4.2.日志级别 1.4.3.如何开启日志打印 总结 前言 Feign是一个声明式的Web服务客户端,是面向接口编程的.也就是说使用Feign,只需要创建一个接口并使用注解方式配置它,就可以完成对微服务提供方的接口绑定. 在使用RestTemplat

  • SpringBoot 注解事务声明式事务的方式

    springboot 对新人来说可能上手比springmvc要快,但是对于各位从springmvc转战到springboot的话,有些地方还需要适应下,尤其是xml配置.我个人是比较喜欢注解➕xml是因为看着方便,查找方便,清晰明了.但是xml完全可以使用注解代替,今天就扒一扒springboot中事务使用注解的玩法. springboot的事务也主要分为两大类,一是xml声明式事务,二是注解事务,注解事务也可以实现类似声明式事务的方法,关于注解声明式事务,目前网上搜索不到合适的资料,所以在这里

  • java使用Feign实现声明式Restful风格调用

    一.Feign简介 Feign是netflix开发的声明式.模板化的http客户端,在使用时就像调用本地(服务消费者自己)的方法一般,帮助我们更加优雅的调用服务提供者的API.Feign自身支持springMVC,还整合了Eureka.Ribbon,极大的简化了Feign的使用.就整合Euraka而言,只需和普通的服务配置Eureka server的信息即可.整合Ribbon,就意味着不再需要通过标注@LoadBalanced的实例化后的RestTemplate去调用服务提供者方法了.Feign

  • springcloud feign 接口指定接口服务ip方式

    目录 feign接口指定接口服务ip 场景 调用Feign接口时指定ip 只指定服务名 指定ip feign接口指定接口服务ip 场景 现在有2个服务,在eureka注册的服务名称一样,但是对外的接口不一样.其中有一方不允许合并代码,只能把另一个调用指定一下具体的服务地址 @FeignClient(name = "服务名称",url = "${url}",fallback = ServiceHystrix.class) public interface Servic

  • springcloud feign 接口指定接口服务ip方式

    目录 feign接口指定接口服务ip 场景 调用feign接口时指定ip 只指定服务名 指定ip feign接口指定接口服务ip 场景 现在有2个服务,在eureka注册的服务名称一样,但是对外的接口不一样.其中有一方不允许合并代码,只能把另一个调用指定一下具体的服务地址 @FeignClient(name = "服务名称",url = "${url}",fallback = ServiceHystrix.class) public interface Servic

  • springcloud中Ribbon和RestTemplate实现服务调用与负载均衡

    文件目录结构 文件目录结构很重要,特别注意的是rule文件要放在主启动类上一级位置,才能够扫描. 写pom <dependencies> <!--springboot 2.2.2--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependenc

  • Springboot 内部服务调用方式

    目录 Eureka注册的服务之间互相调用 1.请求方 2.接收方 多模块化,服务间调用的坑 问题背景 解决办法 Eureka注册的服务之间互相调用 1.请求方 启动类添加注解,扫描Eureka 中的全部服务 @SpringBootApplication @EnableEurekaClient @EnableFeignClients public class LoginServiceApplication {         public static void main(String[] arg

随机推荐