实战系列(一)| Dubbo和Spring Cloud的区别,包含代码详解

目录

  • 1. 概述
  • 2. 核心功能
  • 3. 代码示例
  • 4. 适用场景

Dubbo 和 Spring Cloud 都是微服务架构中的重要框架,但它们的定位和关注点不同。Dubbo 是阿里巴巴开源的一个高性能、轻量级的 RPC 框架,主要用于构建微服务之间的服务治理。而 Spring Cloud 是基于 Spring Boot 的一个微服务架构开发工具,它提供了一系列的开发工具和服务,帮助开发者快速构建分布式系统和微服务架构。 在这里插入图片描述

在这里插入图片描述

在本文中,我们将从以下几个方面对比 Dubbo 和 Spring Cloud:

  1. 概述
  2. 核心功能
  3. 代码示例
  4. 适用场景

1. 概述

Dubbo 是阿里巴巴开源的一个高性能、轻量级的 RPC 框架,主要用于构建微服务之间的服务治理。它提供了服务注册与发现、服务路由、负载均衡、服务熔断等功能。Dubbo 支持多种服务治理组件,如 Nacos、Zookeeper、Eureka 等。
Spring Cloud 是基于 Spring Boot 的一个微服务架构开发工具,它提供了一系列的开发工具和服务,帮助开发者快速构建分布式系统和微服务架构。Spring Cloud 提供了服务注册与发现、服务路由、负载均衡、服务熔断等功能,同时支持多种服务治理组件,如 Eureka、Consul、Zookeeper 等。

2. 核心功能

Dubbo 和 Spring Cloud 都提供了服务注册与发现、服务路由、负载均衡、服务熔断等功能。下面我们分别介绍它们的核心功能。
2.1 Dubbo 核心功能

  • 服务注册与发现:Dubbo 支持多种服务注册中心,如 Nacos、Zookeeper、Eureka 等。服务提供者将服务注册到注册中心,服务消费者从注册中心获取服务提供者的信息,从而实现服务之间的调用。
  • 服务路由:Dubbo 支持多种服务路由方式,如服务名称路由、服务版本路由、负载均衡路由等。
  • 负载均衡:Dubbo 支持多种负载均衡策略,如轮询、随机、最少连接数等。
  • 服务熔断:Dubbo 支持服务熔断功能,当服务提供者出现异常时,可以自动将流量切换到其他可用的服务提供者。
    2.2 Spring Cloud 核心功能
  • 服务注册与发现:Spring Cloud 提供了服务注册与发现功能,支持多种服务注册中心,如 Eureka、Consul、Zookeeper 等。服务提供者将服务注册到注册中心,服务消费者从注册中心获取服务提供者的信息,从而实现服务之间的调用。
  • 服务路由:Spring Cloud 提供了服务路由功能,支持多种服务路由方式,如服务名称路由、服务版本路由、负载均衡路由等。
  • 负载均衡:Spring Cloud 提供了负载均衡功能,支持多种负载均衡策略,如轮询、随机、最少连接数等。
  • 服务熔断:Spring Cloud 提供了服务熔断功能,当服务提供者出现异常时,可以自动将流量切换到其他可用的服务提供者。

3. 代码示例

接下来我们分别给出 Dubbo 和 Spring Cloud 的简单代码示例。
3.1 Dubbo 代码示例
假设我们有一个简单的服务提供者 HelloService,我们使用 Dubbo 构建这个服务:

// HelloService.java  
package com.example.dubbo.service;
import com.alibaba.dubbo.config.annotation.DubboService;
@DubboService  
public interface HelloService {  String sayHello(String name);  
}
// HelloServiceImpl.java  
package com.example.dubbo.service.impl;
import com.example.dubbo.service.HelloService;  
import org.springframework.beans.factory.annotation.Value;  
import org.springframework.stereotype.Component;
@Component  
public class HelloServiceImpl implements HelloService {  @Value("${hello.name}")  private String name;@Override  public String sayHello(String name) {  return "Hello, " + name + "!";  }  
}

接下来我们使用 Dubbo 创建一个简单的服务消费者:

