淘客返利 APP 架构演进史:从单体应用到 Service Mesh 的技术升级路径

淘客返利 APP 架构演进史:从单体应用到 Service Mesh 的技术升级路径

大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿!

在省赚客APP的发展过程中,架构经历了从单体应用到微服务,再到Service Mesh的重大演进。每一次架构升级都为系统的扩展性、可维护性和性能带来了显著提升。本文将详细介绍这一架构演进过程中的关键技术和实现细节。
淘客返利 APP 架构演进史:从单体应用到 Service Mesh 的技术升级路径_第1张图片

一、单体应用架构

在省赚客APP的早期阶段,我们采用的是传统的单体应用架构。所有功能模块都部署在一个应用中,代码高度耦合,部署和维护相对简单。

(一)单体应用的代码结构

package cn.juwatech.controller;

import cn.juwatech.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/user")
    public String getUserInfo() {
        return userService.getUserInfo();
    }
}
package cn.juwatech.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public String getUserInfo() {
        // 模拟用户信息获取逻辑
        return "User Info";
    }
}

(二)单体应用的局限性

随着业务的快速发展,单体应用的局限性逐渐显现:

  1. 扩展性差:所有模块都在一个应用中,难以独立扩展。
  2. 部署困难:每次更新都需要重新部署整个应用,效率低下。
  3. 技术栈受限:难以引入新技术,因为整个应用需要统一技术栈。

二、微服务架构升级

为了解决单体应用的局限性,我们将系统拆分为多个微服务,每个微服务负责一个独立的业务模块。

(一)微服务的拆分

我们将用户管理、订单处理、返利计算等模块拆分为独立的微服务。以下是微服务的代码结构:

1. 用户服务
package cn.juwatech.userservice.controller;

import cn.juwatech.userservice.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/user")
    public String getUserInfo() {
        return userService.getUserInfo();
    }
}
package cn.juwatech.userservice.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public String getUserInfo() {
        // 用户信息获取逻辑
        return "User Info";
    }
}
2. 订单服务
package cn.juwatech.orderservice.controller;

import cn.juwatech.orderservice.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {
    @Autowired
    private OrderService orderService;

    @GetMapping("/order")
    public String getOrderInfo() {
        return orderService.getOrderInfo();
    }
}
package cn.juwatech.orderservice.service;

import org.springframework.stereotype.Service;

@Service
public class OrderService {
    public String getOrderInfo() {
        // 订单信息获取逻辑
        return "Order Info";
    }
}

(二)微服务的通信

微服务之间通过HTTP REST API进行通信。我们使用Spring Cloud的Ribbon和Feign进行服务发现和调用。

package cn.juwatech.orderservice.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient("user-service")
public interface UserClient {
    @GetMapping("/user")
    String getUserInfo();
}
package cn.juwatech.orderservice.service;

import cn.juwatech.orderservice.client.UserClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderService {
    @Autowired
    private UserClient userClient;

    public String getOrderInfo() {
        String userInfo = userClient.getUserInfo();
        // 订单信息获取逻辑
        return "Order Info with " + userInfo;
    }
}

(三)微服务的优势

  1. 独立扩展:每个微服务可以根据自身需求独立扩展。
  2. 技术栈灵活:不同微服务可以使用不同的技术栈。
  3. 快速部署:更新一个微服务时,无需重新部署整个系统。

三、Service Mesh 架构升级

随着业务规模的进一步扩大,微服务的数量和复杂性不断增加。为了更好地管理微服务之间的通信和服务治理,我们引入了Service Mesh架构。

(一)Service Mesh 的引入

我们选择了Istio作为Service Mesh的实现。Istio通过Sidecar代理(如Envoy)管理微服务之间的通信,提供流量控制、服务发现、负载均衡、熔断等功能。

1. 部署Sidecar代理

在每个微服务的Pod中部署Envoy代理:

apiVersion: v1
kind: Pod
metadata:
  name: user-service
  labels:
    app: user-service
spec:
  containers:
  - name: user-service
    image: user-service:latest
  - name: istio-proxy
    image: docker.io/istio/proxyv2:1.10.0
    ports:
    - containerPort: 15001
2. 定义流量规则

通过Istio的VirtualService和DestinationRule定义流量规则:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: user-service
spec:
  hosts:
  - user-service
  http:
  - route:
    - destination:
        host: user-service
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: user-service
spec:
  host: user-service
  subsets:
  - name: v1
    labels:
      version: v1

(二)Service Mesh 的优势

  1. 流量控制:通过Istio的流量规则,可以灵活地控制微服务之间的流量。
  2. 服务发现:自动发现和注册微服务,无需手动配置。
  3. 安全性:通过Istio的认证和授权机制,增强微服务之间的通信安全性。
  4. 可观测性:提供详细的流量监控和日志,方便问题排查。

四、架构演进带来的效果

通过从单体应用到微服务,再到Service Mesh的架构演进,省赚客APP在多个方面取得了显著的提升:

  1. 系统稳定性:微服务的独立性和Service Mesh的流量控制机制,显著提升了系统的稳定性。
  2. 扩展性:微服务的独立扩展和Service Mesh的灵活流量管理,使得系统能够轻松应对业务增长。
  3. 开发效率:微服务的独立开发和部署,提高了开发效率,缩短了迭代周期。
  4. 运维效率:Service Mesh的自动化管理和监控功能,降低了运维成本,提高了运维效率。

五、未来展望

随着技术的不断发展,我们将继续优化省赚客APP的架构。例如,引入Serverless架构进一步提升系统的弹性扩展能力,探索更多智能化的流量调度策略,以及引入更多的DevOps实践来提高开发和运维的效率。

本文著作权归聚娃科技省赚客app开发者团队,转载请注明出处!

你可能感兴趣的:(架构)