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



我有一个基于Spring Boot构建的REST API,由2个独立的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,然后适当地自动连线服务。但是,我必须为每个服务自动布线编写逻辑。

自动连接正确的服务实现的最佳选项是什么?

您可以使用 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);
}

如果选择此方法,则不需要属性文件中的先前条目。

我尝试实现这样的东西 https://github.com/StanislavLapitsky/SpringSOAProxy

这个想法是检查是否在本地找不到弹簧豆,然后自动创建一个代理,该代理在内部使用 RestTemplate 远程调用相同的服务。

您需要定义协定 - 服务接口和 DTO,并定义 URL 解析器以指定每个服务应使用哪个 URL。

最新更新