REST API自动远程或本地实现服务

时间:2017-08-18 12:44:05

标签: java spring rest spring-boot microservices

我有一个基于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自动装配服务。但是,我必须为每个服务自动装配编写逻辑。

自动自动装配正确服务的最佳选择是什么?

2 个答案:

答案 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。