マイクロサービストピック13-SpringCloud Stream(on)

序文

前の章では、Spring CloudGatewayについて説明しました

このセクションでは、マイクロサービストピックの内容、合計16のセクションを引き続き共有します。

このセクションの要点は次のとおりです。

  • 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:消費者

[外部リンク画像の転送に失敗しました。元のサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-qFl8tsgR-1597760291411)(assets / 1534339046352.png)]

メタプログラミング:リフレクション、関数プログラミング関数、ラムダ式、表現言語などのプログラミングに基づくプログラミング${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アーキテクトの成長への道

おすすめ

転載: blog.csdn.net/qq_34361283/article/details/108089180