本文将带你通过实战案例,手把手教学如何使用 SpringCloud 和 Netty 搭建一个可以支持千万级用户的即时通讯(IM)系统。
1. 项目介绍
我们将构建一个 IM 系统,支持以下功能:
- 用户注册与登录
- 好友管理
- 消息发送与接收
- 群聊功能
技术选型:
- SpringCloud:微服务架构
- Netty:高性能网络通信框架
- Redis:缓存和消息队列
- MySQL:持久化存储
2. 环境准备
在开始之前,确保你的开发环境已安装以下软件:
- JDK 8
- Maven
- Docker
- MySQL
- Redis
3. 项目结构
代码语言:txt复制im-system
├── im-api // API 网关
├── im-auth // 认证服务
├── im-user // 用户服务
├── im-friend // 好友服务
├── im-message // 消息服务
├── im-chat // 聊天服务
└── im-common // 公共模块
4. 核心代码实现
4.1 API 网关
创建 im-api
模块,编写 application.yml
配置文件:
server:
port: 8080
spring:
application:
name: im-api
cloud:
gateway:
routes:
- id: auth
uri: lb://im-auth
predicates:
- Path=/auth/**
- id: user
uri: lb://im-user
predicates:
- Path=/user/**
- id: friend
uri: lb://im-friend
predicates:
- Path=/friend/**
- id: message
uri: lb://im-message
predicates:
- Path=/message/**
- id: chat
uri: lb://im-chat
predicates:
- Path=/chat/**
4.2 认证服务
创建 im-auth
模块,实现用户注册与登录功能。以下是一个简单的注册接口:
@RestController
@RequestMapping("/auth")
public class AuthController {
@Autowired
private AuthService authService;
@PostMapping("/register")
public ResponseEntity<String> register(@RequestBody UserDto userDto) {
authService.register(userDto);
return ResponseEntity.ok("User registered successfully.");
}
}
4.3 用户服务
创建 im-user
模块,实现用户信息管理功能:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<UserDto> getUser(@PathVariable Long id) {
UserDto userDto = userService.getUserById(id);
return ResponseEntity.ok(userDto);
}
}
4.4 好友服务
创建 im-friend
模块,实现好友管理功能:
@RestController
@RequestMapping("/friend")
public class FriendController {
@Autowired
private FriendService friendService;
@PostMapping("/add")
public ResponseEntity<String> addFriend(@RequestBody FriendRequest friendRequest) {
friendService.addFriend(friendRequest);
return ResponseEntity.ok("Friend added successfully.");
}
}
4.5 消息服务
创建 im-message
模块,实现消息发送与接收功能:
@RestController
@RequestMapping("/message")
public class MessageController {
@Autowired
private MessageService messageService;
@PostMapping("/send")
public ResponseEntity<String> sendMessage(@RequestBody MessageDto messageDto) {
messageService.sendMessage(messageDto);
return ResponseEntity.ok("Message sent successfully.");
}
}
4.6 聊天服务
创建 im-chat
模块,使用 Netty 实现高性能的聊天功能:
public class ChatServer {
private int port;
public ChatServer(int port) {
this.port = port;
}
public void start() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new ChatServerHandler());
}
})
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture f = b.bind(port).sync();
f.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws Exception {
int port = args.length > 0 ? Integer.parseInt(args[0]) : 8081;
new ChatServer(port).start();
}
}
5. 部署与测试
使用 Maven 打包每个模块:
代码语言:txt复制mvn clean package
使用 Docker 构建和运行容器:
代码语言:txt复制docker-compose up -d
使用 Postman 或其他工具测试各个接口,确保功能正常。