Рассмотрим приложение для доставки пиццы, в котором два связанных контекста — доставка и покупка — обрабатываются отдельно. Ниже приведены несколько методов с примерами кода, которые можно реализовать в этом сценарии:
-
Общение через REST API:
- В контексте доставки откройте конечную точку REST API для получения информации о доставке из контекста покупки.
-
В контексте покупки используйте клиентскую библиотеку HTTP, чтобы отправить POST-запрос к конечной точке API контекста доставки.
Пример (на Python с использованием Flask и библиотек запросов):
# Delivery Context from flask import Flask, request app = Flask(__name__) @app.route('/api/delivery', methods=['POST']) def receive_delivery_info(): delivery_info = request.get_json() # Process the delivery information return 'Delivery information received successfully' # Purchase Context import requests delivery_info = { # Delivery information } response = requests.post('http://delivery-context/api/delivery', json=delivery_info)
-
Очередь сообщений или архитектура, управляемая событиями:
- Внедрите систему очередей сообщений или шину событий для облегчения асинхронной связи между контекстами доставки и покупки.
-
Контекст покупки может публиковать событие или сообщение, содержащее информацию о доставке, на которое контекст доставки может подписаться и соответствующим образом обработать.
Пример (с использованием RabbitMQ и библиотеки Pika Python):
# Purchase Context import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='delivery_queue') delivery_info = { # Delivery information } channel.basic_publish(exchange='', routing_key='delivery_queue', body=json.dumps(delivery_info)) connection.close() # Delivery Context import pika def process_delivery_info(ch, method, properties, body): delivery_info = json.loads(body) # Process the delivery information connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='delivery_queue') channel.basic_consume(queue='delivery_queue', on_message_callback=process_delivery_info, auto_ack=True) channel.start_consuming()
-
API-шлюз:
- Внедрите шлюз API для управления связью между контекстами доставки и покупки.
-
Контекст покупки отправляет запрос шлюзу API, который затем пересылает его соответствующей службе в контексте доставки.
Пример (с использованием Node.js и Express):
// API Gateway const express = require('express'); const axios = require('axios'); const app = express(); app.post('/api/delivery', async (req, res) => { const deliveryInfo = req.body; // Forward the delivery information to the delivery context const response = await axios.post('http://delivery-context/api/delivery', deliveryInfo); res.send(response.data); }); app.listen(3000, () => { console.log('API Gateway listening on port 3000'); }); // Purchase Context const axios = require('axios'); const deliveryInfo = { // Delivery information }; axios.post('http://api-gateway/api/delivery', deliveryInfo) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); });