Spring Cloud Stream 编程模型的基础知识,很多老司机都不知道

public Order rece iveAndSendorder (Order order) throws

JsonProcessingException {

LOGGER. info(“Order received: ( }”, mapper .writeValueAsstring (order));

return service.process (order) ;

}

我们甚至可以想象诸如以下形式的实现,而不使用@StreamL istener。转换器(Transformer)模式将负责更改对象的形式。在这种情况下,它会修改两个order字段一status (状态)和price (价格)。

@EnableBinding (Processor.class)

public 需要zi料+ 绿色徽【vip1024b】

class OrderProcessor {

@Transformer (inputChannel = Processor. INPUT, outputChannel =

Processor. OUTPUT)

public Order process (final Order order) throws JsonProcessingException (

LOGGER. info (“Order processed: ()”, mapper .writeValueAsString (order));

products. forEach(p -> order . setPrice (order .getPrice() +

p.getPrice()));

if (order.getPrice() <- account .getBalance()) {

order。setStatus (OrderStatus。ACCEPTED) ;

account.setBalance (account .getBalance() - order .getPrice());

else|

order。setStatus (OrderStatus . REJECTED) ;

return order;

}

}

有条件地使用消息

========

假设开发人员希望以不同方式处理传入同一消息通道的消息,则可以使用条件分派。Spring Cloud Stream支持根据条件将消息分派给在输入通道上注册的多个@StreamListener方法。该条件是在@StreamListener注解的condition 属性中定义的Spring 表达式语言(Spring Expression Language, SpEL) 表达式。

public boolean send(Order order) {

Message orderMessage =

MessageBuilder . withPayload (order) .build() ;

orde rMessage . getHeaders () . put (“processor”, “account”) ;

return this. source. output ()。send (orderMessage) ;

}

以下就是一个示例实现,它定义了两个使用@StreamListener注解的方法,这些方法侦听同一主题。其中一个专用于从account-ervice 服务传入的消息,而第二个则专用于product-service服务。传入消息将根据带有processor名称的标头进行分派。

@SpringBootApplication

@EnableDi scoveryClient

@EnableBinding (Processor.class)

public class OrderApplication {

@StreamListener (target = Processor . INPUT, condition =

“headersI’processor’]=-‘account’”)

public void receiveorder (Order order) throws JsonProcessingException

LOGGER. info ("Order received from account: { } ",

mapper.writeValueAsString(order) );

// …

}

@StreamListener (target一Processor. INPUT, condition =

“headers[ ‘processor’]–‘product’”)

public void receiveOrder (Order order) throws JsonProcess ingException

LOGGER. info(“Order received from product: { }”,

mapper . writeValueAsString (order) );

// …

}

}

使用Apache Kafka

==============

在讨论Spring Cloud与消息代理的集成时,我们曾经多次提到过Apache Kafka。 但是,到目前为止,我们还没有基于该平台运行任何示例。事实上, RabbitMQ在使用SpringCloud项目时往往是首选,但是Kafka也值得我们关注。与RabbitMQ相比,它的一个优势是对分区的原生支持,而分区正是Spring Cloud Stream最重要的功能之一。

Kafka不是典型的消息代理。它是一个分布式流媒体平台。它的主要功能是允许开发人员发布和订阅记录(Record)流。它对转换或响应数据流的实时流应用程序特别有用。它通常作为由一个或多个服务器组成的集群运行,并可以在主题中存储记录流。

运行Kafka

=======

糟糕的是,Apache Kafka没有正式的Docker镜像。但是,我们可以使用一个非官方的,如Spotify共享的镜像。与其他可用的Kafka docker镜像相比,这个镜像可以在同一容器中运行Zookeeper和Kafka。以下是启动Kafka并在端口9092.上公开它的Docker命令。在端口2181上也可以使用Zookeeper.

docker run -d --name kafka -P 2181:2181 -P 9092:9092 --env

ADVERTISED HOST=192 .168.99.100 --env ADVERTISED PORT=9092 spotify/kafka

自定义应用程序设置

=========

要为应用程序启用Apache Kafka, 需要将spring- cloud-starter- stream-kafka启动程序包含在依赖项中。我们当前的示例非常类似于发布/订阅的示例,因为它使用了RabbitMQ发布/订阅,以及在前一篇“发布/订阅模型”中介绍过的分组和分区机制。唯一的区别在于依赖项和配置设置。

SpringCloudStream将自动检测并使用类路径中找到的绑定器。可以使用spring kafka.*属性覆盖连接设置。在这种情况下中,只需要将自动配置的Kafka客户端地址更改为Docker 机器地址192.168.99.100。 对Zookeeper 也应该执行相同的修改,因为Zookeeper将由Kafka客户端使用。

spring:

application:

name: order-service

kafka:

bootstrap-servers: 192.168.99.100:9092

cloud:

stream:

bindings:

output :

destination: orders-out

producer:

partitionKeyExpression: payload. customerId

partitionCount: 2

input:

destination: orders-in

kafka:

binder:

zkNodes: 192.168.99.100

在启动发现、网关和所有必需的微服务实例后,即可执行与先前示例相同的测试。如果一切配置正确,则应该在应用程序启动期间在日志中看到以下片段。其测试结果与基于RabbitMQ的示例完全相同。

16:58:30.008 INFO [,] Discovered coordinator 192.168. 99.100:9092

(id: 2147483647 rack: null) for group account.

16:58:30.038 INFO [,] Successfully joined group account with generation 1

16:58:30.039 INFO [,] Setting newly assigned partitions

[orders-out-0, orders-out-1] for group account

16:58:30.081 INFO [,] partitions assigned:

[orders-out-0, orders-out-1]

Kafka Streams API支持

====================

最后

我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

新鲜出炉的蚂蚁金服面经,熬夜整理出来的答案,已有千人收藏

还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。

新鲜出炉的蚂蚁金服面经,熬夜整理出来的答案,已有千人收藏

[orders-out-0, orders-out-1]

Kafka Streams API支持

====================

最后

我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

[外链图片转存中…(img-NdGtomKA-1710367890054)]

还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。

[外链图片转存中…(img-8RWdLwuS-1710367890054)]

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值