微服务到微服务数据传输的性能
Performance in microservice-to-microservice data transfer
我有这样的控制器:
@RestController
@RequestMapping("/stats")
public class StatisticsController {
@Autowired
private LeadFeignClient lfc;
private List<Lead> list;
@GetMapping("/leads")
private int getCount(@RequestParam(value = "count", defaultValue = "1") int countType) {
list = lfc.getLeads(AccessToken.getToken());
if (countType == 1) {
return MainEngine.getCount(list);
} else if (countType == 2) {
return MainEngine.getCountRejected(list);
} else if (countType == 3) {
return MainEngine.getCountPortfolio(list);
} else if (countType == 4) {
return MainEngine.getCountInProgress(list);
} else if (countType == 5) {
return MainEngine.getCountForgotten(list);
} else if (countType == 6) {
return MainEngine.getCountAddedInThisMonth(list);
} else if (countType == 7) {
return MainEngine.getCountAddedInThisYear(list);
} else {
throw new RuntimeException("Wrong mapping param");
}
}
@GetMapping("/trends")
private boolean getTrend() {
return MainEngine.tendencyRising(list);
}
它基本上是一个微服务,将根据 'Business Leads' 的列表处理统计信息。 FeignClient 正在获取修剪为所需数据线索的列表。一切正常。
我唯一关心的是性能 - 所有这些统计信息 (countTypes) 都将显示在 webapp 的登录页面上。如果我将一个一个地打电话给他们,每个电话都会一次又一次地检索潜在客户列表吗?或者列表会以某种方式存储在临时内存中?我可以想象,如果列表变长,加载它们可能需要一段时间。
我尝试在这个方法之外调用它们,通过@PostConstruct,在服务开始时填充列表,但这个解决方案有两个主要问题:身份验证不能由oauth令牌处理,检索到的列表将不敏感至 adding/deleting 线索,因为它仅在开始时加载。
每个 GET
请求都会调用 list = lfc.getLeads(AccessToken.getToken());
。要么看看缓存响应,这在您需要经常获取大量数据时可能会有用。
我将从这里开始:Baeldung's: Spring cache tutorial 让您了解缓存。那么可以看看EhCache的实现或者实现自己的拦截器 putting/getting from/to Redis等外部存储
缓存是我认为解决此问题的唯一方法:由于使用不同的请求调用 Feign 客户端(基于令牌)数据不是静态的,需要缓存.
您需要实现缓存层以提高性能。您可以做的是,您可以在应用程序启动后立即预加载缓存。这样您就可以在缓存中准备好响应。我建议使用 Redis 缓存。但是任何缓存都可以完成这项工作。
此外,如果您可以将 getCount() 的逻辑移动到某个服务 class.
会更好
我有这样的控制器:
@RestController
@RequestMapping("/stats")
public class StatisticsController {
@Autowired
private LeadFeignClient lfc;
private List<Lead> list;
@GetMapping("/leads")
private int getCount(@RequestParam(value = "count", defaultValue = "1") int countType) {
list = lfc.getLeads(AccessToken.getToken());
if (countType == 1) {
return MainEngine.getCount(list);
} else if (countType == 2) {
return MainEngine.getCountRejected(list);
} else if (countType == 3) {
return MainEngine.getCountPortfolio(list);
} else if (countType == 4) {
return MainEngine.getCountInProgress(list);
} else if (countType == 5) {
return MainEngine.getCountForgotten(list);
} else if (countType == 6) {
return MainEngine.getCountAddedInThisMonth(list);
} else if (countType == 7) {
return MainEngine.getCountAddedInThisYear(list);
} else {
throw new RuntimeException("Wrong mapping param");
}
}
@GetMapping("/trends")
private boolean getTrend() {
return MainEngine.tendencyRising(list);
}
它基本上是一个微服务,将根据 'Business Leads' 的列表处理统计信息。 FeignClient 正在获取修剪为所需数据线索的列表。一切正常。
我唯一关心的是性能 - 所有这些统计信息 (countTypes) 都将显示在 webapp 的登录页面上。如果我将一个一个地打电话给他们,每个电话都会一次又一次地检索潜在客户列表吗?或者列表会以某种方式存储在临时内存中?我可以想象,如果列表变长,加载它们可能需要一段时间。
我尝试在这个方法之外调用它们,通过@PostConstruct,在服务开始时填充列表,但这个解决方案有两个主要问题:身份验证不能由oauth令牌处理,检索到的列表将不敏感至 adding/deleting 线索,因为它仅在开始时加载。
每个 GET
请求都会调用 list = lfc.getLeads(AccessToken.getToken());
。要么看看缓存响应,这在您需要经常获取大量数据时可能会有用。
我将从这里开始:Baeldung's: Spring cache tutorial 让您了解缓存。那么可以看看EhCache的实现或者实现自己的拦截器 putting/getting from/to Redis等外部存储
缓存是我认为解决此问题的唯一方法:由于使用不同的请求调用 Feign 客户端(基于令牌)数据不是静态的,需要缓存.
您需要实现缓存层以提高性能。您可以做的是,您可以在应用程序启动后立即预加载缓存。这样您就可以在缓存中准备好响应。我建议使用 Redis 缓存。但是任何缓存都可以完成这项工作。 此外,如果您可以将 getCount() 的逻辑移动到某个服务 class.
会更好