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
Comments | 0 条评论