微服务1--服务架构

发布于:2025-04-16 ⋅ 阅读:(20) ⋅ 点赞:(0)

系统架构

单体应用架构

  • 特点:所有功能集中在一个应用中(如传统的 Spring Boot WAR 包)。

  • 适用场景:小型项目、快速验证阶段。

  • 优缺点

    • ✅ 开发简单,部署方便。

    • ❌ 扩展性差,技术栈耦合。

集群应用架构

  • 实现:

    • 无状态服务水平扩展

      • 通过负载均衡(Nginx/LVS)将流量分发到多个单体实例。

      • Session共享:Redis存储用户会话。

    • 数据库主从分离

      • 主库写,从库读(MySQL Replication)。

  • 优缺点

    • ✅ 提高并发能力,避免应用层单点故障

    • ❌ 代码仍为单体,维护复杂,数据主库压力大

 垂直应用架构

演进动机

  • 解决集群架构中业务耦合问题,按功能拆分独立应用。

实现方式

  • 垂直拆分:将单体按业务线拆分为多个独立应用(如电商拆分为用户中心、订单系统、商品系统)。

  • 每个应用有自己的数据库,避免全表扫描压力。

优缺点 

  • ✅ 业务解耦,数据库压力分散

  • ❌ 重复构建,跨系统调用复杂

微服务架构 

微服务架构是服务化思想的最佳时间方向和服务治理不断完善和交付链路逐步成熟后的自然产物。

微服务 

概念名词

服务治理

服务治理就是进行服务的自动化管理,其核心是服务的自动注册与发现。 

        服务注册:服务实例将自身服务信息注册到注册中心。 

        服务发现:服务实例通过注册中心获取到其中的服务实例的信息,通过这些信息去请求他们提供服务。

        服务剔除:服务注册中心将出问题的服务自动剔除到可用列表之外,使其不会被调用到。

服务调用

服务调用是指一个软件系统通过某种通信协议请求另一个软件系统提供特定服务的过程。

目前主流的远程调用技术有基于 HTTP 的 RESTful 接口以及基于 TCP 的 RPC协议。

服务网关

随着微服务的不断增多,不同的微服务一般会有不同的网络地址,外部客户端可能需要调用多个服务接口才能完成一个业务需求,如果让客户端直接与各个服务之间进行通信就会出现一系列的问题(跨域,认证)。

网关是一种在微服务架构中使用的服务器端组件,用于管理请求的转发和路由。API网关将API调用统一接入API网关层,由网关层统一接入和输出。

一个网关的基本功能有:统一接入、安全防护、协议适配、流量管控、长短链接支持、容错能力。

服务容错

服务容错是确保系统在部分服务出现故障时仍能继续运行的能力。

在微服务当中,一个请求经常会涉及到调用几个服务,如果其中某个服务不可用,没有做服务容错 的话,极有可能会造成一连串的服务不可用,这就是雪崩效应。 我们没法预防雪崩效应的发生,只能尽可能去做好容错。

链路追踪

随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。互联 网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程 语言来实现、有可能布在了几 千台服务器,横跨多个不同的数据中心。因此,就需要 对一次请求涉及的 多个服务链路进行日志记录,性能监控即链路追踪.

微服务调用

以商城系统为例:客户想订单服务发起一个下订单请求,这时在保存订单之前就需要先调用商品服务查询商品信息。
一般把服务的主动调用方称为服务消费者,把服务的被调用方称为服务提供者。

在这种情况下,订单订单微服务就是一个服务消费者, 商品微服务就是一个服务提供者。

实现方式

使用 RestTemplate 使用 http 方式远程访问
这种方式存在诸多问题:
1.一旦服务提供者地址变化,就要手动修改代码
2.如果是多个服务提供者,无法实现负载均衡
3.服务过多,人工维护调用关系困难且成本巨大。
@RestController
@RequestMapping("/order")
public class OrderController{

    @Autowired
    OrderService orderService;

    @Autowired
    RestTemplate restTemplate;
    
    @RequestMapping("/create/{pid}/{uid}/{num}")
    public Order createOrder(@PathVariable("pid") int pid, @PathVariable("uid")int uid, @PathVariable("num") int num){
        //核心代码
        Product p = restTemplate.getForObject("http://127.0.0.1:8091/product/get/"+pid, Product.class);
        User u = restTemplate.getForObject("http://127.0.0.1:8081/user/get/"+uid, User.class);
        Order order= null;
        if(p!=null){
            if(p.getStock()>=num){
                if(u!=null){
                    order = orderService.saveorder(pid,uid,num);
                }
            }
        }
        return order;
    }
}