根據配置文件來切換不同服務的實現
阿新 • • 發佈:2017-07-19
spring boot
在MicroService開發中經常會遇到一個問題,自己的服務需要調用其它小組的服務,但是其他小組的服務還沒有完成。為了不耽誤進度,我們就需要先實現一個Mock的服務,最後再切換到真正的外部服務上去。同時,一旦外部服務出現問題,為了不阻塞本地開發,我們需要很方便的切換到Mock服務上去。通過修改配置文件裏面的內容,可以實現不修改代碼來切換不同的服務。
通用服務接口:
public interface OrderAtpChecker { /** * @param order order to be checked by ATP * @param tenant tenant id for client * @return a map whose key is the order line id and value is the validity of its apt check result */ Map<OrderLineId, Boolean> atpCheck(Order order, String tenant); String getType(); }
不同的服務實現:
public class MockOrderAtpChecker implements OrderAtpChecker { @Override public Map<OrderLineId, Boolean> atpCheck(final Order order, final String tenant) { if (null == order) { throw new IllegalArgumentException("Can‘t atp check a null order."); } return order.getOrderLines().parallelStream() .collect(toMap(OrderLine::getId, o -> o.getQuantity() < 100)); } @Override public String getType() { return "Mock"; } }
public class OrderAtpChecker implements OrderAtpChecker { @Override public Map<OrderLineId, Boolean> atpCheck(final Order order, final String tenant) { ............ } @Override public String getType() { return "Inventory"; } }
Service Factory的實現:
@Service public class InventoryServiceFactory { @Autowired private List<OrderAtpChecker> services; private static final Map<String, OrderAtpChecker> myServiceCache = new HashMap<>(); @PostConstruct public void initMyServiceCache() { for (final OrderAtpChecker service : this.services) { myServiceCache.put(service.getType(), service); } } public static OrderAtpChecker getService(final String type) { final OrderAtpChecker service = myServiceCache.get(type); if (service == null) throw new RuntimeException("Unknown service type: " + type); return service; } }
具體調用服務的地方:
@Value("${inventory_service}") private String serviceType; private OrderAtpChecker orderAtpChecker; this.orderAtpChecker = InventoryServiceFactory.getService(this.serviceType);
本文出自 “隨手筆記” 博客,轉載請與作者聯系!
根據配置文件來切換不同服務的實現