在微服务之间最小化耦合性(loose coupling)是现代架构的一个主要原则。这可以通过异步交互(通过消息队列或事件总线),避免不必要的直接同步HTTP调用,以及明确的API合约来实现。
一种流行的方法是使用消息代理(RabbitMQ、Kafka、NATS),微服务发布其状态的事件,而订阅者对此做出反应。
在Node.js中使用Kafka发布和处理事件的示例:
// producer.js const { Kafka } = require('kafkajs') const kafka = new Kafka({ clientId: 'order-service', brokers: ['kafka01:9092'] }) const producer = kafka.producer() await producer.connect() await producer.send({ topic: 'orders', messages: [ { value: JSON.stringify({orderId: 123}) } ] }) await producer.disconnect() // consumer.js const consumer = kafka.consumer({ groupId: 'payment-group' }) await consumer.connect() await consumer.subscribe({ topic: 'orders', fromBeginning: true }) await consumer.run({ eachMessage: async ({ topic, partition, message }) => { const order = JSON.parse(message.value.toString()) // 处理订单 }})
关键特性:
问题: 如果这是一个大型项目,是否可以为多个微服务使用共享数据库?
不可以,这会违反独立性原则,导致紧耦合,降低可扩展性和可维护性。必须使用单独的数据库或模式。
问题: 在系统扩展时,服务之间的同步HTTP交互是否被认为是可接受的做法?
同步HTTP请求可扩展性差,可能成为瓶颈。建议使用异步机制,只有在绝对必要时才进行同步调用。
问题: 是否可以仅通过增加实例数量来扩展微服务,而不改变系统架构?
不可以,简单地增加实例数量并不能解决架构中的耦合性或瓶颈问题。需要分析瓶颈,实现队列、缓存以及职责分离。