Springboot-微服务-微服务组件之服务管理-优雅的调用服务-feign

Springboot-微服务-微服务组件之服务管理-优雅的调用服务-Feign

简介

Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。

快速入门

重要点

引入feign相关依赖

在Springboot启动类上,开始@EnableFeignClients

编写一个Fegin接口

注入Fegin接口相关类,调用接口。

引入feign相关依赖

       <!--引入feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>

在Springboot启动类上,开启@EnableFeignClients 注解

package com.caicai;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
//@EnableDiscoveryClient//开启eureka服务端的调用
//@SpringBootApplication
//@EnableCircuitBreaker //添加Hystrix
//@EnableHystrix
@EnableFeignClients //添加feign启动注解
@SpringCloudApplication // 一个标准的eureka标准的客户端都需要配置以上三个注解,所以Spring 提供一个新的注解SpringCloudApplication包含的以上三个注解
public class ConsumerServiceApplication {
    //Spring boot 调用的接口都是rest风格的接口,这里我们使用,Spring 自带的resTemplate 去调用,它包含了:http,post 等等

//    @Bean
//    @LoadBalanced//开启负载均衡注解
//    public RestTemplate restTemplate(){
//
//        return new RestTemplate();
//    }
    public static void main(String[] args) {
        SpringApplication.run(ConsumerServiceApplication.class);
    }
}



编写一个Fegin接口

为什么要编写这个接口?

因为fegin 要靠这个接口,知道接口请求路径,服务地址,以及参数

package com.caicai.Consumer.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("user-service")
public interface UserClient {

    @GetMapping("user/{id}")
    String queryById(@PathVariable("id") Long id);
}


注入Fegin接口相关类,调用接口。


    @Autowired
    UserClient userClient;
//    @HystrixCommand
    @GetMapping("{id}")
    public String queryById(@PathVariable("id") Long id)
    {


        return userClient.queryById(id);

    }

问题

调用服务,失败!

Springboot-微服务-微服务组件之服务管理-优雅的调用服务-feign

Request processing failed; nested exception is feign.RetryableException: Read timed out executing GET
java.net.SocketTimeoutException: Read timed out

解析

当访问微服务的响应时间超过5秒,就会出现 :

Read timed out executing with root cause

后面查阅很多资料,发现是ribbon的配置问问题

详细说明

  • ribbon.ConnectTimeout:请求连接的超时时间 默认1S

  • ribbon.ReadTimeout:请求处理的超时时间 默认1S

  • ribbon.OkToRetryOnAllOperations:对所有操作请求都进行重试

  • ribbon.MaxAutoRetriesNextServer:切换实例的重试次数

  • ribbon.MaxAutoRetries:对当前实例的重试次数

解决这个问题,我们只需在yml配置文件中添加ribbon的ConnectTimeout、ReadTimeout ,这两个时间长一点,即可解决sockt 超时问题**



ribbon:
  ReadTimeout: 60000
  ConnectTimeout: 60000

上一篇:Feign接口传递Date参数,接收时前后 差14小时(Feign传时间遇到的坑,注意事项。)


下一篇:ST7920驱动的LCD12864实现单行反白显示