赞
踩
在了解微服务开发框架之前,首先应该知道微服务是什么?
微服务服务于分布式系统,是个分散的系统,将一个软件(项目)的不同功能,单独的部署在不同的微服务上,然后通过接口来调用该功能,相互之间按照规范接受和发送请求。
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、全局事务:分布式事务本身,由参与所有分支事务组成
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黑、白名单,权限控制、日志、原始数据以及动态路由等
搭建网关:
常见组件
配置:
新建一个gateway项目专门管理网关,再配置文件
gateway两种过滤器
七、单点登录
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,那就有表示已经登录了,反之则没有
八、服务容错
问题:
单个实例故障时,处理请求缓慢或者没有响应,导致上层调用它的服务实例也变慢,请求堆积,负载拉高。进一步导致更广泛的服务实例故障。
最后整个分布式系统大面积出现服务实例故障,形同异常雪崩,突然全线崩溃。这种由单个服务实例引发的级联故障称为服务雪崩。
常见的服务容错模式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。