最近使用feign大概记录下使用过程
1.添加依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>9.7.0</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-slf4j</artifactId>
<version>9.5.0</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-hystrix</artifactId>
<version>9.5.0</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-jackson</artifactId>
<version>9.5.0</version>
</dependency>
2.添加配置类
@Configuration
public class WebApiConfig {
/**
* gps服务地址
*/
@Value("${application.gpsWebApi.url}")
private String gpsWebApiUrl;
//@Autowired
//private GpsWebApiServiceFallback gpsWebApiServiceFallback; 接口调用失败的容错实现类
@Bean
GpsWebApiService gpsClient() throws Exception {
return HystrixFeign.builder()
.decoder(new JacksonDecoder())
.encoder(new JacksonEncoder())
.setterFactory((target, method) ->
//new SetterFactory.Default().create(target,method).andThreadPoolPropertiesDefaults(Setter().withCoreSize(30)). 可以设置大小
new SetterFactory.Default().create(target, method).
andCommandPropertiesDefaults(HystrixCommandProperties.defaultSetter().
withExecutionTimeoutInMilliseconds(1000*60)))
.target(GpsWebApiService.class, gpsWebApiUrl);
//.target(GpsWebApiService.class, gpsWebApiUrl, gpsWebApiServiceFallback);可以添加接口访问失败的容错机制
}
}
@Component
public class GpsWebApiServiceFallback implements FallbackFactory<GpsWebApiService> {
private Logger logger = LoggerFactory.getLogger(GpsWebApiServiceFallback.class);
@Override
public GpsWebApiService create(Throwable throwable) {
logger.error("GpsWebApiServiceFallback.throwable is error", throwable);
return new GpsWebApiService() {
@Override
public ResultVo<String> setBusiness(int terminalType, String terminalId, GpsBusinessDto gpsBusinessDto) {
ResultVo<String> resultVo = new ResultVo<>();
resultVo.resultFail("失败");
logger.error("GpsWebApiServiceFallback.setBusiness terminalType:" + terminalType + ";terminal:" + terminalId + ";gpsBusinessDto" + FastJsonUtils.toJSONString(gpsBusinessDto));
return resultVo;
}
}
1.当然使用HystrixFeign默认处理线程池中核心线程数数是10,默认最大的队列是100,具体根据业务去处理,可在andThreadPoolPropertiesDefaults(Setter().withCoreSize(30))设置核心线程数,最大线程数以及最大队列大小
2.可添加服务调用失败的一些容错降级处理 ,在target(GpsWebApiService.class, gpsWebApiUrl, gpsWebApiServiceFallback),
自定义的GpsWebApiServiceFallback需要实现 FallbackFactory <T>,T就是接口类,然后实现调用接口失败的一些容错
源码;
static HystrixThreadPoolProperties.Setter getUnitTestPropertiesBuilder() {
return (new HystrixThreadPoolProperties.Setter()).withCoreSize(10).withKeepAliveTimeMinutes(1).withMaxQueueSize(100).withQueueSizeRejectionThreshold(10).withMetricsRollingStatisticalWindowInMilliseconds(10000).withMetricsRollingStatisticalWindowBuckets(10);
}
3.创建接口 get和post请求都有,单个参数和多个参数都有,但是在多个参数中@reqeustBody只能有一个
public interface GpsWebApiService {
/*
*
* @param terminalId
* @param gpsBusinessDto
* @return
*/
@Headers({"Content-Type: application/json;charset=utf-8", "Accept: application/json;charset=utf-8"})
@RequestLine("POST /setBusiness?terminalId={terminalId}")
ResultVo<String> setBusiness(@Param("terminalId") String terminalId, @RequestBody GpsBusinessDto gpsBusinessDto);
/*
*
* @param terminalId
* @return
*/
@RequestLine("POST /readBusiness?terminalId={terminalId}")
ResultVo<GpsBusinessDto> readBusiness(@Param("terminalId") String terminalId);
/*
*
* @param terminalId
* @param terminalParamsInfoDto
* @return
*/
@Headers({"Content-Type: application/json;charset=utf-8", "Accept: application/json;charset=utf-8"})
@RequestLine("POST /setTerminalArgs?terminalId={terminalId}")
ResultVo<String> setTerminalArgs(@Param("terminalId") String terminalId, @RequestBody TerminalParamsInfoDto terminalParamsInfoDto);
/*
*
* @param terminalId
* @return
*/
@RequestLine("POST /readTerminalArgs?terminalId={terminalId}")
ResultVo<TerminalParamsInfoDto> readTerminalArgs(@Param("terminalId") String terminalId);
/*//一般的get请求使用url参数清洁
@RequestLine("GET /hello?arg={arg}")
ResultVo<String> getHello(@Param("arg") String arg);
//get请求中使用restful,调用对应的服务也要用restful风格接受
@RequestLine("GET /hello/{arg}")
ResultVo<String> getHelloWorld(@Param("arg") String arg);*/
}
5.对应外部api接口
@RestController
@RequestMapping(value = "/gps")
@CrossOrigin
@Api(value = "GpsController", description = "xxxx")
public class GpsController {
@ApiOperation(value = "xxxxx")
@PostMapping("/setBusiness")
public SyncBean<String> setBusiness(@RequestParam(value = "terminalId") @ApiParam(value = "xxx, required = true) String terminalId,
@RequestBody @ApiParam(value = "xxx", required = true) BusinessBean businessData) {
SyncBean<String> result = null;
try {
result = gpsWebApi.setBusinessData(terminalId, businessData);
} catch (Exception e) {
}
return result;
}
@ApiOperation(value = "xxx")
@PostMapping("/readBusiness")
public SyncBean<BusinessBean> readBusiness(@RequestParam(value = "terminalId")
@ApiParam(value = "xxxx", required = true) String terminalId) {
SyncBean<BusinessBean> syncBean = null;
try {
GpsWebApi gpsWebApi = new GpsWebApi();
syncBean = gpsWebApi.readBusiness(terminalId);
} catch (Exception e) {
}
return syncBean;
}
}