我有一个基于Spring Boot构建的REST API,由两个独立的Web服务组成。我不知道这两个Web服务是否将托管在同一台机器上,因此我想为所有服务进行远程和本地实现。示例如下:
本地服务实施:
public class LocalExampleService implements ExampleService{
public Item getItem(long id){
//Get item using implementation from another local project
}
}
远程服务实施:
public class RemoteExampleService implements ExampleService{
@Value("${serviceURL}")
private String serviceURL;
public Item getItem(long id){
//Get item calling remote service
}
}
控制器:
public class MyController{
@Autowired
private ExampleService exampleService;
}
Web服务有很多本地和远程实现的服务,我想让Spring知道它应该为所有服务选择哪种类型的实现。
我一直在考虑将url放在属性文件中,并且在初始化期间,应用程序会检查属性是否包含url,然后approprietly自动装配服务。但是,我必须为每个服务自动装配编写逻辑。
自动自动装配正确服务的最佳选择是什么?
答案 0 :(得分:2)
您可以使用Spring配置文件来控制应通过spring属性使用哪个版本的实现。
在spring属性中添加以下条目
spring.profiles.active=NAME_OF_ACTIVE_PROFILE
每个服务实现都需要配置文件注释。这就是您的服务实现应该如何:
@Component
@Profile("local")
public class LocalExampleService implements ExampleService{}
@Component
@Profile("remote")
public class RemoteExampleService implements ExampleService{}
如果您的项目需要使用本地服务实现,那么在属性中而不是NAME_OF_ACTIVE_PROFILE
插入本地远程。
对于全自动自动布线,您需要添加在启动时运行的方法,该方法检查是否存在本地实现类,然后正确设置配置文件。为此,您需要在spring boot main方法中修改代码:
public static void main(String[] args){
String profile = checkCurrentProfile(); //Method that decides which profile should be used
System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, profile);
SpringApplication.run(MyApplication.class, args);
}
如果您选择此方法,那么您不需要在属性文件中输入先前的条目。
答案 1 :(得分:0)
我尝试实施类似https://github.com/StanislavLapitsky/SpringSOAProxy
的内容我们的想法是检查是否无法在本地找到spring bean,然后自动创建一个Proxy,它在内部使用RestTemplate来远程调用相同的服务。
您需要定义合同 - 服务接口和DTO,并定义URL解析器以指定每个服务应使用哪个URL。