微服务知识讲解
微服务知识讲解
微服务
一、划分
- 根据耦合度低的功能服务进行划分。
治理
- 单体转微服务
一开始是做ERP的项目使用的是单体应用,后来积累了一定的行业经验转做SAAS产品,因为要考虑到高可用和灵活性所以转做微服务架构。
- 主要内容
Consul服务注册与发现,Kong网关反向代理,Apollo分布式配置中心,SkyWalking链路追踪(主要是检测服务间相互调用时的异常和性能问题)。
- 读写分离的好处
防止高并发、高可用写服务报错不会影响读服务、提高性能读数据库加索引不会 影响写数据库
- 防止高并发:读写分离可以更好地应对高并发的情况。写操作通常比读操作更消耗资源,将它们分开可以防止读操作被写操作阻塞。
- 高可用:如果写服务出现问题,不会影响读服务,这样可以确保读操作的高可用性。
- 提高性能:读数据库可以进行特定的优化(如添加索引)来提高查询性能,而不会影响写数据库的性能。
通信
- HttpClint进行服务间的接口相互调用。
- RabbitMQ:是一种消息机制,最大的优点就是有顺序,我们在把数据库的数据更新到redis的过程中,redis有可能会引发异常,如果异常的话,这时候我们消息队列就会把两者之间的操作先记录在消息队列中,等到redis恢复正常的时候,再继续执行这些操作。
部署
自动化部署Azure DevOps通过Docker进行部署到linux云服务器上。
Docker基础命令:
docker run: 用于运行一个容器。
docker ps: 列出所有正在运行的容器。-a: 列出所有容器,包括停止的容器。
docker stop: 停止一个或多个正在运行的容器。
docker rm: 删除一个或多个容器。
docker images: 列出本地的所有 Docker 镜像。
docker rmi: 删除一个或多个 Docker 镜像。
docker pull: 从 Docker Hub 或其他注册中心拉取一个镜像或仓库。
docker build: 使用 Dockerfile 构建一个镜像。
docker exec: 在运行的容器中执行命令。
.Net服务通过Docker发布的过程:
先在服务中创建Dockerfile的文件。
然后构建Docker镜像
运行Docker容器
设计模式
创建型模式:
单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式
结构型模式:
适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式
行为型模式:
责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察 者模式、状态模式、策略模式、模板方法模式和访问者模式
常用的设计模式以及用法:
单例模式:优点:确保一个类只有一个实例,并提供一个全局访问点。 缺点:可能导 致全局变量的滥用,增加了代码的耦合度。 适用场景:需要确保只有一个实例的 场景,如线程池、数据库连接池等(数据连接对象)。通常使用静态来实现。
懒汉模式:在第一次获取实例时进行初始化。
饿汉模式:在类加载时就完成了初始化。
工厂方法模式:优点:将对象的创建与使用分离开,隐藏了对象的创建细节。 缺点: 增加了系统的复杂度。 适用场景:需要根据条件创建不同具体对象的场景。 简 单工厂:对象转移.
中介者模式:优点:将对象之间的交互封装到中介者对象中,减少对象之间的直接通 信,降低了耦合度。 缺点:增加了中介者对象的复杂性。 适用场景:当多个对 象之间存在复杂的交互关系时,可以引入中介者模式来简化交互。使用MediatR 实现中介者
授权中心
单体应用
- 服务端session生成唯一标识符。
- 客户端获取存到cookie。
- 客户端访问服务端通过生成的唯一标识符进行访问。
微服务架构
- 通过JWT进行服务之间的授权。
- 颁发Token传给前端。
- 前端获取到Token存入拦截器中。
- 前端访问后端通过拦截器携带Token访问进行权限访问。
- JWT分为头部载荷标签,头部存放加密算法,载荷存放用户唯一标识符,标签存放算法标识符和私钥主要是防止篡改。
- 如果验证不通过就会报错401。
- 把生成的Token存到Redis中如果检测到用户还在使用并且Token快过期那就通过方法把这个Token进行延时。
- 延时策略,把token存到Redis中通过方法判断用户是否正在操作如果正在操作就把该token进行对应的延时。
- 前端通过(咯扣死道瑞)存入拦截器的Hand中,双token机制,登录时生成两个token当正在使用的token时间还剩5分钟的时候检测到服务正在使用,备用token就会变成主token同时会再次生成一个备用token。
鉴权
表结构
用户、角色、菜单、功能、用户角色、角色菜单、菜单功能。
基于内存数据库Redis。
策略授权:后台根据角色进行策略授权。
具体业务
主要就是通过角色进行菜单功能划分。
保证一致性
rabbitMQ消息队列有序的把操作暂存等数据库恢复再执行对应的操作执行完后移除消息队列中的操作也就是消息补偿机制。
日志
ES存储
LoginSight分析
kibana查日志
我们日志是记录在一张单独的表中的,通过Kibana来进行日志的查询。
数据库性能分析
数据量大
加索引:
- 索引适用于什么场景?
高频访问的字段。
条件多的字段。
数据重复率低的字段。
- 如果有多个字段需要加索引怎么办?
加联合索引。
联合索引遵循最左匹配原则筛选匹配的字段数据。
- 如何检查索引是否命中?
使用EXPLAIN。
- 那些字段可能会影响索引命中?
or、not in、in
- 怎么查找需要优化的表?
通过SqlProfiler找到具体是那张表影响了查询的效率
计算量大
宽表:
优点:减少了计算的过程优化性能。
缺点:牺牲时效性因为它是在前一天晚上用定时任务进行的统一计算并存入表中。
读写分离数据库集群(AlwaysOn)
我们使用的是一主多从的模式,主数据库是写操作,从数据库是读,我们的数据一致性是它自带的强一致性因为数据的一致性是最主要的所以用的是同步复制。
分布式
分布式锁
分布式事务
CAP.Net+rabbitMQ
分布式缓存
Redis集群。
依赖注入
解耦
依赖注入是一种设计模式,控制反转是具体的实现。
通过在program中配置服务容器,在要使用的类的构造函数中直接引用,然后就可以使用了。
单例:它只创建一个对象然后每次复用。
瞬态:每一次创建都是一个新的对象。
作用域:在一个请求的范围内它就是一个新的对象。
.Net Core中一次请求的过程
当请求发起的时候先进入管道就是builder,通过use把中间件挂载到管道中app.use,app.run执行挂载的中间件,执行顺序就是use的顺序根据use顺序进行依次执行,然后是授权过滤器,然后就是根据路由找到控制器和控制器中的方法,然后是结果过滤器,最后动作结束。
应用场景
Redis:缓存租户的组织信息、权限信息,羊场首页的生产提示信息。
RabbitMQ:Redis和Db之间数据同步做消息补偿,分布式事务CAP.Net+rabbit。