springcloud feignclient,spring cloud 怎么通过feign调用服务_1

  springcloud feignclient,spring cloud 怎么通过feign调用服务

  00-1010引入依赖关系,然后在主门户启用注释。引入依赖,然后在主门户启用注释:@Enablfeign。Ribbon和Hystrix的超时策略配置如下:1.pom2. Main portal 3。配置文件4。业务代码和实现5 .控制器测试。使用Feign调用本项目中其他微服务的服务接口。

  CloudFeign是一组基于网飞Feign的声明式服务调用客户端。这使得编写Web服务客户端变得更加容易。我们只需要创建一个接口,并用注释对其进行配置,就可以完成Web服务接口的绑定。它有可插入的注释支持,包括佯注释和JAX-RS注释。它还支持可插拔编码器和解码器。CloudFeign还扩展了对Spring MVC注释的支持,并集成了Ribbon和Hystrix来提供负载均衡的HTTP客户端实现。

  Feign其实只是一个WEB接口,集成了Spring Ribbon和Spring Hystrix断路器的功能,也就是说可以支持自动降级和负载均衡。可以说,内部服务之间的相互数据通信桥梁是通过Feign实现的。也就是说,我们可以像使用web service或dubbo一样声明式地配置它,这很棒~在我之前的工作中,广泛使用了Feign proxy。可以说,在使用spring cloud的时候,一定要深入学习如何使用Feign proxy,当然也很简单。

  

目录

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

 

  

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

 

  注意:feign第四版之后,我们需要手动打开断路器功能才能生效。

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

  @FeignClient批注是Feign批注声明,其中name属性表示当前代理的服务APP名称;回退属性当然是我们对于调用服务失败的降级策略,也就是当代理服务由于网络闪断、异常等原因调用失败时。就会降级到fallback给定的指定HelloServiceHystrix类,我们可以降级。

  我们的Feign底层默认提供了重试机制,即底层使用Retryer类来重试调用服务。通过底层代码,我们知道默认是每100ms调用一次,调用次数是5次。由于Feign集成了Ribbon和Hystrix,必然会使用两种超时机制,一种是Ribbon的超时,另一种是Hystrix的超时。这两种超时意义完全不同,一定要注意配置。

  经验小结:可以将Hystrix的超时时间配置为大于Ribbon的超时时间。而如果要重试,最好将Hystrix的超时设置为Ribbon超时的倍数。

  这样,我们就可以执行重试策略。如果Hystrix的超时小于Ribbon的超时,则不进行重试,断路器组件将直接对呼叫请求执行请求段融化机制,服务将降级。

  

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

 

  

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

?xml版本=1.0 编码=UTF-8 ?项目xmlns= http://maven . Apache . org/POM/4 . 0 . 0 xmlns : xsi= http://www . w3 . org/2001/XML schema-instance xsi : schema location= http://maven . Apache . org/POM/4 . 0 . 0 http://maven.apache.org/xsd/maven-4.0.0.xsd父级artifactIdcom.zx.dt2b.erp/artifactId groupid com . z

 

  x.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/jsonspring:  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; @Componentpublic 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; @RestControllerpublic 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();    }}

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

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: