当前位置:   article > 正文

关于微服务开发框架主流技术总结介绍_微服务开发技术

微服务开发技术

在了解微服务开发框架之前,首先应该知道微服务是什么?

微服务服务于分布式系统,是个分散的系统,将一个软件(项目)的不同功能,单独的部署在不同的微服务上,然后通过接口来调用该功能,相互之间按照规范接受和发送请求。

Spring_cloud

微服务架构架构工具集,提供了构建微服务所需要的各种常见模式的实现工具,下面我将列举一些典范:

一、服务发现:

        是微服务架构上最重要的一个环节。

        解决问题:服务之间相互调用功能,即需要通信,通过RPC(remote procedure call)来进行服务调用。(找到所需服务实例地址的过程)

        原理:一套服务发现机制的完成,首先得有一个完善得服务列表,所以第一步就是,将各个服务注册到一个服务注册中心去,这里我用的是nacos(Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理),将各个功能的服务注册在上面,并在各自服务配置中添加服务注册表,如下:

spring:
  application:
    name: user
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
 

二、服务调用(Feign)

        feign是spring_cloud框架提供的声明式(接口)服务调用组件,支持spring_mvc注解,集成了ribbon也支持负载均衡,

        解决问题:服务在被注册发现后,该如何调用的问题。

        原理:openFeign的@FeignClient可以发现@RequestMapping注解下的接口,通过spring-aop创建动态代理的方式来产生实现类,实现类中做负载均衡和调用其它服务。

      步骤:

1.在被调用的接口上加@FeignClient注解,生成代理类交给spring容器管理

 2、实现该接口

3、@EnableFeignClients扫描被@FeignClient标注的接口并生成代理类交给spring容器管理

 

 4、实现调用

 三、共享接口

解决微服务共享项目过多时,各个服务之间的依赖版本不通用问题。

实现:将一个服务,拆分为一个多模块的项目,将服务的接口与实现分离,放于专门的模块内,在接口上方加@FeignClient注解。后将服务的接口代码打jar包,导出给其它服务使用。在最外层建一个父级项目,专门放置各个服务的公共依赖版本及公共依赖,各个服务作为子项目。创建公共common项目,内放置公共工具类,在作为parent的外部依赖导入。

四、配置共享

        在使用微服务的开发过程中,不同的微服务,通常都有自己的数据库,但是像 Redis 等组件是不同服务间所共享的,如果要在不同的微服务中都需要加Redis等配置很麻烦,所以需要让不同的服务都共享同一个配置

实现:通过 extension-configs 的方式,添加一个配置文件bootstrap.yaml

内配置

  1. spring.application.name
  2. config-serverAddress

 五、分布式事务

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

        概念:

1、全局事务:分布式事务本身,由参与所有分支事务组成

2、分支事务:各个服务内部的事务

3、TC:事务协调者,协调各个分支之间的事务(同时提交,同时回滚)

4、TM:事务发起者,也是事务管理者,发起全局事务

5、RM:资源管理者,参与全局事务,维护分支事务

常见的解决分布式事务方案:

        1、XA协议

               多个数据库,同步打开事务,不提交,等待TC协调,等所有事务确认提交后,再提交

        缺点:消耗性能,由于网络通信时间较长,资源锁定时间长

        2、TCC模式

               Try-Confirm-Cancel

                一阶段==Try:尝试操作并锁定资源,

                二阶段==根据Try结果决定执行Confirm:确认操作执行(全部尝试成功),或者决定执行Cancel撤销操作

        3、SAGAS

        事务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。(使用于长事务)

        4、AT模式

        阶段一:预备阶段,

                1.执行业务

                2.获取并持久化回滚数据

                ·(1)seata代理数据源(类似spring_aop生成代理类),拦截所有的数据库操作

                ·(2)获取到操作执行前后的数据镜像,生成insertSQL,在每个服务的数据库中都加入一个表undo_log,  将数据镜像放入表中

                 ·(3)加入当前事务中,提交

        阶段二:提交阶段

                正常提交:删除undo_log表中数据

                异常回滚:

                seata提取对应的undo_log表中的记录,生成回滚数据

                执行回滚SQL,提交事务

        5、重试+幂等性校验

                幂等性校验,区分出请求是重复请求,一般通过外部的ID区分

                重试不能成功,需要告警,人工介入

        实现(此处为AT模式):

        1、每个数据库新建一张undo_log表

         2、加注解@GlobalTransactional

                

         3、配置

