????前言:
本篇博客主要以介绍微服务的架构知识点
????服务治理Ncaos
进行服务的自动化管理:包括服务注册、服务发现、服务提出。首先将服务在Ncaos注册中心进行注册,通过网关来接收前端的请求。
????服务调用
是指不同项目之间如何相互调用,通过restTlement可以实现,但是代码比较固定(地址是写死的),也可以通过feign插件实现服务调用,feign默认集成ribbon,并且Ncaos可以兼容Feign,实现负载均衡。
????服务网关
就像springMVC架构流程一样,由一个spring cloud gateway网关来统一处理前端的所有请求,公共问题、信息认证、可以处理跨域问题,以及可以进行过滤,因为每个模块可能开启的多个服务端口,可以基于Ribbon实现负载均衡(并且里面还有七种负载均衡相关策略,默认是轮询的,还有按权重进行分配的,或者随机的,或者选择最小连接数的,如果没有最小就就轮询)
????服务容错
使用阿里巴巴 Sentinel软件可以对用户请求进行限流(1秒中不超过2次,为了保证如果其中的一个服务垮掉了,其他服务不会不可用,就是雪崩效应,尽量做好容错。可以进行隔离、超时、限流、熔断、降级,对其他的服务进行保护。
使用过jmeter进行压力测试
????MQ消息队列
MQ功能亮点:进行异步解耦 ,就是在常规情况下,假设我需要进行注册用户信息,将请求发到后端,存入数据库处理后,我们需要发送一个验证码/短信进行验证,需要调用相关的api,执行其他逻辑,最后才能把结果响应给前台,中间会耽误很长的时间。现在就是想将数据存到mysql之后立马给用户做出反馈,对于验证码。短信的发送交给MQ去执行,异步的进行处理,用户体验感会更好。rocketMQ支持可靠同步发送、可靠异步发送、单向发送。
????Redis实现分布式锁
方式一:使用setnx命令
先与传统单体项目相比,sychronized、reentantLock因为锁的粒度太小了,所以对于分布式环境下不适用,可以采用Redis来实现分布式锁。因为Redis它有一个SetNX命令设置键值对(如果该键值对存在则此次操作无效,如果不存在,可以设置键值对进行加锁),锁超时可以释放,互斥的每次只有一个客户端拿到锁。
但是正常情况下会有很多问题:如果进程突然挂了,可能锁来不及释放,导致其他用户无法进入(所以需要设置过期时间,如果过期时间设置不合理,也会出问题,需要延长过期时间)
2.如果用户线程突然出异常了,可能执行不到释放锁的语句,所以使用的时候必须加上try{}finally{}确保锁会释放掉。
方式二:使用redission
redission是基于setnx命令进行封装的,将上面的问题都进行了预防,可以导入redission依赖,来实现分布式锁。但是仍然要使用finally进行锁的释放。