首页 > 其他分享 >SpringCloud和Dubbo有什么区别

SpringCloud和Dubbo有什么区别

时间:2024-07-01 20:30:03浏览次数:17  
标签:Dubbo 调用 String 区别 Spring SpringCloud public name

SpringCloud与Dubbo的区别

两者都是现在主流的微服务框架,但却存在不少差异:

  • 初始定位不同: SpringCloud定位为微服务架构下的一站式解决方案;Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用和治理

  • 生态环境不同: SpringCloud依托于Spring平台,具备更加完善的生态体系;而Dubbo一开始只是做RPC远程调用,生态相对匮乏,现在逐渐丰富起来。

  • 调用方式: SpringCloud是采用Http协议做远程调用,接口一般是Rest风格,比较灵活;Dubbo是采用Dubbo协议,接口一般是Java的Service接口,格式固定。但调用时采用Netty的NIO方式,性能较好。

  • 组件差异比较多,例如SpringCloud注册中心一般用Eureka,而Dubbo用的是Zookeeper

SpringCloud生态丰富,功能完善,更像是品牌机,Dubbo则相对灵活,可定制性强,更像是组装机。

  • SpringCloud:Spring公司开源的微服务框架,SpirngCloud 定位为微服务架构下的一站式解决方案。

  • Dubbo:阿里巴巴开源的RPC框架,Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用,流量分发、流量监控和熔断

两者的生态对比:

Spring Cloud 的功能很明显比 Dubbo 更加强大,涵盖面更广,而且作为 Spring 的旗舰项目,它也能够与 Spring Framework、Spring Boot、Spring Data、Spring Batch 等其他 Spring 项目完美融合,这些对于微服务而言是至关重要的。

使用 Dubbo 构建的微服务架构就像组装电脑,各环节选择自由度很高,但是最终结果很有可能因为一条内存质量不行就点不亮了,总是让人不怎么放心,但是如果使用者是一名高手,那这些都不是问题。

而 Spring Cloud 就像品牌机,在 Spring Source 的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性,但是如果要在使用非原装组件外的东西,就需要对其基础原理有足够的了解。

通信协议

Dubbo

  • 通信协议:Dubbo 默认使用单一长连接和NIO(Non-blocking I/O)异步通讯方式。这意味着服务消费者和服务提供者之间建立一个长连接,通过这个连接发送多个请求和响应,减少了连接建立和关闭的开销。

  • 特点:这种方式适合于小数据量大并发的服务调用场景,尤其是在服务消费者的数量远大于服务提供者时,可以有效地减少连接资源的消耗。

代码示例:

在Dubbo中,服务提供者和消费者通过定义和服务引用接口来实现通信。以下是一个简单的服务提供者和消费者的例子:

服务接口:

public interface GreetingService {
    String sayHello(String name);
}

服务提供者:

@Service
public class GreetingServiceImpl implements GreetingService {
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}

服务消费者:

public class Consumer {
    @Reference
    private GreetingService greetingService;

    public String doSayHello(String name) {
        return greetingService.sayHello(name);
    }
}

Spring Cloud

  • 通信协议:Spring Cloud 使用基于HTTP协议的REST API进行服务间的调用。这意味着服务之间的交互通过标准的HTTP请求和响应来完成,通常使用JSON或XML作为数据交换格式。

  • 特点:使用HTTP协议的REST API具有跨语言和跨平台的优势,因为HTTP是Web服务的事实标准。然而,相比于NIO,基于HTTP的REST调用可能会有更多的开销,尤其是在高并发场景下。

代码示例:

在Spring Cloud中,可以使用RestTemplate或WebClient来实现REST API的调用:

服务提供者(Controller):

@RestController
public class GreetingController {
    @GetMapping("/greet")
    public ResponseEntity<String> greet(@RequestParam String name) {
        return ResponseEntity.ok("Hello, " + name);
    }
}

服务消费者(使用RestTemplate):

@Service
public class GreetingServiceClient {
    private final RestTemplate restTemplate;
    private final String greetingServiceUrl;

    public GreetingServiceClient(@Value("${greeting.service.url}") String greetingServiceUrl) {
        this.restTemplate = new RestTemplate();
        this.greetingServiceUrl = greetingServiceUrl;
    }

    public String doGreet(String name) {
        String url = greetingServiceUrl + "/greet?name=" + name;
        return restTemplate.getForObject(url, String.class);
    }
}

对比

  • 性能:Dubbo的NIO异步通讯在高并发小数据量的场景下,性能通常优于基于HTTP的REST调用,因为它减少了网络连接的建立和关闭的开销。

  • 跨语言和跨平台:Spring Cloud的REST API具有更好的跨语言和跨平台特性,因为HTTP协议是通用的网络协议,而Dubbo的自定义协议则主要限于Java环境。

  • 开发便利性:对于习惯了HTTP协议的开发者来说,Spring Cloud的REST API可能更易于理解和使用。而Dubbo的NIO通讯则可能需要对Java NIO有更好的理解。

Dubbo和Spring Cloud在通信协议上的区别主要体现在性能、跨语言支持和开发便利性上。开发者需要根据具体的应用场景和需求来选择最合适的通信协议。

性能方面

Spring Cloud性能调优

Feign 在高并发场景下,通常需要进行如下性能优化,有明显瓶颈,需要改造。

· 调整服务容器到 UnderTow ,在负载大的情况下Undertow 的性能有提高;

· 曾有同学表示将HTTPURLConnection 改成 Httpclient /Okhttp,这样可以优化性能,其实单次调用性能Httpclient差很多,HttpClient 因为封装了很多方便开发者处理的方法,性能比HTTPURLConnection差,改进同时Httpclient 需要设置复用连接池,效果可见一般;

