引导性GCP:带有Google Cloud Pub / Sub的Spring Cloud Stream

我最近在Sprint Central的工程博客上阅读了Josh Long的Bootiful GCP系列 ,特别喜欢关于使用Google Cloud的Pub / Sub的第四部分 。 我受到该系列的启发,同时我还在为我的一个新项目评估Spring Cloud Stream。 我以为,我会继续讨论乔希(Josh)停下的那篇文章。 本文介绍了如何将Spring Cloud Stream与Google Cloud Pub / Sub一起使用,以实现简单的生产者和使用者应用程序。

介绍

如果您之前阅读过Josh的文章,则可以安全地跳过此部分。 如果您还没有这样做,请不用担心,我将在此处快速总结一些关键点。

什么是Google Cloud Pub / Sub?

Google通过以下方式定义发布/订阅 。

Cloud Pub / Sub将面向企业消息的中间件的可伸缩性,灵活性和可靠性带到了云中。 通过提供将发送者和接收者分离的多对多异步消息传递,它可以在独立编写的应用程序之间进行安全且高度可用的通信。

https://cloud.google.com/pubsub/docs/overview

简而言之,Pub / Sub是Google的解决方案,用于支持开发人员将应用程序组件与Google规模的消息代理连接起来。 顾名思义,此解决方案使用您期望的相同概念来实现发布/订阅机制。 可以将邮件提交到主题,并且某个主题的所有订阅者都可以接收已发布的消息。

Google Cloud Pub / Sub

在这里需要强调的是,Pub / Sub为每个提交的消息至少提供一次传递。 如果要确保只发送一次消息,则必须自己照顾。

什么是Spring Integration?

Spring Integration是其投资组合中的一个Spring项目。 整篇文章甚至整本书都可以写在上面,因为它本身就是一个巨大的框架。 总之,Spring Integration是一个框架,可以帮助您使用EIP模式设计和集成应用程序。 Spring Integration构建的两个最基本的原语是Message<T>MessageChannel 。 在这方面,开发人员可以使组件彼此分离和隔离。 您可以想到这种机制,就好像Spring Integration将以某种方式甚至不需要组件彼此了解而是通过交换消息来进一步依赖注入的想法一样。

通道可以将组件彼此连接,如果它们位于相同的JVM中,或者即使它们是由网络分布和分隔的。 此时,要了解的相关概念是什么是通道适配器。 它们基本上是用来将Spring Framework消息通过消息通道时转换为一段可由外部系统使用的数据。

Google Cloud Pub / Sub

Spring Integration提供了许多适配器,可以帮助开发人员连接数据库,消息代理和许多其他外部系统。 在这种情况下,将使用适配器向Google Cloud Pub / Sub提交消息或从Google Cloud Pub / Sub接收消息。 Spring Cloud GCP项目为Pub / Sub提供了入站和出站适配器,从Spring Integration消息流的角度来看,这使得消息交换变得透明。

如果您阅读Josh的文章 ,他的工作是他正在介绍Spring Integration,以一种干净,一致的方式使用Pub / Sub。 这意味着将删除PubSubTemplate的直接引用,因此,如果您想将该文章中的示例修改为例如RabbitMQ,您要做的就是相应地替换通道适配器。

什么是Spring Cloud Stream?

消息传递非常适合微服务世界,在微服务世界中,一组分布式组件相互通信。 由于消息和渠道是Spring Integration中的头等公民,因此非常适合。 另一方面,Spring Integration是专门为实现那些EIP模式而设计的。

但是,在现代应用程序开发中,我们不一定要与旧系统集成,在这种情况下,我们宁愿与RabbitMQ , Apache Kafka等现代消息代理集成,也要与GCP Pub / Sub集成。 就是说,就能够与各种外部系统集成而言,我们不需要Spring Integration的全部功能。 这种额外的灵活性要求我们配置适配器,而这是我们不需要的。 如果我们仅使用GCP Pub / Sub或前面提到的任何其他现代消息代理,那么必须为每个单个组件定义和配置适配器就变得很麻烦。

Google Cloud Pub / Sub

我们确实希望能够灵活地处理消息,并且希望利用消息代理,但是我们不想编写Spring Integration所需的太多代码。 Spring Cloud Stream建立在Spring Integration之上,并利用了相同的原语(例如消息和通道),但减轻了开发人员的负担,不必将这些组件连接在一起。 因为渠道是通过特定于中间件的Binder实现连接到外部代理的。

将Spring Cloud Stream与Google Cloud Pub / Sub结合使用

