spring cloud feign

阅读数:220 评论数:0

跳转到新版页面

分类

python/Java

正文

一、JAVA项目中网络接口调用工具

1、HttpClient

它是Apache Jakarta Common下的子项目,用来提供高效、最新的、功能丰富的支持Http协议的客户端编程工具包。

HttpClient相比传统JDK自带的URLConnection,提升了易用性和灵活性。

2、OkHttp

一个处理网络请求的开源项目,是Android中常用的框架,由Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient。OkHttp拥有简洁的API。

3、HttpURLConnection

是Java的标准类,继承自URLConnection,使用复杂。

4、RestTemplate

是Spring提供的用于访问Rest服务的客户端。

而Feign是一个声明式的REST客户端,我们只需要像调用本地方法一样调用它就可以完成请求。

Feign是Netfix公司写的,OpenFeign是SpringCloud自己研发的,在Feign的基础上支持Spring MVC的注解,它可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式实现负载均衡并调用远程服务。

二、在Spring Cloud中集成Feign

1、加入feign的依赖

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

在启动类上加@EnableFeignClients注解,如果你的Feign接口定义跟你的启动类不在同一个包名下,还需要制定扫描的包名。@EnableFeignClients(basePackages="com.cuihs.api.client")

如果报错误

No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?

原因是因为Spring Cloud Feign在Hoxton.M2 版本之后,不再使用ribbon,而使用spring-cloud-loadbalancer,所以我们还需要引入spring-cloud-loadbalancer。

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>
// 同时naocs也要的排除ribbon
 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2、使用feign调用接口

    @FeignClient(value = "eureka-client-user-service")
    public interface UserRemoteClient {
        @GetMapping("/user/hello")
        String hello();
    }

@FeignClient这个注解标识当前是一个Feign的客户端,value属性是对应的服务名称,也就是你需要调用如个服务的接口。

    @Autowired
    private UserRemoteClient userRemoteClient;
    @GetMapping("/callHello")
    public String callHello() {
        String result = userRemoteClient.hello();
        System.out.println("调用结果:" + result);
        return result;
    }

三、feign client超时时间配置

影响到feign接口超时时间的主要有三类配置:feign\ribbon、hystrix和OkHttp(若配置)。

默认情况下,连接超时为10秒,读取超时为60秒。

1、feign配置

(1)全局配置,配置在application.yml

feign:
    client:
        config:
            default:  // 所有服务级别设置,default为任意服务
                connectTimeout: 毫秒时间,建立连接的超时时间,一般只在发现服务时用到
                readTimeout: 毫秒时间 ,接口请求的超时时间
            remote-server-name: // contextId属性,指定调用remote-server-name服务时的超时时间
                connectTimeout: 200
                readTimeout: 3000

(2)针对客户端设置

feign:
  client:
    config:
      FooClient:
        connectTimeout: 10000
        readTimeout: 20000

(3)针对单个方法

@PostMapping("/test")
void test(@RequestParam Long id, Request.Options options);
// 调用时设置
Request.Options options = new Request.Options(5L,TimeUnit.SECONDS, 60L, TimeUnit.SECONDS, true);
feignClient.test(1L, options);

2、ribbon配置

ribbon:
    ReadTimeout: 毫秒时间, 同feign的
    ConnectTimeout:毫秒时间 , 同feign的

feign和ribbon的配置二选一即可,不同点在于feign的配置在ribbon的基础上做了扩展。

ribbon和feign都有全局配置和局部配置,优先级为:

feign局部配置》feign全局配置》ribbon局部配置》ribbon全局配置.

3、hystrix配置

hystrix:
  command:
    default:  #这个代表接口,default为任意接口, 可以配置为指定接口
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 毫秒时间

hystrix配置也分为全局和局部,只需要替换default为指定服务名即为局部配置。

hystrix配置的超时时间正常应该比feign和ribbon的要大,因为feign和ribbon可以配置失败重试。最终的超时时间是以feign(或ribbon)和hystrix中最小时间为准。

