ディレクトリナビゲーション
序文
前の章では、Spring CloudGatewayについて説明しました
このセクションでは、マイクロサービストピックの内容、合計16のセクションを引き続き共有します。
- マイクロサービストピック01-春のアプリケーション
- マイクロサービストピック02-SpringWebMVCビューテクノロジー
- マイクロサービストピック03-REST
- マイクロサービストピック04-SpringWebFluxの原則
- マイクロサービストピック05-SpringWebFluxアプリケーション
- マイクロサービストピック06-クラウドネイティブアプリケーション
- マイクロサービストピック07-SpringCloud構成管理
- マイクロサービストピック08-SpringCloudサービスディスカバリ
- マイクロサービストピック09-SpringCloudの負荷分散
- マイクロサービストピック10-SpringCloudサービスサーキットブレーカー
- マイクロサービストピック11-SpringCloudサービスコール
- マイクロサービストピック12-SpringCloud Gateway
- マイクロサービストピック13-SpringCloud Stream(on)
- マイクロサービストピック14-SpringCloud Bus
- マイクロサービストピック15-SpringCloudStreamの実装
- マイクロサービストピック16-SpringCloudの全体的なレビュー
このセクションの要点は次のとおりです。
- RabbitMQ
- Spring RabbitMQ
- Spring Boot RabbitMQ
Spring CloudStream関連のテクノロジー
Spring Cloud Streamは、マイクロサービスアプリケーションのメッセージ駆動型機能を構築するためのフレームワークです。Spring Bootに基づいて、独立した、本番環境に対応したSpringアプリケーションを作成できます。Spring Cloud Streamは、一部のベンダーのメッセージミドルウェア製品にパーソナライズされた自動化構成の実装を提供し、パブリッシュ/サブスクライブ、コンシューマーグループ、およびパーティションの3つのコアコンセプトを導入します。Spring Cloud Streamを使用することで、開発者はメッセージミドルウェアの使用の複雑さを効果的に簡素化でき、システム開発者はコアビジネスロジックの処理により集中できます。
例としてJava8ストリームを取り上げます。
Stream
.of(1, 2, 3, 4, 5) // 生产
.map(String::valueOf) // 处理
.forEach(System.out::println); // 消费
ここには合計で3つのIDがあります。
-
Publisher
:プロデューサー -
Subscriber
:プロセッサー -
Processor
:消費者
メタプログラミング:リフレクション、関数プログラミング関数、ラムダ式、表現言語などのプログラミングに基づくプログラミング${user.age}
SpringCloudデータフロー
上記のスチームストリーム処理とは異なり、Spring Cloud Data Flowは、アプリケーションに基づいて、生産、処理、消費の3つのプロセスを実装します。
各プロセス間で異なるプロセス終了番号が必要です。System.exit(N)を使用します。ここで、Nは可変整数であり、異なるプロセスを区別します。
Spring CloudStream統合RabbitMQ
ここでは、このトピックで以前に構築されたプロジェクトを使用します。
- spring-cloud-client-application
- spring-cloud-server-application
これに基づくRabbitMQの技術的実装:
1.Pomは構成によって異なります。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
2.構成項目。
ソースコードを参照しorg.springframework.cloud.stream.binder.rabbit.properties.RabbitBindingProperties
ます。SpringCloudとrabbitmqの双方向バインディングが次の構成で実現されていることを見つけるのは難しくありません。
## IP、端口、用户名、密码、虚拟主机
## 默认使用 / 的vhost,如果修改vhost,加在端口后即可,如 /testhost
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
# Spring Cloud Stream 配置
## 驱动的名字是 test2020
## spring.cloud.stream.bindings.${channel-name}.destination
## destination = topic
spring.cloud.stream.bindings.test2020.binder = rabbit
spring.cloud.stream.bindings.test2020.destination = test2020
ヒント、言語を学ぶため、ベルデンの真実を習得するために、ソースコードデザイナーは、SpringのさまざまなxxxTemplateによって実装されたxxxOperationsなど、前任者の経験に基づいてモデルを絶えず改善しています。
- JdbcTemplate:Springはjdbcを操作してデータベースに接続します。
- RedisTemplate:Springはredisを操作してキャッシュデータベースに接続します。
- RabbitTemplate:Springはウサギ接続メッセージミドルウェアを操作します。
- KafkaTemplate:SpringはKafka接続メッセージミドルウェアを操作します。
- RestTemplate:Springはリモート呼び出しのhttpリクエストをカプセル化します。
3.クライアントとサーバーはrabbitmqメッセージ通信を実装します。
クライアント構成
MessageChannelを使用してリクエストをカプセル化します
public interface SimpleMessageService {
@Output("test2020") // Channel name
MessageChannel test(); // destination = test2020
}
クライアントAPIを作成します。
@RestController
public class MessageController {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private SimpleMessageService simpleMessageService;
@GetMapping("/stream/send")
public boolean streamSend(@RequestParam String message) {
// 获取 MessageChannel
MessageChannel messageChannel = simpleMessageService.test();
Map<String, Object> headers = new HashMap<>();
headers.put("charset-encoding", "UTF-8");
headers.put("content-type", MediaType.TEXT_PLAIN_VALUE);
return messageChannel.send(new GenericMessage(message, headers));
}
}
次に、スタートアップアイテムがアクティブになり、SimpleMessageServiceが導入されます。
@EnableBinding(SimpleMessageService.class) // 激活并引入 SimpleMessageService
サーバー構成
同様に、SubscribableChannelを使用して、受信クラスをカプセル化します。
public interface SimpleMessageReceiver {
@Input("test2020")
SubscribableChannel test();
}
次に、クラスのアクティブ化を開始し、SimpleMessageReceiverを導入します。
@EnableBinding(SimpleMessageReceiver.class) // 激活并引入 SimpleMessageReceiver
次に、メッセージ処理でべき等を必ず実行してください。
@Autowired
private SimpleMessageReceiver simpleMessageReceiver;
@PostConstruct
public void init() {
// 接口编程
// 获取 SubscribableChannel
SubscribableChannel subscribableChannel = simpleMessageReceiver.gupao();
subscribableChannel.subscribe(message -> {
MessageHeaders headers = message.getHeaders();
String encoding = (String) headers.get("charset-encoding");
String text = (String) headers.get("content-type");
byte[] content = (byte[]) message.getPayload();
try {
System.out.println("接受到消息:" + new String(content, encoding));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
});
}
@StreamListener("test2020") // Spring Cloud Stream 注解驱动
public void onMessage(byte[] data) {
System.out.println("onMessage(byte[]): " + new String(data));
}
@StreamListener("test2020") // Spring Cloud Stream 注解驱动
public void onMessage(String data) {
System.out.println("onMessage(String) : " + data);
}
@StreamListener("test2020") // Spring Cloud Stream 注解驱动
public void onMessage2(String data2) {
System.out.println("onMessage2(String) : " + data2);
}
@ServiceActivator(inputChannel = "test2020") // Spring Integration 注解驱动
public void onServiceActivator(String data) {
System.out.println("onServiceActivator(String) : " + data);
}
注:同じプログラミングモデルが繰り返し
@StreamListener
実行されます。たとえば、異なるプログラミングモデルが順番に実行されます。
5.開始してテストします
spring-cloud-client-applicationプロジェクト、spring-cloud-server-applicationプロジェクト、zookeeperサービス、rabbitmqサービスを別々に開始します。rabbitmqサービスの構築については、以前のrabbitmqブログを参照してください。
ここで、
http:// localhost:8888 / stream / send?message = testに
アクセスして、RabbitMQ管理ページにアクセスします。
追記
このセクションのコードアドレス:Spring Cloud Steam
アーキテクチャに関する知識の詳細については、Javaに関するこのシリーズの記事に注意してください:Javaアーキテクトの成長への道