1. 程式人生 > >根據配置文件來切換不同服務的實現

根據配置文件來切換不同服務的實現

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);


本文出自 “隨手筆記” 博客,轉載請與作者聯系!

根據配置文件來切換不同服務的實現