springboot中集成feign实现模块间http接口调用

1.场景还原

     在多模块开发的过程中,为了避免一些重复的“硬代码”的编写,我们可以在A模块中定义一个实现类,然后在B模块中远程调用,这样减少了代码冗余及业务硬代码的重复编写

2.实现方案

这里以笔者项目的订单模块远程调用状态机模块接口为例,仅供参考

①订单模块的pom依赖

<dependency>
   <groupId>io.github.openfeign</groupId>
   <artifactId>feign-core</artifactId>
   <version>9.5.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>

②订单模块中状态机ip的配置conf.yml

fsm:
  url: http://localhost:8072/

③远程url的控件申明

@ConfigurationProperties(prefix = "fsm")
@PropertySource(value = "classpath:conf.yml")
@Component
@Data
public class SelfConf {

    @Value("${url}")
    private String url;

}

④状态机模块定义一个查询订单详情的controller

@RestController
@Slf4j
@RequestMapping("/v1.0/dispatch/fsm")
public class DispatchFsmController {

    @Autowired
    private YiViDispatchOrderMapper yiViDispatchOrderMapper;

    @GetMapping(value = "/feign")
    public YiViDispatchOrder feign(){
        return yiViDispatchOrderMapper.selectByPrimaryKey("10efe91d-8379-11e8-b461-ecebb8d1d4af");
    }}

⑤订单模块实现远程调用的client

首先定义service

public interface DispatchOrderFsmService {

    @Headers({"Content-Type: application/json"})
    @RequestLine("GET /v1.0/dispatch/fsm/feign")
    public YiViDispatchOrder feign();
    
}

然后实现client

@Service
public class DispatchOrderFsmClient {

    @Autowired
    private SelfConf selfConf;

    private DispatchOrderFsmService init()
    {
        return Feign.builder()
                    .decoder(new JacksonDecoder())
                    .encoder(new JacksonEncoder())
                    .target(DispatchOrderFsmService.class, this.selfConf.getUrl());

    }

    public YiViDispatchOrder feign()
    {
        DispatchOrderFsmService orderFsmService = init();
        return orderFsmService.feign();
    }

}

⑥订单模块client的controller

@RestController
@RequestMapping("/v1.0/dispatch/order")
public class DispatchOrderController {

    @Autowired
    private DispatchOrderFsmClient dispatchOrderFsmClient;

    //测试
    @RequestMapping(value = "/feign", method = RequestMethod.GET)
    @ResponseBody
    public YiViDispatchOrder feign() throws Exception {

        return  dispatchOrderFsmClient.feign();
    }}

3.测试用例

①状态机模块订单详情接口的访问


②订单模块client的访问


这样通过访问订单模块的接口间接访问到了状态机模块接口;

好了,我是张星,欢迎加入博主技术交流群,群号:526601468

猜你喜欢

转载自blog.csdn.net/zhangxing52077/article/details/81027326