gpt4 book ai didi

java - 使用Spring时,直接调用本地方法或者使用API

转载 作者:行者123 更新时间:2023-12-02 03:03:50 29 4
gpt4 key购买 nike

刚刚开始学习如何使用Spring!作为最佳实践,如果您正在使用 spring 方法,并且需要添加/利用您已经在另一个可通过 API 访问的 Spring 类中构建的功能,那么您应该使用已建立的 API 或调用它直接地?

最佳答案

假设您有一个 CustomerService 组件

@Service
public class CustomerService {
public Customer getCustomerById(CustomerId id) {
//your code here
}
}

假设现在您有一个 OrderService,它需要在下新订单之前找到客户。您肯定希望使用现有的 CustomerService API 来查找客户。

@Service
public class OrderService {

@Autowire private CustomerService customerService;

public void placeOrder(Order order, CustomerId custId) {
Customer customer = customerServive.getCustomerById(custId);
//your code here
}
}

这完全有道理。

现在假设您有一个 Controller 将您的 CustomerService 公开给您的 Web 客户端。

@RestController
public CustomerController {

@Autowire private CustomerService customerService;

@GET("/customer/{custId}")
public Customer getCustomer(@Param CustomerId custId){
return customerService.getCustomerById(custId);
}

}

从您的 OrderServer 来看,您绝对不需要/不应该对此 HTTP 服务进行 HTTP 远程调用来获取客户。如果它们都位于 JVM 中,那就没有意义了。使用本地服务要简单得多、安全得多。

但是,如果您的 CustomerService 运行在不同的进程/JVM 中,与运行您的 OrderService 的进程/JVM 完全不同,那么进行远程 HTTP 调用就有意义了来吸引您的客户。

在这种情况下,您可能需要一个 CustomerServiceGateway 来进行远程调用。

例如,在订单 API 中

interface CustomerService {
Order getCustomerById(CustomerId custId);
}

然后是网关实现:

@Service
public class CustomerServiceGateway implements CustomerService {

@Autowire private RestTemplate restTemplate;

Order getCustomerById(CustomerId custId) {
return restTemplate.getForObject("http://customer-api/customer/{custId}", custId);
}
}

这过于简单化了,但即便如此,您也会发现这很难做到,而且只有在您尝试调用远程服务时才有意义。

关于java - 使用Spring时,直接调用本地方法或者使用API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42042569/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com