根据配置文件来切换不同服务的实现
2017-07-19 17:18
459 查看
在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();
}
不同的服务实现:
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);
通用服务接口:
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 InventoryChecker 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);
相关文章推荐
- java根据properties配置文件来实现功能模块的动态切换
- 配置maven下载jar包源码文件、拷贝依赖jar到lib包、设置编译时jdk版本、根据不同环境采用不同配置
- 基于IDbConnection接口实现修改配置文件切换数据源
- Linux系统服务 6 ---- vsftpd服务的配置文件实现匿名登录上传下载和删除功能
- 脚本自动实现DNS服务各区域配置文件
- 用资源文件实现Asp.net程序的不同语言间的切换
- Linux Samba文件共享服务配置(实现与win共享)
- 在 web.xml中配置<mime-mapping>实现浏览器根据文件类型自动打开
- 根据不同的操作系统读取配置文件/java读取属性文件代码
- Maven根据不同个环境打包, 获取不同的配置文件等等
- shell根据配置文件调用不同程序
- 用批处理备份还原网络配置并实现不同IP间的切换(netsh应用)
- (11)Linux 服务器安装配置rsync服务,并实现两台机器同步文件
- 用js实现根据不同的分辨率和浏览器调用不同的css文件
- c++ stl实现对配置文件的读写 根据windows API WritePrivateProfileString,GetPrivateProfileString简单改写
- c++ 实现对配置文件的读写 根据windows API 函数简单改写
- C#中实现在32位、64位系统下自动切换不同的SQLite dll文件
- Linux下简单配置SAMBA服务,实现与Windows系统文件共享.
- NFS 服务实现Linux主机之间的文件共享(配置过程)
- 加载spring配置文件不同实现