c语言编程笔录

首页 >   > 笔记大全

笔记大全

微服务架构中怎么进行服务间的数据交换

更新时间:2023-10-17

第一段

在微服务架构中,数据交换是很重要且必不可少的一个环节。因此,一种可行的方案是使用服务间通信的方式进行数据交换。主流的三种方式分别是: Restful API,消息队列和远程调用。


// 举一个 Restful API 的例子
const express = require('express')
const app = express()

// 获取用户信息
app.get('/user/:id', function(req, res) {
  const userId = req.params.id
  const userInfo = getUserInfoById(userId)
  res.send(userInfo)
})

第二段

在 Restful API 方案下,服务间通过 HTTP 协议进行通信交换数据,每个服务作为一个独立的节点来进行部署和运行。通过请求参数和请求头可以实现传输不同的数据格式,如JSON 和 XML。比如,使用 Restful API 来获取用户数据,我们就可以使用 GET 方法传入一个用户ID,服务端返回该用户的信息。


fetch('/user/123', {
    method: 'GET',
    headers: {
        'Content-Type': 'application/json'
    }
}).then(response => response.json())
.then(data => console.log(data))

第三段

而在使用消息队列进行服务间数据交换方案中,生产者将消息发送到队列,而消费者从队列中获取消息进行处理。这种方案优点是消息能够异步地处理,具有较好的并发性和伸缩性,可以自由地增加或减少服务节点,从而应对高并发场景。


// 举一个 RabbitMQ 的例子
const amqp = require('amqplib/callback_api')

amqp.connect('amqp://localhost', function(error0, connection) {
  if (error0) {
    throw error0
  }

  connection.createChannel(function(error1, channel) {
    if (error1) {
      throw error1
    }

    const queue = 'task_queue'
    const msg = 'Hello World!'

    channel.assertQueue(queue, {
      durable: true
    })

    channel.sendToQueue(queue, Buffer.from(msg), {
      persistent: true
    })

    console.log("Sent '%s'", msg)
  })

  setTimeout(function() {
    connection.close()
    process.exit(0)
  }, 500)
})

第四段

在使用远程调用进行服务间数据交换方案中,服务间通过RPC框架进行通信,客户端通过调用远程服务暴露出来的API实现和服务的交互。这种方案需要使用特定的工具,如Dubbo、Thrift、gRPC等各类远程调用框架,为了不增加过多的依赖,我们可以使用HTTP协议进行通信。


// 举一个 gRPC 的例子
const grpc = require('grpc')
const protoLoader = require('@grpc/proto-loader')

const PROTO_PATH = __dirname + '/hello.proto'
const packageDefinition = protoLoader.loadSync(PROTO_PATH)
const hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld

function sayHello(call, callback) {
  callback(null, {
    message: 'Hello ' + call.request.name
  })
}

function main() {
  const server = new grpc.Server()
  server.addService(hello_proto.Greeter.service, {
    sayHello: sayHello
  })
  server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
    server.start()
  })
}

main()