TypeScript 语言 实战项目 分布式系统开发

TypeScript阿木 发布于 2025-05-28 8 次阅读


TypeScript实战项目:分布式系统开发

随着互联网技术的飞速发展,分布式系统已经成为现代软件开发的重要方向。TypeScript作为一种JavaScript的超集,提供了静态类型检查、模块化等特性,使得开发大型、复杂的应用程序变得更加容易。本文将围绕TypeScript语言,通过一个实战项目——分布式系统开发,探讨如何利用TypeScript构建高性能、可扩展的分布式系统。

项目背景

本项目旨在构建一个简单的分布式文件存储系统,该系统包括以下几个模块:

1. 客户端(Client):负责与服务器进行交互,上传、下载文件。
2. 服务器端(Server):负责处理客户端的请求,存储和检索文件。
3. 存储节点(Storage Node):负责存储文件数据。

技术栈

- TypeScript:用于编写跨平台的JavaScript代码。
- Node.js:作为服务器端运行环境。
- Express:用于构建服务器端应用程序。
- Socket.IO:用于实现实时通信。
- MongoDB:用于存储文件元数据。

项目结构


/dist
/client
index.ts
/server
index.ts
/storage
index.ts

客户端(Client)

客户端负责与服务器进行交互,实现文件的上传和下载功能。

1. 创建客户端项目

创建一个新的TypeScript项目:

bash
tsc --init

2. 编写客户端代码

在`/client/index.ts`文件中,编写以下代码:

typescript
import as http from 'http';
import as fs from 'fs';

const uploadFile = (filePath: string, fileName: string): void => {
const file = fs.createReadStream(filePath);
const req = http.request({
hostname: 'localhost',
port: 3000,
path: `/upload/${fileName}`,
method: 'POST',
headers: {
'Content-Type': 'application/octet-stream',
},
}, (res) => {
console.log(`Upload status: ${res.statusCode}`);
res.on('data', (data) => {
console.log(data.toString());
});
});

file.pipe(req);
req.on('error', (e) => {
console.error(`Problem with request: ${e.message}`);
});
};

const downloadFile = (fileName: string): void => {
const req = http.get(`http://localhost:3000/download/${fileName}`, (res) => {
const file = fs.createWriteStream(`./${fileName}`);
res.pipe(file);
file.on('finish', () => {
file.close();
console.log(`Downloaded ${fileName}`);
});
});

req.on('error', (e) => {
console.error(`Problem with request: ${e.message}`);
});
};

// 示例:上传文件
uploadFile('./example.txt', 'example.txt');

// 示例:下载文件
downloadFile('example.txt');

服务器端(Server)

服务器端负责处理客户端的请求,存储和检索文件。

1. 创建服务器端项目

创建一个新的Node.js项目,并安装所需的依赖:

bash
npm init -y
npm install express socket.io mongodb

2. 编写服务器端代码

在`/server/index.ts`文件中,编写以下代码:

typescript
import as express from 'express';
import as http from 'http';
import as socketIo from 'socket.io';
import as mongodb from 'mongodb';

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

const mongoClient = new mongodb.MongoClient('mongodb://localhost:27017');
const db = mongoClient.db('fileStorage');

app.use(express.static('./dist/client'));

io.on('connection', (socket) => {
console.log('Client connected');

socket.on('upload', (data) => {
const { fileName, fileData } = data;
const buffer = Buffer.from(fileData, 'base64');
const file = fs.createWriteStream(`./storage/${fileName}`);
file.write(buffer);
file.end();
socket.emit('uploadSuccess', { fileName });
});

socket.on('download', (fileName) => {
const file = fs.createReadStream(`./storage/${fileName}`);
file.pipe(socket);
});

socket.on('disconnect', () => {
console.log('Client disconnected');
});
});

mongoClient.connect().then(() => {
console.log('Connected to MongoDB');
server.listen(3000, () => {
console.log('Server running on port 3000');
});
});

存储节点(Storage Node)

存储节点负责存储文件数据。

1. 创建存储节点项目

创建一个新的Node.js项目,并安装所需的依赖:

bash
npm init -y
npm install express socket.io mongodb

2. 编写存储节点代码

在`/storage/index.ts`文件中,编写以下代码:

typescript
import as express from 'express';
import as http from 'http';
import as socketIo from 'socket.io';
import as mongodb from 'mongodb';

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

const mongoClient = new mongodb.MongoClient('mongodb://localhost:27017');
const db = mongoClient.db('fileStorage');

io.on('connection', (socket) => {
console.log('Storage node connected');

socket.on('storeFile', (data) => {
const { fileName, fileData } = data;
const buffer = Buffer.from(fileData, 'base64');
const file = fs.createWriteStream(`./storage/${fileName}`);
file.write(buffer);
file.end();
socket.emit('storeSuccess', { fileName });
});

socket.on('retrieveFile', (fileName) => {
const file = fs.createReadStream(`./storage/${fileName}`);
file.pipe(socket);
});

socket.on('disconnect', () => {
console.log('Storage node disconnected');
});
});

mongoClient.connect().then(() => {
console.log('Connected to MongoDB');
server.listen(3001, () => {
console.log('Storage node running on port 3001');
});
});

总结

本文通过一个简单的分布式文件存储系统项目,展示了如何利用TypeScript、Node.js、Express、Socket.IO和MongoDB等技术构建分布式系统。在实际项目中,可以根据需求扩展功能,如添加用户认证、文件加密、断点续传等。通过不断实践和优化,我们可以构建出高性能、可扩展的分布式系统。