12306架构发展历史

12306是中国铁路客户服务中心开发的在线购票系统。自2000年代初推出以来,12306经历了多次架构升级和技术演进,以满足不断增长的用户需求和提高系统性能。本文将带您了解12306的架构发展历史,并通过代码示例解释每个阶段的技术改进。

第一阶段:基于Java Servlet和JSP的单体应用

早期的12306系统采用了基于Java Servlet和JSP的单体应用架构。这种架构简单易懂,适合小规模网站。下面是一个简单的Java Servlet代码示例:

@WebServlet("/ticket")
public class TicketServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String trainNumber = request.getParameter("trainNumber");
        // 从数据库中查询余票信息
        List<Ticket> tickets = TicketDao.queryTickets(trainNumber);
        // 渲染余票信息到JSP页面
        request.setAttribute("tickets", tickets);
        request.getRequestDispatcher("/ticket.jsp").forward(request, response);
    }
}

在这个阶段,所有的业务逻辑和数据访问都集中在单个应用中。由于访问量的增加和业务复杂性的加大,这种架构存在一些问题,比如扩展性差、性能瓶颈等。

第二阶段:分布式架构和微服务

为了解决性能和扩展性问题,12306逐渐将架构演进为基于分布式和微服务的架构。这种架构将系统拆分成多个独立的服务,每个服务负责特定的功能。下面是一个简化的微服务示例:

@RestController
public class TicketService {
    @Autowired
    private TicketRepository ticketRepository;

    @GetMapping("/tickets")
    public List<Ticket> getTickets(@RequestParam("trainNumber") String trainNumber) {
        return ticketRepository.findByTrainNumber(trainNumber);
    }
}

在这个阶段,每个功能模块可以独立开发、测试和部署,使得系统更加灵活和可维护。同时,通过引入负载均衡器和缓存等技术,系统的性能和可用性得到了提升。

第三阶段:容器化和云原生

随着云计算和容器技术的发展,12306开始将架构演进为容器化和云原生架构。这种架构将应用程序打包为容器镜像,并借助容器编排工具部署和管理应用。下面是一个简化的Docker容器示例:

FROM openjdk:11-jre-slim
COPY target/ticket-service.jar /app/ticket-service.jar
CMD ["java", "-jar", "/app/ticket-service.jar"]

容器化架构具有高度的可移植性和弹性,可以快速部署和扩展系统。同时,通过使用云服务提供商的自动化工具,部署、监控和管理系统变得更加简单和高效。

第四阶段:微前端和无服务架构

12306正在向微前端和无服务架构演进。微前端架构将前端拆分成多个独立的微应用,每个微应用负责特定的功能。无服务架构将业务逻辑以函数的形式封装,并由云服务提供商动态运行和扩展。下面是一个简化的无服务函数示例:

exports.handler = async function(event) {
    const trainNumber = event.queryStringParameters.trainNumber;
    // 从数据库中查询余票信息
    const tickets = await TicketDao.queryTickets(trainNumber);
    // 返回余票信息
    return {
        statusCode: 200,
        body: JSON.stringify(tickets)
    };
}

这种架构具有更高的灵活性和可维护性,同时节省了开发和运维成本。它还可以根据实际需求自动伸缩,提供