Feign能干什么

feign旨在使编写JavaHttp客户端变得更容易,以前在使用 Ribbon+ RestTemplate, RestTemplatehttp,时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发 中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装 这些依赖服务的调用。所以, Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在 Feign的实现下 ,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上Mapper面标注注解现在是一个微服务接口上面标注一个 Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用 Spring cloud Ribbon时,自动封装服务调用客户端的开发量。

Feign集成了 Ribbon

利用 Ribbon维护了Payment的服务列表信息并且通过轮询实现了客户端的负载均衡。而与 Ribbon不同的是,通过 feign只需要定义 服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

使用

一、 maven配置

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

二、 主启动类

# 配置上要扫描的包名
@EnableFeignClients(basePackages = "devutil.api.auth.service")

三、 配置类

@SpringBootConfiguration
public class FeignConfig {
    @Bean
    public Decoder feignDecoder() {
        return new ResponseEntityDecoder(new SpringDecoder(feignHttpMessageConverter()));
    }

    public ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {
        final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(new GateWayMappingJackson2HttpMessageConverter());
        return new ObjectFactory<HttpMessageConverters>() {
            @Override
            public HttpMessageConverters getObject() throws BeansException {
                return httpMessageConverters;
            }
        };
    }

    public class GateWayMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
        GateWayMappingJackson2HttpMessageConverter() {
            List<MediaType> mediaTypes = new ArrayList<>();
            mediaTypes.add(MediaType.valueOf(MediaType.TEXT_HTML_VALUE + ";charset=UTF-8"));
            setSupportedMediaTypes(mediaTypes);
        }
    }
}

四、 业务类

@FeignClient(value = "devutil-provider-auth", contextId = "api-auth-auth") 
public interface AuthService {
    @PostMapping("/login")
    public Info login(@RequestParam(value = "u") String casId,
                      @RequestParam(value = "p") String password,
                      @RequestParam(value = "k", required = false) String k);

    @PostMapping("/refresh")
    public Info refresh(@RequestParam(value = "refresh_token") String refreshToken,
                        @RequestParam(value = "k", required = false) String k);

    @PostMapping("/validate")
    public Info validate(@RequestParam("token") String token);

}

注意点

(1) 每一个param都需要在@RequestParam里指定value

(2) 若一个项目里@FeignClient里的value相同,需要指定不同的contextId来区分

(3) 要在主启动类上添加@EnableFeignClients注解

五、 在yml里设置超时时间

# 同ribbon
ribbon:
  ReadTimeout: 5000
  ConnectTimeout: 5000  #5s

hhhhh