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)]