// DubboConsumer.java  
package com.example.dubbo.consumer;
import com.alibaba.dubbo.config.annotation.Reference;  
import com.example.dubbo.service.HelloService;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.Get;
package com.example.dubbo.consumer;
import com.alibaba.dubbo.config.annotation.Reference;  
import com.example.dubbo.service.HelloService;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RequestParam;  
import org.springframework.web.bind.annotation.RestController;
@RestController  
public class DubboConsumer {@Reference(interfaceClass = HelloService.class)  private HelloService helloService;@GetMapping("/hello")  public String sayHello(@RequestParam("name") String name) {  return helloService.sayHello(name);  }  
}

3.2 Spring Cloud 代码示例
假设我们有一个简单的服务提供者 HelloService,我们使用 Spring Cloud 构建这个服务:

// HelloService.java  
package com.example.springcloud.service;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RestController;
@RestController  
@EnableDiscoveryClient  
public class HelloService {@GetMapping("/hello")  public String sayHello() {  return "Hello, World!";  }  
}

接下来我们使用 Spring Cloud 创建一个简单的服务消费者:

// SpringCloudConsumer.java  
package com.example.springcloud.consumer;
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.cloud.client.discovery.DiscoveryClient;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RequestParam;  
import org.springframework.web.bind.annotation.RestController;
@RestController  
public class SpringCloudConsumer {@Autowired  private DiscoveryClient discoveryClient;@GetMapping("/hello")  public String sayHello(@RequestParam("name") String name) {  String serviceUrl = discoveryClient.getServiceUrl("hello-service", "hello-service");  return serviceUrl + "/hello";  }  
}

3.3 服务发现与注册:
Dubbo 使用 Dubbo 服务注册中心进行服务发现和注册,可以实现服务的自动发现和负载均衡。Spring Cloud 则使用 Netflix Eureka 或者 Consul 作为服务注册中心。
以下是 Dubbo 服务注册中心的一个简单示例:

public class DubboServiceRegister {  public void register(String interfaceName, String version, String group, String serviceName) {  URL url = new URL("register", "127.0.0.1:2181", new Properties());  Invoker invoker = new Invoker(interfaceName, version, group);  invoker.setServiceName(serviceName);  DubboServiceRegister.getRegisterInstance().register(url, invoker);  }  
}

以下是 Spring Cloud 使用 Eureka 进行服务注册的一个简单示例:

@Configuration  
public class EurekaServerConfig {  @Value("${eureka.client.serviceUrl.defaultZone}")  private String defaultZone;@Bean  public EurekaServer eurekaServer() {  EurekaServer eurekaServer = new EurekaServer();  eurekaServer.setServiceUrl(defaultZone);  return eurekaServer;  }  
}

3.4 配置管理:
Dubbo 使用 Zookeeper 进行配置管理,可以实现配置的版本控制、动态更新等功能。Spring Cloud 则使用 Spring Cloud Config 进行配置管理,也可以实现配置的版本控制、动态更新等功能。
以下是 Dubbo 使用 Zookeeper 进行配置管理的一个简单示例:

@Component  
public class DubboConfigManager {  @Value("${dubbo.config.zkAddress}")  private String zkAddress;@Autowired  private Zookeeper zkClient;public void saveConfig(String key, String value) {  zkClient.writeData(zkAddress + "/" + key, value, new Watcher() {  public void process(WatchedEvent event) {  if (event.getState() == Watcher.Event.KeeperState.SyncConnected) {  saveConfig(key, value);  }  }  });  }  
}

以下是 Spring Cloud 使用 Spring Cloud Config 进行配置管理的一个简单示例:

@Configuration  
@EnableConfigServer  
public class ConfigServerConfig {  @Value("${spring.cloud.config.server.port}")  private int port;@Bean  public ConfigServer configServer(ConfigServerProperties configServerProperties) {  return new ConfigServer(configServerProperties, this.port);  }  
}

3.5 负载均衡:
Dubbo 使用 Dubbo 服务治理中心进行负载均衡,可以实现服务的负载均衡、容错等功能。Spring Cloud 则使用 Spring Cloud Gateway 或者 Ribbon 进行负载均衡。
以下是 Dubbo 进行负载均衡的一个简单示例:

public class DubboLoadBalance {  public void doLoadBalance(String interfaceName, String version, String group, String serviceName) {  URL url = new URL("loadbalance", "127.0.0.1:2181", new Properties());  Invoker invoker = new Invoker(interfaceName, version, group);  invoker.setServiceName(serviceName);  DubboServiceRegister.getLoadBalanceInstance().doLoadBalance(url, invoker);  }  
}

