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