当前位置: 首页 > news >正文

springcloud间通信的方式

在 Spring Cloud 中,主要有以下几种通信方式:

一、基于 HTTP 的 RESTful API
  1. 工作原理:

    • 这是一种常见的通信方式,各个微服务通过发送 HTTP 请求来相互调用。服务提供者暴露 RESTful API 接口,服务消费者通过 HTTP 客户端(如RestTemplateFeign等)发送请求。

    • 例如,一个订单服务需要查询商品信息,它可以通过 HTTP 请求调用商品服务提供的 API 接口。

  2. 优点:

    • 简单易用,基于广泛使用的 HTTP 协议,开发人员熟悉度高。

    • 与语言无关,不同语言实现的微服务可以方便地进行通信。

    • 可以利用 HTTP 的各种特性,如缓存、认证、授权等。

  3. 缺点:

    • 相对来说性能可能不如其他通信方式,因为 HTTP 协议有一定的开销。

    • 对于高性能、低延迟的场景可能不太适合。

二、基于 RPC(Remote Procedure Call)的通信
  1. 以 Dubbo 在 Spring Cloud 中的应用为例:

    • Dubbo 是一个高性能的 RPC 框架,可以与 Spring Cloud 集成。通过 Dubbo,服务提供者和服务消费者之间可以进行高效的远程方法调用。

    • 例如,使用 Dubbo 时,服务提供者将服务注册到注册中心,服务消费者从注册中心获取服务提供者的地址列表,然后通过 RPC 调用服务提供者的方法。

  2. 优点:

    • 性能高,通常比基于 HTTP 的通信方式更快。

    • 可以支持多种序列化方式,如 Hessian、JSON、Protobuf 等,满足不同场景的需求。

  3. 缺点:

    • 相对复杂,需要引入额外的框架和依赖。

    • 与特定的 RPC 框架绑定,可能会限制技术选型的灵活性。

三、消息队列(Message Queue)
  1. 工作原理:

    • 各个微服务通过发送和接收消息来进行通信。服务生产者将消息发送到消息队列,服务消费者从消息队列中获取消息并进行处理。

    • 例如,一个订单服务在订单创建成功后,将订单信息发送到消息队列,库存服务从消息队列中获取订单信息并进行库存扣减操作。

  2. 优点:

    • 解耦服务之间的直接依赖,提高系统的可扩展性和容错性。

    • 可以实现异步通信,提高系统的响应速度和吞吐量。

  3. 缺点:

    • 引入了额外的中间件,增加了系统的复杂性。

    • 需要处理消息的顺序性、重复消费等问题。

总之,Spring Cloud 中可以根据具体的业务需求和场景选择合适的通信方式。HTTP 的 RESTful API 简单易用,适合大多数场景;RPC 通信性能高,适合对性能要求较高的场景;消息队列适合解耦和异步通信的场景。

四、基于 HTTP 的 RESTful API的实现
一、主要有两种
  • RestTemplate 方式

  • Feign 的方式

二、RestTemplate 方式

RestTemplate 中也分为三种方式 简单来演示一下吧

  1. 第一种方式 直接使用 RestTemplate ,url 写死

    服务端编写

    /**

    • 用来测试与 order 服务的连接

    • @author ccyang

    • @date 2018/7/1 16:06 */ @RestController public class serverController { @GetMapping(“/getMsg”) public String getMsg(){ return “this is product’ msg”; } }

客户端编写

 /*** @author ccyang* @date 2018/7/1 16:13*/@RestController@Slf4jpublic class clientController {​@GetMapping("/getProductMsg")public String getProductMsg(){​RestTemplate restTemplate = new RestTemplate();String response = restTemplate.getForObject("http://localhost:8080/getMsg",String.class);log.info("response = {}" , response);return response;}​}​

然后去访问 http://localhost:8080/getMsg 即可。

因为服务端的 api 被硬编码在客户端,因此有两个缺点: – 当注册中心有很多服务时,我们可能不知道我们需要的服务由谁提供、api是多少,因此就可能无法调用到服务。 –当某个服务部署了多个,例如 api 是: “localhost:9080/getMsg,localhost:9081/getMsg “,那么此时就需要负载均衡,这种硬编码显然不符合场景。

  1. 第二种方式: service端代码依旧,客户端通过 LoadBalancerClient 来获取应用名,进而获取地址和端口,在格式化拼接地址,从而调用 product服务。如下:

    /**

    • 测试获取 product服务的msg

    • @author ccyang

    • @date 2018/7/1 16:13 */ @RestController @Slf4j public class clientController {

      @Autowired private LoadBalancerClient loadBalancerClient;

      @GetMapping(“/getProductMsg”) public String getProductMsg(){

        RestTemplate restTemplate = new RestTemplate();ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");  // serviceId 为提供服务的应用名String url = String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort() + "/getMsg");String response = restTemplate.getForObject( url, String.class);log.info("response = {}" , response);return response;123456

      } }

