什么是微服务?它与传统单体架构有什么本质差异?

用“幼儿园分工”比喻理解微服务

1. 什么是微服务?

想象幼儿园里的“分工模式”:

  • 传统单体幼儿园
    只有1个老师,负责所有事情:教数学、讲故事、做饭、打扫卫生、照顾小朋友…
    如果老师生病,整个幼儿园都要关门。

  • 微服务幼儿园

    • 有很多“专科老师”:数学老师专门教数学,厨师专门做饭,保洁员专门打扫卫生…
    • 每个老师只负责自己擅长的事情,互相配合;
    • 如果某个老师生病,其他老师可以继续工作,幼儿园不会关门。

这就是“微服务”

  • 将一个大应用拆分成多个小服务,每个服务专注于单一功能;
  • 服务之间通过网络通信,互相协作;
  • 每个服务可以独立开发、部署和扩展。
2. 微服务与传统单体架构的本质差异

画一个“幼儿园对比图”:

┌───────────────────┐       ┌───────────────────┐  
│  传统单体架构     │       │  微服务架构        │  
│  (全能老师)     │       │  (专科老师团队)  │  
├───────────────────┤       ├───────────────────┤  
│  一个大应用       │       │  多个小服务        │  
│  所有功能在一起   │       │  每个服务专注一项  │  
│  部署在一起       │       │  独立部署          │  
│  牵一发而动全身   │       │  一个服务故障不影响整体 │  
│  扩展困难         │       │  按需扩展特定服务  │  
│  开发效率低       │       │  开发效率高        │  
└───────────────────┘       └───────────────────┘  
3. 微服务包含哪些部分?

画一个“微服务幼儿园”示意图:

┌───────────────────────────┐  
│      微服务架构            │  
├───────────────────────────┤  
│  服务:专科老师            │  
│  ├─ 用户服务:管小朋友档案  │  
│  ├─ 课程服务:安排课程     │  
│  ├─ 餐饮服务:做饭        │  
│  └─ 健康服务:量体温      │  
│                           │  
│  通信:老师对讲机          │  
│  ├─ HTTP API:普通对话    │  
│  ├─ RPC:紧急呼叫         │  
│  └─ 消息队列:留便条      │  
│                           │  
│  注册中心:老师通讯录      │  
│  ├─ 记录每个服务的位置    │  
│  └─ 服务上下线通知        │  
│                           │  
│  网关:幼儿园大门保安      │  
│  ├─ 统一入口              │  
│  └─ 权限检查              │  
└───────────────────────────┘  
4. 代码演示:微服务如何工作

下面是一个简单的微服务示例,用Hyperf框架实现:

  
// 1. 用户服务(就像幼儿园的“小朋友档案管理老师”)
// 文件名:user-service/app/Controller/UserController.php
namespace UserService\Controller;

class UserController {
    /**
     * 获取用户信息
     * 就像老师查询某个小朋友的档案
     */
    public function info($id) {
        // 从数据库获取用户信息
        $user = [
            'id' => $id,
            'name' => '小明',
            'age' => 5,
            'class' => '大班',
        ];
        return $user;
    }
}

// 2. 课程服务(就像幼儿园的“课程安排老师”)
// 文件名:course-service/app/Controller/CourseController.php
namespace CourseService\Controller;

class CourseController {
    /**
     * 获取用户课程表
     * 就像老师查询某个小朋友的课程安排
     */
    public function schedule($userId) {
        // 调用用户服务获取用户信息(通过HTTP或RPC)
        $userService = new \GuzzleHttp\Client(['base_uri' => 'http://user-service']);
        $response = $userService->get("/users/{$userId}");
        $user = json_decode($response->getBody(), true);
        
        // 根据用户年级安排课程
        $schedule = [
            'Monday' => ['数学', '语文'],
            'Tuesday' => ['英语', '美术'],
            // ...
        ];
        
        return [
            'user' => $user,
            'schedule' => $schedule,
        ];
    }
}

// 3. API网关(就像幼儿园的“大门保安”)
// 文件名:gateway/app/Controller/ApiController.php
namespace Gateway\Controller;

class ApiController {
    /**
     * 统一API入口
     * 就像保安接收所有外来请求
     */
    public function dispatch($service, $action, $params) {
        // 根据服务名选择对应的微服务
        $url = "http://{$service}-service/{$action}";
        
        // 转发请求
        $client = new \GuzzleHttp\Client();
        $response = $client->post($url, ['json' => $params]);
        
        return json_decode($response->getBody(), true);
    }
}
5. 微服务的底层原理

用“快递系统”比喻:

  1. 快递公司(微服务平台)

    • 有多个部门(服务):收件部、运输部、分拣部、配送部…
    • 每个部门只负责自己的工作,通过传送带(通信协议)连接;
  2. 快递流程(服务调用)

    • 客户(客户端)把包裹(请求)送到收件部(API网关);
    • 收件部扫描包裹(解析请求),贴上标签(路由信息);
    • 包裹通过传送带(网络)送到分拣部(服务发现);
    • 分拣部根据标签(服务名),把包裹送到对应的配送部(目标服务);
    • 配送部把包裹送到目的地(执行服务逻辑);
    • 结果通过同样的路径返回给客户。

技术细节

  • 服务注册与发现:服务启动时向注册中心注册自己的地址;
  • 负载均衡:当有多个相同服务时,自动选择合适的实例;
  • 服务熔断与限流:当服务故障时,自动熔断或限制请求;
  • 配置中心:统一管理所有服务的配置;
  • 分布式日志:收集和分析所有服务的日志。
6. 微服务的使用场景
  • 大型应用:当单体应用变得庞大、难以维护时;
  • 需要快速迭代:微服务允许团队独立开发和部署;
  • 高可用性要求:一个服务故障不影响整体;
  • 按需扩展:只扩展需要的服务,节省资源;
  • 多团队协作:不同团队负责不同服务,减少冲突。
思维导图:微服务
┌───────────────────┐  
│     微服务        │  
│  (专科老师团队) │  
├───────────────────┤  
│  核心组件:       │  
│  ├─ 服务          │  
│  ├─ 通信协议      │  
│  ├─ 注册中心      │  
│  ├─ 网关          │  
│  └─ 监控系统      │  
│                   │  
│  与单体差异:     │  
│  ├─ 拆分方式      │  
│  ├─ 部署方式      │  
│  ├─ 扩展能力      │  
│  └─ 容错能力      │  
│                   │  
│  使用场景:       │  
│  ├─ 大型应用      │  
│  ├─ 快速迭代      │  
│  ├─ 高可用性      │  
│  ├─ 按需扩展      │  
│  └─ 多团队协作    │  
└───────────────────┘  
流程图:微服务调用流程
客户端 → API网关 → 服务发现 → 负载均衡 → 目标服务 →  
↓                          ↑  
处理请求 → 返回结果 → 网关返回客户端  
总结:微服务是“分工协作的智慧”

微服务就像幼儿园的“专科老师团队”:

  • 通过分工,让每个老师专注于自己擅长的事情(单一职责);
  • 通过对讲机(通信协议),老师们可以互相配合完成复杂任务;
  • 即使某个老师请假,其他老师仍然可以继续工作(高可用性)。

通过合理拆分和组织微服务,我们可以构建出更加灵活、可扩展、易维护的大型应用,就像幼儿园有了完善的分工体系,能更好地照顾和教育小朋友一样!

你可能感兴趣的:(微服务架构,架构,微服务,云原生)