我想我已经充分讨论了Spring Cloud Stream,Spring Integration和Google Cloud Pub / Sub的背景。 现在该看一些代码了。 有两个非常简单的Spring Boot应用程序,它们交换一个简单的字符串作为消息的有效负载。 让我们从发布者开始。

发行人

这基本上是一个简单的控制器,它发送一个简单的String作为消息的有效负载。 如果您以前使用过Spring Integration,则发送部分没有什么特别的。

@RestController
public class PublisherController {private final MessageChannel outgoing;public PublisherController(Channels channels) {outgoing = channels.outgoing();}@PostMapping("/publish/{name}")public void publish(@PathVariable String name) {outgoing.send(MessageBuilder.withPayload("Hello " + name + "!").build());}}

有趣的是消息通道如何绑定到实际消息代理的资源。 在第6-8行中,注入了一个bean( Channels ),它似乎持有对传出消息通道的引用。

import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;public interface Channels {@OutputMessageChannel outgoing();}

Channels反过来只是一个接口,可以定义任意数量的消息通道并用@Input@Output标记。 Spring Cloud Stream负责实例化一个代理对象,该代理对象负责返回对MessageChannel对象的引用。

@EnableBinding(Channels.class)
@SpringBootApplication
public class PubsubPublisherApplication {public static void main(String[] args) {SpringApplication.run(PubsubPublisherApplication.class, args);}}

Spring Cloud Stream依赖于Spring Boot和Spring Integration。 所述@EnableBinding注释标记Channels作为一个可绑定接口和对一个逻辑绑定的域名( outgoing )与目的地。 目的地的含义因活页夹的不同而不同,对于发布/订阅,它意味着消息生产者的主题和消息消费者的订阅。 这些绑定可以在application.yml定义。

spring:cloud:stream:bindings:outgoing:destination: reservations

订户

订阅者比发布者更简单,它只是一个类。

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.messaging.Message;@Slf4j
@EnableBinding(Sink.class)
@SpringBootApplication
public class PubsubSubscriberApplication {public static void main(String[] args) {SpringApplication.run(PubsubSubscriberApplication.class, args);}@StreamListener(Sink.INPUT)public void handleMessage(Message<String> message) {log.info("Received: {}.", message.getPayload());}}

这里值得一提的是水槽是什么? 正如我们已经看到的, @EnableBinding可以采用接口,然后该框架隐藏了将入站和出站消息适配器连接到消息通道的复杂性,并且还配置了相关的基础结构。 大多数应用程序仅向单个通道发送消息或从单个通道接收消息。 这就是Spring Cloud Stream提供SourceSinkProcessor接口以帮助您减少代码的原因。 就是说,我们也可以为发布者使用Source而不是定义Channels ,但是我想展示框架的功能。

运行演示

为了能够运行示例,您需要完成以下步骤。

    1. 如果已经有一个,则可以跳过此步骤。

    2. 如果您不需要安装任何软件,我认为会更容易。 默认情况下, Google Cloud Shell随附了Google Cloud SDK ,Git,Maven和Java。

    3. 启用发布/订阅API

      由于Spring Cloud Stream是一个自以为是的框架,因此在其之上构建的应用程序将自行创建主题和订阅。 也就是说,在此处手动创建主题和订阅是可选的。 不过,您必须启用发布/订阅API。

      % gcloud services enable pubsub.googleapis.com
      % gcloud pubsub topics create reservations
      % gcloud pubsub subscriptions create reservations --topic=reservations
    4. 克隆

      % git clone https://github.com/springuni/springuni-examples.git
    5. 启动发布者

      % cd ~/springuni-examples/spring-cloud/spring-cloud-stream-pubsub-publisher
      % mvn spring-boot:run
    6. 启动订户

      Google Cloud Shell带有tmux支持,这也意味着它默认情况下会启动tmux会话。 当然可以禁用。 重要的一点是,您不必打开新的外壳,只需单击Ctrl-B和C即可打开一个新窗口。有关更多详细信息,请参阅Tmux键绑定 。

      % cd ~/springuni-examples/spring-cloud/spring-cloud-stream-pubsub-subscriber
      % mvn spring-boot:run
    7. 发送信息

      像以前一样再次打开一个新窗口并发送消息。

      % curl -XPOST http://localhost:8080/publish/test

      您应该看到订阅者收到它。

问题

  • 您认为如果启动更多订阅者会发生什么?
  • 他们都会收到同一条消息还是只收到其中一条?
  • 那为什么呢?