· 开启Gzip;

· Feign中HttpMessageConverters 默认使用jackson2方式进行序列化和反序列化,可以将其改造为ProtoBuf,降低Cpu 损耗并且响应时间也降低。

Dubbo性能调优

主要是配置而无需改造。

负载均衡

Ribbon 的负载均衡策略

· 随机;

· 规则轮询;

· 空闲策略;

· 响应时间策略。

Feign默认使用Ribbon作为负载均衡的组件,Ribbon需要进行全局配置,个性化配置比较麻烦。

Dubbo 的负载均衡策略

· 随机;

· 权重轮询;

· 最少活跃调用数;

· 一致性Hash策略。

Dubbo 可以使用路由策略,然后再进行负载均衡。

容错机制

Spring cloud 的 Hystix 提供了服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能。

Dubbo 提供了一整套 FailOver、FailFast、Failsafe、FailBack、Aviailable、Broadcast、Forking 策略,以及Mock。

 路由、流量调度、ABtest 

Ribbon需自己实现,应用不灵活

Ribbon主要通过扩展 AbstractLoadBalancerRule负载均衡的方法来实现,在负载均衡的部分还要进行改造升级。

Dubbo更加灵活方便

Dubbo通过界面化、校本化配置路由规则,可以实现灰度发布、动态流量调度、容量计算等,方案成熟。

另外,Dubbo 还支持多版本调用。

标签:Dubbo,调用,String,区别,Spring,SpringCloud,public,name
From: https://blog.csdn.net/2301_76166241/article/details/140043265

相关文章

  • 三次握手,四次挥手,以及Socket、TCP、HTTP之间的区别
    网络开发1.网站:最全的socket,tcp,http三者之间的区别和原理_cocket与tcpip-CSDN博客1.网络七层1.定义:网络七层(简称:OSI),即开放式系统互连。该体系架构标准定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层)2.socket,tcp,http三者之间的区别和......
  • batchNorm和 layerNorm的区别
    LayerNormalization(层归一化)和BatchNormalization(批量归一化)都是深度学习中常用的归一化技术,用于加速训练过程和改善模型性能。它们的主要区别在于归一化的方式和应用的场景。BatchNormalization(批量归一化):归一化方式:BatchNormalization对每个特征在小批量数据上进行归一......
  • Prometheus thanos Victoriametrics比较 victoria prometheus 区别 转载
    IDE,运维,k8s,Prometheus相关视频讲解: C语言程序设计入门之环境安装 Linuxshell脚本编程入门详细讲解 Prometheus监控系统介绍Thanos和VictoriaMetrics都是用来作为Prometheus长期存储的成熟方案,其中VictoriaMetrics也开源了其集群版本,功能更加强大。主要功能:长期存储,可以......
  • 绘画应用当中的Midjourney和Diffusion有何区别?
    本文由ChatMoney团队出品Midjourney与StableDiffusion:对比分析1.易用性与部署Midjourney:在线操作:Midjourney的最大优势在于其无需下载,直接在线操作的特点。这使得用户可以轻松上手,无需担心硬件性能问题。简单学习:由于其网页操作的特性,Midjourney的学习和使用都相对简......
  • 时下最火的绘画应用:Midjourney和Diffusion有何区别
    本文由ChatMoney团队出品Midjourney与StableDiffusion:对比分析1.易用性与部署Midjourney:在线操作:Midjourney的最大优势在于其无需下载,直接在线操作的特点。这使得用户可以轻松上手,无需担心硬件性能问题。简单学习:由于其网页操作的特性,Midjourney的学习和使用都相......
  • 详细分析css float 属性以及position:absolute 的区别
    CSS中的float属性和position:absolute属性都可以用来定位元素,但它们在布局和行为上有着根本的区别。下面是对这两个属性的详细分析:float属性float属性主要用于让元素围绕文本流动,通常用于图像或文本块的布局。它有四个可能的值:left、right、none(默认值)、以及inherit。布局......
  • Dubbo 协议详解
    Solomon_肖哥弹架构跟大家“弹弹”分布式微服务Dubbo协议详解欢迎点赞,收藏,关注。关注本人的公众号Solomon肖哥弹架构获取更多的惊喜协议的概念协议是两个网络实体进行通信的基础,数据在网络上从一个实体传输到另一个实体,以字节流的形式传递到对端。在这个字节流的......
  • Dubbo 如何自定义协议为业务通信带来扩展
    Solomon_肖哥弹架构跟大家“弹弹”Dubbo自定义协议扩展欢迎点赞,收藏,关注。关注本人的公众号Solomon肖哥弹架构获取更多精彩内容Dubbo自定义协议扩展1、扩展说明RPC协议扩展,封装远程调用细节。契约:当用户调用refer()所返回的Invoker对象的invoke()方法......
  • Java-HashMap和ConcurrentHashMap的区别
    Java-HashMap和ConcurrentHashMap的区别一、关键区别1.数据结构2.线程安全3.性能4.扩容机制二、源码简析1.并发控制机制2.数据结构转换:链表转红黑树3.扩容机制触发hashMap和concurentHashMap扩容机制的条件三、putIfAbsent方法computeIfAbsent方法区别​在Java......
  • 聊聊三种等待的区别
    1.强制等待:sleep()缺点:指定的时间过长,即使元素已经被加载出来了,但还是要是要继续等待,浪费时间。 2.隐式等待:缺点:可以把隐式等待当做全局变量,影响整个页面,程序需要等待整个页面加载完成才会执行下一步。但可能页面加载未完成时,需要定位的元素已经加载完成了,但受限于某些JS......