缺点是每次调用服务都要这样写,编码很麻烦。

  1. 第三种方式 通过 @LoadBalanced,可在restTemplate 直接使用应用名字。

    @Component public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }

    @RestController @Slf4j public class clientController {

     @Autowiredprivate RestTemplate restTemplate;​@GetMapping("/getProductMsg")public String getProductMsg(){​String response = restTemplate.getForObject( "http://PRODUCT/getMsg", String.class);  // 通过应用名进行访问log.info("response = {}" , response);return response;}12345678910

    }

三、使用 Feign 的方式进行通信
  • 声明式 REST客户端(伪 RPC)

  • 采用了基于接口的注解

先看看如何使用 Feign: \1. 添加依赖

 <!-- add feign , note: must add version --><dependency><groupId>org.springframework.cloud</groupId ><artifactId>spring-cloud-starter-feign</artifactId><version>1.4.4.RELEASE</version></dependency>​2. 添加注解到主类上​​@EnableFeignClients​3. 定义要调用的接口​​@FeignClient(name = "product")  // 服务名public interface ProductClient {​@GetMapping("/getMsg")  // 这里要和 Product服务提供的接口一致String productMsg();​}​​4. 在该使用的地方使用注解中提供的方法​​@RestController@Slf4jpublic class clientController {​@Autowiredprivate ProductClient productClient;  // 有报错,不影响@GetMapping("/getProductMsg")public String getProductMsg(){​String response = productClient.productMsg();log.info("response = {}" , response);return response;}}​

Feign 可以看做是一个伪 RPC,而且HTTP远程调用对开发者完全透明。

RestTemplate 内部使用 Ribbon做负载均衡 Feign 内部也是使用的Ribbon做负载均衡

参考:springCloud 服务间的两种通信方式_springcloud项目之间是如何通信的-CSDN博客

相关文章:

springcloud间通信的方式

在 Spring Cloud 中&#xff0c;主要有以下几种通信方式&#xff1a; 一、基于 HTTP 的 RESTful API 工作原理&#xff1a; 这是一种常见的通信方式&#xff0c;各个微服务通过发送 HTTP 请求来相互调用。服务提供者暴露 RESTful API 接口&#xff0c;服务消费者通过 HTTP 客户…...

【C++ Qt day9】

2、将day1做的登录界面升级优化【资源文件的添加】 3、 使用手动连接&#xff0c;将登录框中的取消按钮使用第2种方式的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上…...

中国传媒业人工智能应用发展图谱2024

易观分析&#xff1a;传媒产业是指以传播各类信息、知识为核心&#xff0c;通过多种媒介形式进行内容生产、发布和分发的综合性产业。技术的进步和应用对于传媒产业发展变革起到了核心驱动力的作用&#xff0c;2022年生成式AI进入应用爆发期&#xff0c;不仅带动了人工智能产业…...

RTX3060 FP64测试与猜想

RTX3060 FP64测试与猜想 一.小结二.查看FP64的峰值性能三.打满FP64、FP32的利用率,对比差异四.进一步证明pipe_fp64_cycles_active并不是2个fp64 core的metrics RTX3060 FP64测试与猜想 一.小结 RTX3060 compute capability为8.6,每个SM有2个FP64 core。每个cycle可输出2个fp…...

uniapp写移动端常见问题汇总

1. 手机顶部状态栏遮挡 写在需要的地方 <view class"status_bar" style"height: var(--status-bar-height); width: 100%;">2. 手机顶部状态栏字体颜色 // pages.json "statusBarStyle": "light",3. 背景覆盖全屏 page{widt…...

Linux运维排查常见故障_在tmp目录下有大量包含picture_ 的临时文件,每天晚上2 30需要对一天前的文件进行

echo“”>>/etc/security/limits.conf echo“*softnproc65535″>>/etc/security/limits.conf echo“*hardnproc65535″>>/etc/security/limits.conf echo“*softnofile65535″>>/etc/security/limits.conf echo“*hardnofile65535″>>/etc/secur…...

基于SpringBoot的智能制造云平台系统的设计与实现计算机毕设

一、选题背景与意义&#xff08;300字左右&#xff09; 根据工业4.0智能制造生态链中云工厂在实际生产当中的工作流程进行充分调研和整理出来的&#xff0c;描述最终用户在本系统中对于生产订单的处理、排产、以及生产的完整在线处理流程和业务需求的文档。 针对制造业而言&a…...

论文翻译:arxiv-2024 Benchmarking Benchmark Leakage in Large Language Models

Benchmarking Benchmark Leakage in Large Language Models https://arxiv.org/abs/2404.18824 在大型语言模型中基准测试泄露的基准测试 文章目录 在大型语言模型中基准测试泄露的基准测试摘要1 引言 图1&#xff1a;不同模型在基准测试的训练集上进行逐字训练相对于测试集以…...

十二、新版UI

一、UI Toolkit 这个组件是新版的UI系统 创建了一个新的UIBuild&#xff0c;在单独的场景中打开 未来Unity会以这个为基准。 缺点&#xff1a;目前没有Animator&#xff0c;做不了动画&#xff1b;没法加shader...

Path系统环境变量和CLASSPATH环境变量

Path系统环境变量 概述&#xff1a;Path环境变量不是java的&#xff0c;它隶属于windows操作系统 作用&#xff1a; PATH环境变量实际上就是给windows操作系统指路的。 在Path环境变量中有很多路径&#xff0c;路径和路径之间采用 分号(;) 隔开在DOS命令窗口中输入一条DOS命…...

自然语言处理系列六十六》对话机器人项目实战》对话机器人原理与介绍

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十六对话机器人项目实战》对话机器人原理与介…...

解码数字化转型顶层规划(附236页PPT:xx企业数字化转型项目顶层规划方案)

写在前面&#xff1a;PPT分享见后文~ 企业数字化转型顶层规划的制定是一个系统性的过程&#xff0c;需要综合考虑多个方面。以下是制定企业数字化转型顶层规划的一些关键步骤和要点&#xff0c;以供参考&#xff1a; 1、明确数字化转型战略定位&#xff1a; 将数字化转型作为…...

无需温度修正,测值准确可靠 GEO ACxxxx型振弦式锚索测力计

无需温度修正&#xff0c;测值准确可靠 GEO ACxxxx型振弦式锚索测力计 精准稳定的振弦式传感器&#xff0c;ACxxxx型振弦式锚索测力计&#xff0c;是长期监测预应力锚索压力的不二选择。采用特制应变计作为传感部件&#xff0c;无需温度修正&#xff0c;测值准确可靠。该传感器…...

shell脚本【一、 特殊变量/子串/特殊扩展变量/父子shell/内置命令、外置命令】

特殊变量 位置参数的获取 $0 获取shell脚本文件名&#xff0c;以及脚本路径&#xff1b;$n 获取shell脚本的第n个参数&#xff0c;n在1&#xff5e;9之间&#xff0c;如$1$2$9,大于9则需要写 ${10}&#xff1b;$# 获取执行的shell脚本后面的参数总个数&#xff1b;$* 获取she…...

服务器禁用远程(22)

vim /etc/ssh/sshd_config 修改 ListenAddress 0.0.0.0 为ListenAddress localhost 修改完后 重启一下sshd systemctl restart sshd 修改就生效了...

Docker 进阶构建:镜像、网络与仓库管理

目录 三. docker镜像构建 1. docker镜像结构 2. 镜像运行的基本原理 3. 镜像获得方式 4. 镜像构建 5. Dockerfile实例 6. 镜像优化方案 6.1. 镜像优化策略 6.2. 镜像优化示例:缩减镜像层 6.3. 镜像优化示例:多阶段构建 6.4. 镜像优化示例:使用最精简镜像 四. docke…...

opencv学习:图像轮廓识别及代码实现

图像轮廓 1.获取图像轮廓 cv2.findContours() 函数是 OpenCV 库中用于检测图像中轮廓的函数。它可以检测到图像中所有连通区域的边界&#xff0c;并返回这些轮廓的列表。从 OpenCV 3.4 版本开始&#xff0c;这个函数的返回值和参数有所变化&#xff0c;以下是详细的参数说明&…...

存储课程学习笔记2_借助内核插入一个文件系统,用文件夹下测试文件系统(mount文件系统到目录下是入口)

裸盘是如何能达到我们日常操作目录那样&#xff0c;按目录依次访问文件等&#xff0c;实际上就是基于裸盘上&#xff0c;用文件系统进行控制。 0&#xff1a;总结。 0&#xff1a;mount是入口&#xff0c;一个裸盘先赋予文件系统&#xff0c;然后mount后才可以用。 1&#xf…...

chunk-vendors.js 文件过大导致页面加载缓慢解决方案

1、路由懒加载 在 Webpack 中&#xff0c;我们可以使用动态 import语法来定义代码分块点 (split point)&#xff1a; import(./Foo.vue) // 返回 Promise如果您使用的是 Babel&#xff0c;你将需要添加 syntax-dynamic-import 插件&#xff0c;才能使 Babel 可以正确地解析语…...

【Postgresql】地理空间数据的存储与查询,查询效率优化策略,数据类型与查询速度的影响

注&#xff1a;使用postgresql数据库会用到PostGIS 扩展。 一、安装PostGIS 扩展 在 PostgreSQL 中遇到错误 “type geography does not exist” 通常意味着你的 PostgreSQL 数据库还没有安装 PostGIS 扩展&#xff0c;或者 PostGIS 扩展没有被正确地安装在你的数据库中。geo…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...