在下面发表评论,让我知道您的想法!

结论

我们已经了解了什么是Google Cloud Pub / Sub,什么是Spring Integration,以及为何Spring Cloud Stream建立在Spring Integration上以帮助开发人员更快地创建消息驱动的微服务的原因。 在上面的代码示例中,我进一步介绍了Josh的示例,并使用Spring Cloud Stream代替了Spring Integration,最终减少了更多代码。

翻译自: https://www.javacodegeeks.com/2018/12/bootiful-spring-cloud-stream.html

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

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

相关文章

【渝粤题库】陕西师范大学202241 金融市场学 作业(专升本)

《金融市场学》作业 一 名词解释 1&#xff0e;货币头寸   2&#xff0e;金边债券   3&#xff0e;二板市场 4&#xff0e;金融市场 5&#xff0e;投资基金 6&#xff0e;系统风险 7&#xff0e;外汇市场 8&#xff0e;货币市场共同基金 9&#xff0e;衍生证券 10&#x…

【渝粤题库】陕西师范大学210002儿童文学 作业(高起专、高起本、专升本)

《儿童文学》作业 单选题 1、构成作品音响效果的因素是象声词、韵律和&#xff08; &#xff09;。 2、幼儿文学作品用词的总要求是&#xff1a;具体、浅显、充分发挥&#xff08; &#xff09;作用 3、在儿童文学创作艺术手法的运用中应注意心理描写和&#xff08; &#xff…

db2 迁移mysql,mysql 迁移 db2

我该怎样迁移数据呢?如果用于非 IBM 平台的数据库模式与用于 DB2 的模式相同(或非常类似),那么可 以通过使用 IBM Migration Toolkit (MTK) 来完成数据迁移。因此......4. . 迁移应用程序 1.不同数据库的对象区别 Mysql/Sql Server->oracle 自增长 vs 序列 Oracle->DB2 …

jdbc和jdbc驱动_JDBC布尔兼容性列表

jdbc和jdbc驱动有趣的是&#xff0c;布尔类型只是在SQL标准后期才引入&#xff0c;即SQL&#xff1a;1999 。 即使在今天&#xff0c;并非所有数据库本身都支持BOOLEAN或BIT类型。 最重要的是&#xff0c;我们仍然可以在Oracle中等待一段时间。 这是2002年以来关于该主题的“问…

【渝粤题库】陕西师范大学300008 历史教学论

《历史教学论》作业 一、名词解释 1&#xff0e;历史课程标准 2&#xff0e;综合课型 3&#xff0e;讲述法 4&#xff0e;历史基础知识 5&#xff0e;历史教材 6&#xff0e;历史概念 7&#xff0e;复习课 8&#xff0e;讲解法 9&#xff0e;叙述法 10&#xff0e;绪论课 11&am…

【渝粤题库】陕西师范大学500013 物理教学论 作业(专升本)

《物理教学论》作业 一、简答题 1、中学物理教学应坚持哪些主要的教学原则&#xff1f; 2、适应新课程教学物理教师应具备怎样的智能结构&#xff1f; 3、中学生学习物理的主要思维特征是什么&#xff1f; 4、发展性课程评价体系的基本理念和原则是什么&#xff1f; 5、物理教学…

IDE日志分析方法pt。 1个

介绍 我认为大多数软件工程师都了解日志的重要性。 它们已成为软件开发的一部分。 如果无法解决问题&#xff0c;我们尝试在日志中查找原因。 对于一些简单的情况&#xff0c;当错误阻止应用程序打开窗口时&#xff0c;这可能就足够了。 您可以在日志中找到问题&#xff0c;然后…

ycms+php,CMS下载_建站大师 - 建站模板,CMS模板,网站开发

增加后台和用户中心可查看升级值的记录[12-14]增加后台为用户充值升级值的功能[12-14]增加后台列表的字段回调格式函数&#xff1a;联动菜单名称、单选字段名称、下拉字段名称、复选框名称[12-16]增加钩子接口&#xff1a;模块内容审核处理之后(module_verify_after)[12-17]增加…

【渝粤题库】陕西师范大学700011 新课程改革与生物教材研究

《新课程改革与生物教材研究》作业 一、选择题 1、1921年弗雷德里克班廷从狗的体内分离得到天然胰岛素。40多年后&#xff0c;首次人工合成结晶牛胰岛素的科学家是 A&#xff0e;中国人 B&#xff0e;加拿大人 C&#xff0e;美国人 D&#xff0e;德国人 2、轴突是神经细胞的 A&…

