很多人都是使用SpringBoot 和 Spring Cloud来开发微服务。Dapr 也是开发微服务的框架,它和Spring Cloud有什么区别呢,其实这不是一个区别的问题,它是不同的时代需要不同的框架。
Spring Cloud 是一种产品,提供了分布式应用程序所需的所有要素,包括服务发现、消息传递/流处理、分布式跟踪、 以易于处理的形式从springboot提供功能, 到目前为止,可能没有其他产品比 Spring Cloud 更易于使用。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
Spring Cloud 是分布式应用程序开发中的重要产品,足以影响语言选择。 假如你想使用Java 以外的语言开发微服务,比如golang,你想用Spring Cloud + Springboot , 最终还是选择了使用Java。
Dapr 的出现是分布式应用程序开发中拥有了语言无关的微服务开发,Dapr足以替代Spring Cloud成为云原生分布式应用开发的选择。熟悉Azure的人可能会觉得它其实更像是 Service Fabric 的加强版。
我们将Spring Cloud提供的组件与 Dapr 的构建块作一些横向对比:
总的来说无论是Dapr还是Spring Cloud上述这些项目,都是想帮助开发人员简单快速地构建分布式应用。但是由于时代背景的原因,它们的出发点、实现形式又存在一些差异。
我们从分布式应用程序的三大支柱性功能来比较一下Dapr 和 Spring Cloud:
-
服务调用
-
传递异步消息
-
分布式追踪
-
服务调用
首先,比较从应用程序调用另一个应用程序的功能。
Dapr 的调用使用InvokeAPI
源代码如下所示:
@Value("${baseUrl}")
private String baseUrl;
@GetMapping("/invokeHello")
public Map<String, ?> invokeHello() {
Map<?, ?> result = restTemplate.getForObject(baseUrl + "/hello", Map.class);
return Map.of("baseUrl", baseUrl, "remoteMessage", result);
}
baseUrl 可以通过为 Dapr 指定调用 API的值来通过 Dapr 调用目标应用程序。http://localhost:${DAPR_HTTP_PORT}/v1.0/invoke/hello-app/method
Dapr 在本地环境中使用mDNS(多播DNS)从应用程序名称中查找目标服务运行的主机,而k8s使用k8s本身的名称解析功能。 在两者都不可用的环境中,您当前必须使用 Consul。
除此之外,Dapr 的优势在于它基本上可以做到开箱即用。
Spring Cloud 服务发现
spring cloud使用Netflix Eureka 进行名称解析,它具有 Eureka 服务器(等效于上述内容)作为名称解析的服务器,每个应用程序都使用Netflix 客户端向Eureka服务器注册自己,并用它来构建客户端来解决自己的主机。 服务注册表非常有用,因为它允许客户端负载平衡,并将服务提供商与使用者隔离开来,而无需 DNS。