springcloud-OpenFeign在实际工作使用场景

OpenFeign在实际工作使用场景

本来在实际工作接触微服务项目使用到openfeign,不同的项目可能有不同的使用方式,下面是3种常见的使用场景

使用场景1:在各自的微服务定义Client

在各自的微服务定义Client,什么意思呢?
比如说目前有3个微服务,A,B服务是消费者,C服务是生产者。A和B都要去调用C的 interface1 接口,于是各自在自己项目里创建一个Client类,来达到目的。
1. 好处:各服务的开发人员的耦合性降低,不需要去管其他微服务是否也调用interface1 接口
2. 坏处:代码出现冗余
大致的Client类代码如下:

@FeignClient("cloud-payment-service")
@Component
public interface PaymentClient {
    @GetMapping("/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Long id);
}

使用场景2:在common模块定义Client

在common模块定义Client,恰好是解决代码出现冗余的情况,其他微服务只需要引入common模块就可以,达到共用Client的目的,大致代码如下:

@Component
@FeignClient("cloud-payment-service")
public interface PaymentApi {
    @GetMapping("/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Long id);
}

生产者服务接口:

@RestController
@Slf4j
public class PaymentController {

    private DiscoveryClient discoveryClient;//获取注册中心上面的多个服务信息

    @GetMapping("/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Long id) {
        ....
    }
}

和场景1的不同点在于所属模块的位置不一样而已,这种比较好点。

使用场景3:在common模块定义ClientApi,然后消费者继承ClientAPi,生产者服务实现ClientAPi

话不多说,直接上代码完事了:

  1. common模块定义ClientApi:
@RequestMapping("/storage/historyData")
public interface HistoryDataApi {
    @PostMapping("/listHistoryDatas")
    List<HistoryDataDTO> listHistoryDatas(@RequestBody HistoryDataSearch historyDataSearch);
}
  1. 生产者服务去实现该接口:
@RestController
public class HistoryDataController implements HistoryDataApi {

    @Autowired
    private IHistoryDataService iHistoryDataService;

    @Override
    public List<HistoryDataDTO> listHistoryDatas(HistoryDataSearch historyDataSearch) {
        return iHistoryDataService.listHistoryDatas(historyDataSearch);
    }
}
  1. 消费者服务创建Client接口去继承ClientApi:
@FeignClient("cloud-payment-service")
public interface HistoryDataClient extends HistoryDataApi {
}

总结

具体3种使用情况,看个人项目的情况决定,这种东西说不准的

posted @ 2022-03-31 13:22  爱编程DE文兄  阅读(221)  评论(0编辑  收藏  举报