谷歌gcp 远程计算机

我最近在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规模的消息代理连接起来。 顾名思义,该解决方案使用您期望的相同概念来实现发布/订阅机制。 可以将消息提交到主题,并且某个主题的所有订阅者都可以接收已发布的消息。


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

什么是Spring Integration?

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

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


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或前面提到的任何其他现代消息代理,那么必须为每个单个组件定义和配置适配器就变得很麻烦。


我们确实希望能够灵活地处理消息,并且希望利用消息代理,但是我们不想编写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

谷歌gcp 远程计算机

谷歌gcp 远程计算机_引导性GCP:带有Google Cloud Pub / Sub的Spring Cloud Stream相关推荐

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

    我最近在Sprint Central的工程博客上阅读了Josh Long的Bootiful GCP系列 ,特别喜欢关于使用Google Cloud的Pub / Sub的第四部分 . 我受到该系列的启发 ...

  2. chrome远程计算机_如何仅使用Chrome Web浏览器控制远程计算机

    chrome远程计算机 Going remote with friends and family is helpful when you need to show them how to do som ...

  3. chrome远程计算机_如何使用Google Chrome浏览器远程访问您的计算机

    chrome远程计算机 We have looked at some of the various ways in which remote access of your computer can b ...

  4. 谷歌手机pixel4 夜景_您应该购买Google Pixel 4a的5个理由

    谷歌手机pixel4 夜景 Let me get right into this. I'm going to list five reasons why one should pick up the ...

  5. remoteapp提示找不到远程计算机_知乎高赞:985 计算机视觉毕业后找不到工作怎么办?怒刷 leetcode,还是另寻他路?...

    (给算法爱好者加星标,修炼编程内功) 来源:新智元 [新智元导读]985研究生,学计算机视觉,出来后找不到工作?本文带你看看这个70万浏览量问题下的答案干货:找工作难,是因为前两年AI领域泡沫太大.然 ...

  6. 网关 跨域_好文推荐:微服务网关实战—Spring Cloud Gateway

    作者:博云BoCloud| 前言 作为Netflix Zuul的替代者,Spring Cloud Gateway是一款非常实用的微服务网关,在Spring Cloud微服务架构体系中发挥非常大的作用. ...

  7. openfeign调用服务是否需要网关_阿里新一代微服务解决方案:Spring Cloud Alibaba

    1.Spring Cloud Alibaba 是什么 Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合. ...

  8. springcloud架构特点_你想了解的「Spring Cloud」都在这里

    前言: 之前我们已经了解了「什么是微服务?」,现在我们开始了解「微服务」关键字下比较热门的「Spring Cloud」- 一.传统架构发展史 部分引用自:从架构演进的角度聊聊Spring Cloud都 ...

  9. spring解耦_云端时代的解耦:使用Spring Cloud Azure构建云端原生微服务

    spring解耦 重要要点 云本机应用程序应充分利用云的优势,而不仅仅是迁移到云中 通过在云计算环境上运行,微服务与云原生环境并驾齐驱 集中配置,服务发现,异步消息驱动和分布式跟踪是微服务基础架构 S ...

最新文章

  1. jsp中如何运行java_从上帝视角看Java如何运行
  2. vi格式化代码,撤销,重做,回退操作
  3. java 图片合成pdf_java将多张图片合并转为PDF
  4. [论文学习]Manifold Mixup和PatchUp的代码重新实现(实现即插即用且速度更快)
  5. vs2015网站发布时,设置页面合并后程序集的文件版本
  6. Mysql 查询返回结果空时间错误
  7. OpenCV_ cv2.imshow()
  8. 英雄联盟修复返回服务器异常,玩LOL英雄联盟在XP中服务器连接异常退出的恢复步骤...
  9. ERROR 1442 (HY000):because it is already used by statement which invoked this stored function/tr
  10. java - 建造者模式
  11. 软件因丢失.dll文件(未找到)而无法启动?
  12. 控制标记符分水岭分割算法 此博文包含图片
  13. ios14描述文件无法与服务器连接,苹果手机的信任在哪里设置(ios14描述文件与设备管理)...
  14. 项目经理不得不知道的里程碑计划及其重要用途
  15. 模型加速(矩阵元素优化和cuba使用)
  16. 2-6年“iOS开发”,跳槽简历思路(必备)
  17. c++ 数据结构——二叉树的构建及其应用,实现左右子树交换并输出前序递归结果
  18. coalesce---一个很有用的函数
  19. OceanBase 读写分离方案全攻略
  20. Docker-java api简介

热门文章

  1. 牛客题霸 [求平方根] C++题解/答案
  2. P1829-[国家集训队]Crash的数字表格/JZPTAB【莫比乌斯反演】
  3. P2579,jzoj2288-[ZJOI2005]沼泽鳄鱼【矩阵乘法】
  4. POJ2018-Best Cow Fences【实数二分答案】
  5. Redis进阶之持久化
  6. Oracle入门(十四.22)之创建DDL和数据库事件触发器
  7. 对于线程安全的集合类(例如Vector)的任何操作是不是都能保证线程安全
  8. java嵌套类与内部类
  9. vue使用element ui实现下拉列表分页的功能!!!
  10. 《走遍中国》珍藏版(十一)