微服务1--服务架构

系统架构

单体应用架构

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

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

  • 优缺点:

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

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

集群应用架构

  • 实现:

    • 无状态服务水平扩展

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

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

    • 数据库主从分离

      • 主库写,从库读(MySQL Replication)。
  • 优缺点:

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

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

垂直应用架构

演进动机

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

实现方式

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

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

优缺点

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

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

微服务架构

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

微服务

概念名词

服务治理

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

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

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

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

服务调用

服务调用是指一个软件系统通过某种通信协议请求另一个软件系统提供特定服务的过程。
目前主流的远程调用技术有基于 HTTP 的 RESTful 接口以及基于 TCP 的 RPC协议。

服务网关

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

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

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

服务容错

服务容错是确保系统在部分服务出现故障时仍能继续运行的能力。
在微服务当中,一个请求经常会涉及到调用几个服务,如果其中某个服务不可用,没有做服务容错 的话,极有可能会造成一连串的服务不可用,这就是雪崩效应。 我们没法预防雪崩效应的发生,只能尽可能去做好容错。

链路追踪

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

微服务调用

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

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

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

java 复制代码
@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;
    }
}
相关推荐
Norris Huang25 分钟前
Kafka Connect 与 Flink CDC 写入 Iceberg:Upsert 的代价,以及 S3 Tables 的真正价值
分布式·flink·kafka
Thomas.Sir33 分钟前
第34课:微服务Docker容器化部署 & 生产环境上线
spring cloud·docker·微服务
我就是不信44 分钟前
集群高并发环境下如何保证分布式唯一全局ID生成?
分布式
黄俊懿21 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
wangjialelele1 天前
一文梳理 Spring Cloud 核心组件:Eureka、Nacos、OpenFeign、LoadBalancer 与 Gateway
java·spring boot·spring·spring cloud·微服务·nacos
草莓熊Lotso1 天前
【C++ 基于微服务的即时通讯系统】Elasticsearch 从安装到 C++ 客户端二次封装全落地
linux·网络·数据库·c++·elasticsearch·微服务
大菠萝爱上小西瓜1 天前
基于 Spark + Iceberg 湖仓一体的 Netflix 流媒体用户行为全链路数仓与 ALS 智能推荐决策系统(含穿透下钻大屏)
大数据·分布式·spark
吴建旭 智宅焕1 天前
智能家居售后服务体系的架构设计:分布式售后风险的集中式兜底方案
分布式·智能家居
黄鹂鸟科技1 天前
软件定制开发设计要点:从需求梳理、原型确认到敏捷交付与持续维护
后端·物联网·系统架构
银河技术1 天前
从脚本到 Operator:用 Go 构建可靠的微服务自动扩缩容控制器
开发语言·微服务·golang