以下是 Spring Cloud 使用 Spring Cloud Gateway 进行负载均衡的一个简单示例:

@Configuration  
public class GatewayConfig {  @Value("${spring.cloud.gateway.routes}")  private String routes;@Bean  public RouteLocator routeLocator(RouteLocatorBuilder builder) {  return new RouteLocator(builder.routes(routes));  }  
}

4. 适用场景

Dubbo 和 Spring Cloud 都是微服务架构中的重要框架,但它们的定位和关注点不同。以下是它们各自的适用场景:
4.1 Dubbo 适用场景
Dubbo 主要适用于以下场景:

  • 需要高性能、轻量级的 RPC 框架。
  • 服务提供者和服务消费者之间需要进行服务治理,如服务注册与发现、服务路由、负载均衡、服务熔断等。
  • 阿里巴巴生态圈中的项目,因为 Dubbo 是阿里巴巴开源的框架,与其他阿里巴巴开源项目(如 Spring Cloud、Nacos 等)集成更加方便。
    4.2 Spring Cloud 适用场景
    Spring Cloud 主要适用于以下场景:
  • 已经使用 Spring Boot 的项目,希望快速构建分布式系统和微服务架构。
  • 需要使用多种服务治理组件,如 Eureka、Consul、Zookeeper 等。
  • 希望在一个统一的框架中实现服务注册与发现、服务路由、负载均衡、服务熔断等功能。
    总之,Dubbo 和 Spring Cloud 都是微服务架构中的重要框架,但它们的定位和关注点不同。在选择时,需要根据项目的具体情况和需求来决定使用哪个框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/62449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学术加油站|基于端到端性能的学习型基数估计器综合测评

编者按 本文系东北大学李俊虎所著,也是「 OceanBase 学术加油站」系列第 11 篇内容。 「李俊虎:东北大学计算机科学与工程学院在读硕士生,课题方向为数据库查询优化,致力于应用 AI 技术改进传统基数估计器,令数据库选…

Kubernetes技术--k8s核心技术持久化存储

有时候需要在集群中进行一些重要的数据进行持久化存储,然后需要的时候再进行挂载,那么下面我们一起来看看如何实现数据的持久化存储操作。 1.nfs网络存储 -1.找一台服务器做nfs的服务端,安装nfs。(这里我们直接在master上实现)。 这里应该找再单独的搭建一个node节点做持…

按钮控件之1---QPushButton 标准按钮/普通按钮控件

1、父类QAbstractButton 2、QPushButton按钮,是Qt常用的控件之一,提供普通的按钮功能。 通过信号槽机制接收触发信号并执行对应动作。3、创建QPushButton 它有三个构造函数: // 空对象 QPushButton(QWidget *parent nullptr); // 指定QPus…

基于Django+node.js+MySQL+杰卡德相似系数智能新闻推荐系统——机器学习算法应用(含Python全部工程源码)+数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境node.js前端环境MySQL数据库 模块实现1. 数据预处理2. 热度值计算3. 相似度计算1)新闻分词处理2)计算相似度 4. 新闻统计5. API接口开发6. 前端界面实现1)运行逻辑2&#xff0…

文心一言 VS CHATGPT

由于近几天来,我的手机短信不断收到百度公司对于“文心一言”大模型的体验邀请(真是不胜其烦)!!所以我就抱着试试看的态度点开了文心一言的链接:文心一言 目前看来,有以下两点与chatgpt是有比较…

什么是浏览器缓存(browser caching)?如何使用HTTP头来控制缓存?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浏览器缓存和HTTP头控制缓存⭐ HTTP头控制缓存1. Cache-Control2. Expires3. Last-Modified 和 If-Modified-Since4. ETag 和 If-None-Match ⭐ 缓存策略⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击…

新方案unity配表工具

工具下载:网盘链接 工具结构:针对每张表格生成一个表格类,其中默认包含一个list和字典类型参数记录表格数据,初始化项目时将list中的数据转为按id索引的dictionary,用于访问数据。额外包含一个同名Temp后缀的类&#…

5年前我们摸爬滚打进入测试行业,如今的你后悔吗?

记得在求职的时候,面试官经常问我:“为什么要选择软件测试工作?”而我也会经常说一堆自己有的没的优势去应付。 工作这么久了,也不再浮躁,静下心来回忆当初选择软件测试工作的历程,也是对自己职业生涯的一次回顾。 一…