国家开放大学2021春1050金融理论前沿课题题目

教育 教育 试卷代号&#xff1a; 1050 2021年春季学期期末统一考试 金融理论前沿课题 试题&#xff08;开卷&#xff09; 2021年7月 一、名词解释&#xff08;每小题5分&#xff0c;共15分&#xff09; 1.骆驼评级体系&#xff1a; 2.经济数据偏差&#xff1a; 3.核心通货膨胀…

java运行构建期间出错_构建和运行Java 8支持

java运行构建期间出错尚未提供对Java 8的Eclipse支持。 如果要使用它&#xff0c;则必须构建它。 Eclipsepedia的JDT Core / Java8页面包含有关使用Eclipse Java开发工具 &#xff08;JDT&#xff09;中不断发展的Java 8支持源来设置开发环境的说明。 说明中缺少一些内容&#…

php ord函数 中文,php ord 函数与中文乱码解决方法_PHP教程

//a字符$str(pack(“a*”, “中国”));echo $str,””,strlen($str),”字节n”;getascill($str);//h字符$str(pack(“h*”, “fffe”));echo $str,””,strlen($str),”字节n”;getascill($str);//c字符$str(pack(“c*”, “55”,”56″,”57″));echo $str,””,strlen($str),…

从Commons CLI迁移到picocli

最初于2002年发布的Apache Commons CLI可能是使用最广泛的Java命令行解析器&#xff0c;但是它的API显示了它的年龄。 寻找具有最少样板代码的现代方法的应用可能对picocli感兴趣。 为什么要花麻烦的钱进行迁移&#xff0c;以及如何将基于Commons CLI的应用程序迁移到picocli&a…

怎么设置php的css颜色代码,CSS的文本字体颜色如何设置

这里要介绍的是网页设置颜色包含有哪些&#xff1b;网页颜色规定规范。1、常用颜色地方包含&#xff1a;字体颜色、超链接颜色、网页背景颜色、边框颜色2、颜色规范与颜色规定&#xff1a;网页使用RGB模式颜色网页中颜色的运用是网页必不可少的一个元素。使用颜色目的在于有区别…

QuickBooks和Sage数据导出器

许多中小企业都使用QuickBooks作为其会计模块。 同样&#xff0c;许多公司也使用Sage进行会计处理。 他们中的大多数人在需要从这些系统中导出数据时会遇到问题。 在线提供的许多连接器价格昂贵&#xff0c;无法满足确切的要求。 随附的是一些简短的代码段&#xff0c;这些代码…

php+easyui+上传文件,easyui 上传文件代码

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.IO;using BLL;using m Model;using System.Data;using System.Data.SqlClient;using System.Text;namespace Web.Handler{/// /// AddOppportunityHandler 的摘要说明/// pub…

java 8 集合分组_Java 8:按集合分组

java 8 集合分组在继续阅读Venkat Subramaniam的“ Java函数式编程 ”时&#xff0c;我到达了介绍Stream&#xff03;collect函数的那部分。 我们想收集一个人&#xff0c;按年龄分组并返回一张方便的地图&#xff08;年龄->人的名字&#xff09;。 要刷新&#xff0c;这是…

请编写一个php程序,(笔试题)php练习笔试题(一) 编写程序(请任选两题)

简答题1.写出5个以上你所知道的常用的Linux命令和它的功能cat&#xff0c;显示文件内容。cd&#xff0c;改变目录路径。cp&#xff0c;复制文件。find&#xff0c;查找文件。grep&#xff0c;搜索、过滤信息。ls&#xff0c;列出目录信息。more&#xff0c;分页显示。rm&#x…

python str translate,str.translate() --文本过滤和处理

问题: 想清除整个范围的字符&#xff0c;或者去掉音符1、使用str.translate()s python\fis\tawesome\r\n# 第一步是清理空格&#xff0c;可以先建立一个小型的转换表&#xff0c;然后使用reanslate()方法remap {ord(\t): ,ord(\f): ,ord(\r): None}a s.translate(remap)aO…

MicroProfile 2.2 BOM导入支持

MicroProfile 2.2刚刚发布&#xff0c;其中包含对Fault Tolerance&#xff0c;Open Tracing&#xff0c;Open API和Rest Client API的更新。 自2.2版以来&#xff0c;还支持使用BOM&#xff08;物料清单&#xff09;依赖项导入。 通过这种方法&#xff0c;我们可以在dependenc…