springboot中使用feign

本文详细介绍了如何使用Feign进行微服务间的调用,包括添加依赖、配置类、接口定义及容错处理等内容,提供了丰富的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近使用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;
    }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值