Spring Cloud Feign调用服务提供者

Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。

在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。

Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。

Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。
 

一、引入坐标

    
        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        

二、Feign接口


/**
 * 商品服务
 */
@FeignClient("goods") //服务名称
public interface GoodsFeign {
    @RequestMapping(value = "goods/save")
    Result save( @RequestBody GoodsReq goodsReq);

    @GetMapping(value = "goods/delete")
    Result deleteById(@RequestParam("goodsId") Long goodsId);

    @GetMapping(value = "goods/queryById")
    Result queryById(@RequestParam("goodsId") Long goodsId);

    @RequestMapping(value = "goods/queryPage")
    Result> queryPage(@RequestBody GoodsQuery query);

}

@FeignClient注解

    name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
    url: url一般用于调试,可以手动指定@FeignClient调用的地址
    decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
    configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
    fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现

三、服务调用者VO层


@RestController
@RequestMapping("order")

public class OrderController {
    @Autowired
    private OrderFeign orderFeign;

    @PostMapping("save")
    public Result save(@RequestBody GoodsOrderReq goodsOrderReq){
        return orderFeign.save(goodsOrderReq);
    }

    @GetMapping(value = "delete")
    public Result deleteById(@RequestParam("goodsOrderId") Long goodsOrderId) {
        return orderFeign.deleteById(goodsOrderId);
    }


    @GetMapping(value = "queryById")
    public Result queryById(@RequestParam("goodsOrderId") Long goodsOrderId) {
        return orderFeign.queryById(goodsOrderId);
    }

}

四、服务提供者接口:

@Api(tags = "订单")
@RestController
@RequestMapping("order")
public class GoodsOrderVO {

    @Autowired
    private GoodsOrderAO goodsOrderAO;

    @ApiOperation("保存用户订单")
    @RequestMapping(value = "save",method = {RequestMethod.POST})
    public Result save(@RequestBody GoodsOrderReq goodsOrderReq) {
        return goodsOrderAO.insertGoodsOrder(goodsOrderReq);
    }

    @ApiOperation("根据ID删除用户订单")
    //@DeleteMapping("delete")
    @RequestMapping(value = "delete",method = {RequestMethod.POST,RequestMethod.GET,RequestMethod.DELETE})
    public Result deleteById(@RequestParam("goodsOrderId") Long goodsOrderId) {
        return goodsOrderAO.deleteById(goodsOrderId);
    }

    @ApiOperation("根据ID查询用户订单")
    //@GetMapping("queryById")
    @RequestMapping(value = "queryById",method = {RequestMethod.POST,RequestMethod.GET})
    public Result queryById(@RequestParam("goodsOrderId") Long goodsOrderId) {
        return goodsOrderAO.queryById(goodsOrderId);
    }

}

五、服务调用者启动类

@EnableFeignClients 添加注解

如果FeignClient接口参数少了@RequestBody或@RequestParam注解会造成调用服务提供者时出现参数为空现象。(当然无论是服务提供者还是调用者都要加上注解)
 

你可能感兴趣的:(Java)