部署java程序的服务器cpu过高如何排查和解决

1.top命令找到占用CPU高的Java进程PID 2.根据进程ID找到占用CPU高的线程 ps -mp pid -o THREAD,tid | sort -r ps -mp 124682 -o THREAD,tid | sort -r 3.将指定的线程ID输出为16进制格式 printf “%x\n” tid printf "%x\n" 6384 18f0 4.jstack pid |…

设计模式-原型模式详解

文章目录 前言理论基础1. 原型模式定义2. 原型模式角色3. 原型模式工作过程4. 原型模式的优缺点 实战应用1. 原型模式适用场景2. 原型模式实现步骤3. 原型模式与单例模式的区别 原型模式的变体1. 带有原型管理器的原型模式2. 懒汉式单例模式的原型模式实现3. 细粒度原型模式 总…

FPGA时序分析与约束(1)——组合电路时序

写在最前面: 关于时序分析和约束的学习似乎是学习FPGA的一道分水岭,似乎只有理解了时序约束才能算是真正入门了FPGA,对于FPGA从业者或者未来想要从事FPGA开发的工程师来说,时序约束可以说是一道躲不过去的坎,所以从这篇…

CSS魔术师Houdini,用浏览器引擎实现高级CSS效果

开门见山,直接上货 🔍 CSS Houdini是什么? “Houdini”一词引用自“Harry Houdini”,他是一位20世纪的著名魔术师,亦被称为史上最伟大的魔术师、逃脱术师及特级表演者。 我们都知道,浏览器在渲染网页显示样…

异或和大小比较类问题——抓住最高位:CF1863F

https://codeforces.com/contest/1863/problem/F 因为有等于,所以考虑异或和为0的合法区间,它可以随意切现在考虑切开后左边大于右边,可以发现左右边最高位可以互相抵消,似乎不太可做?此时可以换个考虑,考…

抖音企业号无需API开发连接AI图像生成,打造AI智能绘图助手

1. 抖音用户使用场景: 作为抖音企业号的运营人员,我们一直在寻找新的方式来增强我们与用户之间的互动。最近,我们发现了AI绘图技术可以根据用户需求和指令自动创建图片,无需人为干预,这为我们节省了人力和时间。因此&a…

node 如何下载任意版本

开门见山啦 第一步:打开node官网 Node.js 第二步:点击下载 进入下面的页面,然后往下滑,点击 All download options 查看以往所有的版本号: 这样就可以按自己的需求下载对应的node版本啦 或者 : 最简单…

Elasticsearch:为什么从 Elasticsearch 7.0.0 及更高版本中删除了映射类型 type?

在 Elasticsearch 7.0.0 或更高版本中创建的索引不再接受 _default_ 映射。 在 6.x 中创建的索引将继续在 Elasticsearch 6.x 中像以前一样运行。 7.0 中的 API 中已弃用类型 type,并对索引创建、放置映射、获取映射、放置模板、获取模板和获取字段映射 API 进行了重…

c#事件(event)

概述: C#中的事件是一种特殊的委托,它用于实现观察者模式,允许对象在特定事件发生时通知其他对象。 以下是使用C#事件的示例: 首先,定义一个包含事件的类: public class EventPublisher {// 声明一个事…

海格里斯HEGERLS高密度料箱式四向穿梭车存储系统有哪些显著优势?

近些年仓储货架向着自动化、智能化发展,因此市面上出现很多不同类型的智能自动化仓储货架。其中,最受企业青睐的便是四向穿梭车货架。四向穿梭车货架根据其载重不同可分为托盘式和料箱式两大类。这两种不同类型的四向穿梭车货架在结构形式和控制方式上基…

git 提交错误,回滚到某一个版本

git log 查看版本号 commit 后面跟的就是版本号git reset --hard 版本号 (就可以回滚到你要去的版本)git push -f (因为本地回滚了,所以和远程会差几个版本。所以这时候只有强制推送,覆盖远程才可以)

Tauri打包windows应用配置中文界面

使用 Tauri Rust 开发桌面应用,在 windows 系统上,打包后安装包名称后缀、安装界面、相关说明默认都是英文的。如果要默认显示为中文,则需要在 tauri.conf.json 中配置相应参数。 前言 默认情况下,在 windows 系统打完的 mis 包…