file.conf配置文件       

        transport {
  # tcp udt unix-domain-socket
  type = "TCP"
  #NIO NATIVE
  server = "NIO"
  #enable heartbeat
  heartbeat = true
  # the client batch send request enable
  enableClientBatchSendRequest = true
  #thread factory for netty
  threadFactory {
    bossThreadPrefix = "NettyBoss"
    workerThreadPrefix = "NettyServerNIOWorker"
    serverExecutorThread-prefix = "NettyServerBizHandler"
    shareBossWorker = false
    clientSelectorThreadPrefix = "NettyClientSelector"
    clientSelectorThreadSize = 1
    clientWorkerThreadPrefix = "NettyClientWorkerThread"
    # netty boss thread size,will not be used for UDT
    bossThreadSize = 1
    #auto default pin or 8
    workerThreadSize = "default"
  }
  shutdown {
    # when destroy server, wait seconds
    wait = 3
  }
  serialization = "seata"
  compressor = "none"
}
service {
  #transaction service group mapping
  vgroupMapping.my_test_tx_group = "default"
  #only support when registry.type=file, please don't set multiple addresses
  default.grouplist = "127.0.0.1:8091"
  #degrade, current not support
  enableDegrade = false
  #disable seata
  disableGlobalTransaction = false
}

client {
  rm {
    asyncCommitBufferLimit = 10000
    lock {
      retryInterval = 10
      retryTimes = 30
      retryPolicyBranchRollbackOnConflict = true
    }
    reportRetryCount = 5
    tableMetaCheckEnable = false
    reportSuccessEnable = false
  }
  tm {
    commitRetryCount = 5
    rollbackRetryCount = 5
  }
  undo {
    dataValidation = true
    logSerialization = "jackson"
    logTable = "undo_log"
  }
  log {
    exceptionRate = 100
  }
}

六、服务网关

整个分布式系统的唯一入口

职责:提供ip黑、白名单,权限控制、日志、原始数据以及动态路由等

搭建网关:

        常见组件

  • netflix-zuul 基于Servlet,tomcat
  • cloud-gateway 基于Reactive技术栈,底层是Netty
  • apache APISIX

配置:

新建一个gateway项目专门管理网关,再配置文件

 gateway两种过滤器

  • 网关过滤器 GatewayFilter 针对某一个route做请求的修改处理
  • 全局过滤器 GlobalFilter 针对所有的route,提供一些功能

七、单点登录

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

单点登录的优势:

  • 复用
  • 集成

常见实现方式

技术点:cookie,redis.
cookie客户端技术:每次发送请求带着cookie值进行发送

redis:根据key,得到值

1.在项目中的任何模块进行登录,登录之后,将数据放到两个地方
(1)redis中在key(生成随机的id值),value(用户数据)中放值
(2)cookie:把redis里面生成key值放到cookie中
2.访问项目中的其他模块时,发送请求带着cookie进行发送,获取cookie值,拿着cookie值做事情
 回去cookie获取值,到redis进行查询根据key进行查询,如果查询到了value,那就有表示已经登录了,反之则没有

八、服务容错

        问题:

        单个实例故障时,处理请求缓慢或者没有响应,导致上层调用它的服务实例也变慢,请求堆积,负载拉高。进一步导致更广泛的服务实例故障。

        最后整个分布式系统大面积出现服务实例故障,形同异常雪崩,突然全线崩溃。这种由单个服务实例引发的级联故障称为服务雪崩。

常见的服务容错模式

  1. 超时[调用方] ,实现原理:  限制资源的占用,给资源(线程、cpu时间)占用设置上线
  2. 限流[提供方],  实现原理:控制进入系统的流量,不超过本机最大处理能力
  3. 仓壁模式[调用方/提供方],实现原理:利用线程池或者信号量等其他手段进行资源隔离,确保不会产生级联故障
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/57423
推荐阅读
相关标签
  

闽ICP备14008679号