微服务(微服务熬夜版)

发布于:2022-11-16 ⋅ 阅读:(15) ⋅ 点赞:(0) ⋅ 评论:(0)

目录

1.微服务简述

2.微服务架构

3.微服务设计及开发


1.什么是微服务

1.1 基本概念

        微服务架构就是将一个庞大的业务系统按照业务模块拆分成若干个独立的子系统,每个子系统都是一个独立的应用,它是一种将应用构建成一系列按业务领域划分模块的,小的自治服务的软件架构方式,倡导将复杂的单体应用拆分成若干个功能单一、松偶合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发,及持续集成与交付活动。

1.2 我们为什么要进行微服务开发

        微服务的优势

        1.2.1.将复杂的业务拆分成多个小的业务,每个业务拆分成一个服务,将复杂的问题简单化。
        1.2.2.微服务系统是分布式系统,业务与业务之间完全解耦,随着业务的增加可以根据业务再拆分,具有极强的横向扩展能力。面对高并发的场景可以将服务集群化部署,加强系统负载能力。
        1.2.3.服务间采用HTTP协议通信,服务与服务之间完全独立。每个服务可以根据业务场景选取合适的编程语言和数据库。
        1.2.4.微服务每个服务都是独立部署的,每个服务的修改和部署对其他服务没有影响。

2.微服务架构

        2.1 架构的演变:

        单体架构——>微服务架构

        2.2 spring-cloud

        微服务架构工具集,spring-cloud为我们提供了用于搭建微服务所需要的各种常见的模式的实现工具,其中主要包括:服务发现、 服务网关、负载均衡、服务容错、服务调用 等等。

3.微服务的设计与开发

        3.1 服务发现(找到服务实例地址的过程)如下图所示:

               这里我们引入了nacos ,home nacos官方为我们提供了文档资料,为各位提供了详尽的使用说明,这里小编就不和大家多啰嗦了。

        3.2 共享接口

        顾名思义,就是将项目的部分代码打包成jar包,导出给其他项目使用,简单来说就是通过将普通java项目打包成jar包,再通过依赖的形式引入我们需要的项目中使用的过程;这里我们统称两个单体项目为父子关系或者为子父关系,建立联系的过程我们称之为互认,依赖引入成功,我们通过注解的形式,我们就可以实现修改调用代码,测试调用了;

分享我在学习过程中的项目架构:

 

        3.3 配置管理

                          

        我们需要在nacos中添加以服务名命名的配置,通过我们在项目中创建的bootstrap.yaml文件配置调用,配置管理服务器中存放的了我们需要的一系列配置,从而实现了我们的灵活调用;

        3.4 分布式事务

        微服务架构下,一个业务操作必须经过多个服务,每个服务有自己独立的数据库,造成一个业务操作必然在多个数据库实例中执行,必须达到多个数据库实例同时成功或者失败的效果,才能实现这个业务操作。

        综上情况我们在项目中引入了分布式事务。

        分布式事务大体分为以下两阶段:

阶段一: 预备阶段

  • TC通知所有分支事务执行业务操作
  • 所有分支事务处理完成后告知TC

阶段二: 提交阶段

  • TC如果收到所有的分支事务提交都是完成,则全局事务提交,通知所有分支事务提交
  • TC如果有收到存在部分提交失败或者超时,则全局事务回滚,通知所有分支事务回滚

        我们常见的解决方案有如下几种:

        XA协议、TCC(Try-Confirm-Cancel)、SAGAS(适用长食物)、AT模式

        这里我们应用的是AT模式的解决方案,setate提供的AT模式解决方案朋友们可以自行搜索研究,下面我们直接进入到我们的应用阶段,具体步骤如下:

  1. 导seata-client的依赖,
  2. 每个数据库都需要建表undo_log表(AT模式关键点),
  3. 在我们处理业务进行回滚操作的类上加上@GlobalTransactional 注解,
  4. 配置   a.application.yml    b.file.conf (配置代码自行百度),
  5. 启动seata-server作为TC,双击/bin/seata-server.bat

        最后进行测试环节就可以了。

        3.5 服务网关(Service Gateway)(整个分布式系统的唯一入口 / 边缘服务

    职责:

  • 提供一些通用的公共功能
    • ip黑名单,封禁ip
    • ip白名单,允许哪些ip通过
    • 认证、授权,进行权限控制
    • 动态路由,根据请求路径,转发给相应的服务
    • 日志记录,原始数据
    • 性能统计
    • 协议转换, http -> dubbo/grpc/thrift
    • 限流
    • ...

        我们可以通过一系列配置及代码实现上述的功能,这里就不和大家多讲,懂得都懂;

        3.6 单点登录

        sso(single sign on)单点登录:隶属于同一个网站的多个不同的页面系统,只需要登陆一次,就可以访问任何其他的系统。

        3.7 服务容错

         服务雪崩       

        1. 服务提供者不可用(硬件故障,程序bug,缓存击穿,用户大量请求)

        2. 重试加大流量(用户重试,代码逻辑重试)

        3. 服务调用者不可用(同步等待造成的资源耗尽)

        常见的服务容错模式:

  1. 超时[调用方], 限制资源的占用,给资源(线程、cpu时间)占用设置上线
  2. 限流[提供方],控制进入系统的流量,不超过本机最大处理能力
  3. 仓壁模式[调用方/提供方],利用线程池或者信号量等其他手段进行资源隔离,确保不会产生级联故障

        sentinel实现 小编困了自行百度