项目架构-微服务【全面知识点】

技术选型

为什么选用SpringCloud Alibaba?

SpringCloud部分组件停止维护和更新,给开发带来不便(Eureka、Hystrix)、搭建复杂没有完善的可视化界面。
SpringCloud Alibaba经历过阿里的考验,性能较强,能快速搭配阿里其他组件,完善的可视化界面给开发和运维带来极大的便利。

最终的技术方案:

SpringCloud Alibaba - Nacos:注册中心(服务发现和注册)
SpringCloud Alibaba - Nacos:配置中心(动态配置管理)
SpringCloud - Ribbon:负载均衡
SpringCloud - Feign:声明式HTTP客户端(远程调用)
SpringCloud Alibaba - Sentinel:服务容错(限流、降级、熔断)
SpringCloud - Gateway:API网关
SpringCloud - Sleuth:链路追踪
SpringCloud Alibaba - Seata:分布式事务解决方案。
SpringCloud Alibaba - OSS:对象存储服务。

底层技术

1.MySQL优化

2.JVM调优

3.雪花算法

https://www.bilibili.com/video/BV18E411x7eT?spm_id_from=333.788.b_636f6d6d656e74.14

中间件技术

1. ElasticSearch

介绍

索引(Index)
作为动词理解相当于MySQL中的Insert;作为名词理解相当于MySQL中的数据库。
类型(Type)
在Index中可以定义一个或多个Type,类似于MySQL中的Table,每一种类型的数据放在一起。
注意:es7中去掉了类型的概念,由于es是基于lucene开发的搜索引擎,而es中不同类型下名称相同的字段在lucene中会被认为是同一个字段。必须在不同类型想相同字段定义相同的映射,否则会出现问题。导致lucene处理效率下降。去掉type是为了提高es的效率。
文档(Document)
保存在某个索引下某种类型的一条数据,类似于MySQL表中的一条条记录。
映射(Mapping)
映射用来定义一个文档以及它所包含的属性是如何存储和索引的。es会默认创建,但是往往默认创建的可能不正确,需要手动创建。
比如可以使用mapping来定义:

  • 哪些字符串属性应该被看做全文本属性(full test fields)。
  • 哪些属性包含数字,日期或者地理位置等。
  • 文档中所有的属性是否都能被索引(_all配置)。
  • 日期的格式。
  • 自定义映射规则来执行动态添加属性。

索引数据
post:新增,如果不指定Id,会自动生成Id。指定Id就会修改这个数据并新增版本号。
put:新增/修改,必须指定Id,一般用来做修改操作,不指定Id会报错。
get:查询文档,/index/type/id,查询出来的结果中_seq_no每次更新就会加1,是并发控制中用来做乐观锁的实现字段。
delete:删除文档或者索引

更新映射[重点]

对于已存在的映射字段,是不允许更新的。更新可能会使已索引的数据无效。想要修改映射需要创建新的索引,并且对数据进行重新索引。
流程如下:

  • 创建新的索引并指定映射关系 put /index { “mappings” {}}
  • 数据迁移
POST _reindex
{
    
    
	"source":{
    
    
		"index":"原索引"
	},
	"dest":{
    
    
		"index":"新建的索引"
	}
}

如果老的索引有type【类型】需要按照如下格式迁移数据:

POST _reindex
{
    
    
	"source":{
    
    
		"index":"原索引",
		"type":"原类型"
	},
	"dest":{
    
    
		"index":"新建的索引"
	}
}

倒排索引【重点】

elasticSearch为什么能快速的从海量数据中检索数据?得益于倒排索引机制。
es会把每一个不重复的词(term)以及该词所对应的文档Id保存起来,保存的数据结构就是倒排索引表。
当用户去搜索一段词的时候,es会把搜索的内容拆分成单独的词,然后去倒排索引表中匹配该词都出现在哪些文档中。假如拆成了两个词,一个词出现在了文档1和文档2中,另一个词只出现在文档1中,那么最后文档1和文档2都会被搜索出来,但是文档1比文档2关联性更强会排在前面,因为文档1中出现了两个词,而文档2只出现一个。

嵌入式 nested

当索引的一个数组里全都是对象的话,需要使用嵌入式nested。因为es默认会交叉匹配(扁平化处理),查询出不存在的数据。假如索引中有个数组里面有两个user对象:{“user”[{“first”:“张”,“last”:“三”},{“first”:“李”,“last”:“四”}]},不设置nested的话可能会搜索出张四或李三。

整合SpringBoot

技术选型
java操作es有两种方式 :9300TCP端口和9200HTTP端口。

  1. 9300:springdata只整合到es6.x版本,而且以后会放弃对es的整合。
  2. 9200:java有很多方式通过9200操作es的方式有很多,比如JestClient:非官方,更新慢;RestTemplate和HttpClient模拟http请求,需要自己封装对es的操作,用起来麻烦;Elasticsearch-Rest-Client官方RestClient,封装了ES操作,上手简单。
  3. Elasticsearch-Rest-Client又分为高阶版和低阶版,高阶版比低阶版做了更深层次的封装,低阶版的话还需要自己手动去封装请求及参数等。

2. Redis

项目中使用场景?

使用过程中常见问题?

架构、容器、集群

k8s

k8s是用于自动部署,扩展和管理容器化应用程序的开源系统。简单来说就是管理分布式集群的。

架构

集群

为什么要用集群

  • 高可用:当一台机器停止服务后,对于业务及用户毫无影响。
  • 突破数据量限制:一台机器不能存储大量数据,需要多台分担。最好能做到互相备份,即使一台服务器有异常,也能再其他服务器找到数据。
  • 数据备份容灾:单点故障后,存储的数仍然可以在别的地方找到。
  • 压力分担:由于多台服务器能完成各自的一部分工作,所以尽量避免了单点压力的存在。

集群的基础形式
主从式:一个主节点,多个从节点

  • 主从复制,同步方式
  • 主从调度,控制方式
    所有请求都回发给主节点,由主节点分配给从节点去执行。

分片式
主从模式由于主节点和从节点数据都一样,所以无法突破数据量限制。而分片式可以解决,分片式就是将数据分片存在不同的节点,片区之间也可以进行互相备份。

选主式

Guess you like

Origin blog.csdn.net/hpp3501/article/details/115726196