四、@FeignClient注解

该注解常用属性如下:

(1)value/name

指定提供者的微服务名称。

(2)url

直接指定请求的路径地址。

(3)fallback

指定发送异常调用或者超时应该调用哪个类来执行备方法。

(4)path

当服务提供者使用了server.context.path时。

(5)contextId

用于唯一标识当一个微服中存在多个FeignClient接口调用同一个服务提供者的场景。

五、spring通过@Autowired找不到feign接口

1、没有使用@EnableFeignClients进行扫描。

2、默认扫描路径扫描不到feign接口。

通过@EnableFeignClients进行扫描时,如果没有添加basePackages属性,默认扫描的是当前启动类所在的包及其子包路径,而使用的feign接口可能不在此路径下。

3、feign接口编写存在问题

可能feign接口定义的方法中,没有添加@RequestMapping等注解。

六、hystrix熔断问题

1、load balancer does not have available server

当服务的全部实例都不可用时,如果持续异常,会出发熔断,断路器开始工作,报

java.lang.RuntimeException: Hystrix circuit short-circuited and is OPEN

需要注意的是,熔断期间,即使服务恢复了健康状态也不会立即被调用,断路器每隔一段时间会放行一个请求,如果成功,才会停止熔断,恢复正常调用。

2、禁用hystrix

(1)完全禁用hystrix

//配置yml文件
feign.hystrix.enabled=false

(2)部分禁用hystrix


    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Scope;
     
    import feign.Feign;
    import feign.Retryer;
     
    //此配置类为了关闭特定Feign客户端的Hystrix支持
    //注意:不要和服务启动类放在同一目录或子级目录下
    @Configuration
    public class FeignNoHystrixConfigure {
     
     
        @Bean
        @Scope("prototype")
        public Feign.Builder feignBuilder(Retryer retryer) {
            return Feign.builder();
        }
     
    }

    import org.springframework.cloud.netflix.feign.FeignClient;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
     
    import com.mimaxueyuan.config.FeignNoHystrixConfigure;
     
    //关闭Hystrix(会导致所有的mima-cloud-producer都关闭,不管其它配置是否开启也会关闭,这是个坑要注意下)
    @FeignClient(value="mima-cloud-producer",configuration=FeignNoHystrixConfigure.class)
    public interface TestClient4 {
     
        @RequestMapping(value="/get/{id}",method=RequestMethod.GET)
        public String get(@PathVariable("id") String id);
     
    }




相关推荐

在网络请求时,可能会出现异常请求,如果还想在异常情况下使系统可用,那么就需要容错处理。 Spring Cloud Feigh就是通过Fallback实现的,有两种方式: <

ZuulProxyAutoConfiguration 首先我们看一下zuul的配置类ZuulProxyAutoConfiguration, 这个类有一项工作是初始化Zuul默认

Tomcat Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能有很大关系的。Tomcat默认的HTTP实现是采用阻塞式的Socket通信,每个请求都需要创

Eureka Server在运行期间会去统计心跳失败比例在15分钟之内是否低于85%,如果低于85

mvn依赖 &lt;dependency&gt; &lt;groupId

什么是jwt (json web token)jwt是一生中用来在网络上声明某种身份的令牌(TOKEN),它的特点是紧凑且自包含并且基于JSON,通过一些常用的算法对包含的主体

Hystrix Dashboard是作为断路器状态的一个组件,提供了数据监控和友好的图表化界面。 修改service-hi 1、在pom工程文件引入相应的依赖</

简介 Spring cloud Sleuth主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持zipkin,你只需要在pom文件中引入相应的依赖即可。 1、

简介 在spring cloud中,有分布式配置中心组件spring cloud config,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程git仓库中,在该组

一、概述 spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign. 二、ribbon ribbon是一个负载均衡客户端,主要功能是负载均衡,负责从