SpringCloud 随笔
1. Questions
1.1 什么是springcloud
看起来像是集成了很多分布式架构所需微服务的中间件的集合
1.2 为什么用springcloud
基于springboot,学习门槛渐进式
1.3 什么是分布式?分布式和单体的区别?分布式和模块化的异同?分布式和前后端分离是一个玩意吗?
服务一个组件,RPC一个组件,数据库一个组件,网关路由一个组件,看起来像是履行了单一责任的设计f原则,单体局限于一台机器,分布式高并发高可用,就是维护耗钱,模块化看起来更像是一种自己开发的风格,看起来分布式得益于前后端分离
1.4 集群?
服务的集合,数据库的集合,etc
1.5 负载均衡
让集群中的每个个体所受的压力一样,降低负担
1.6 什么是服务?
解决用户需求的玩意?笼统点,数据库也是服务?
1.7 什么叫暴露接口给外界?
类似外观模式?用户最多只能知道Controller层
1.8 学分布式微服务其实就是在学组件?
1.9 倒排索引和正向索引?
1.10 分布式划分的粒度?
1.11 所有组件都可以交给springboot管理?
1.12 DSL 和 SQL?
DSL, domain specific language 包含了sql 领域特定语言,啥领域用啥语言
elasticsearch里的dsl是json?
2. Eureka
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fUAuGOHp-1649230500506)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211109170526889.png)]
Eureka是对消费者做负载均衡还是对被消费者做?
用eureka做注册中心访问的时候不能直接ip地址,要写服务名称
java.lang.IllegalStateException: No instances available for user-service:一开始访问会报错,但是过一会就不报错了,猜测是做负载均衡需要时间,还没有完成就访问所以报错
懒汉式
3. Nacos
在本地安装nacos其实是安装了一个完善的nacos后台管理系统,而eureka不需要是因为spring自己提供了直接的html?
通过本地安装的这个后台管理系统,更直观的注册服务和配置服务
在spring项目里导入nacos的jar包的目的是?里面封装了api
其实这不就是前后端分离吗,spring项目操作服务,显示到后台管理系统中,逆向?
安装nacos单机改个standalone就行,数据库无所谓,sql失败考虑CURRENT_TIMESTAMP版本问题
配置中心可以将调用与服务解耦 以前需要输入ip,现在只用写程序名
4. OpenFeign
动态代理模式!!!
感觉还有面向接口编程,声明式,甚至还有策略模式?
一个消费者的controller过来,调openFeign声明的接口的某个服务,然后这个接口就会按照映射去找他的实例对象,这个过程看成黑盒就完事了,应该是通过动态代理即时生成一个实体类?或者即时RPC提供者的?更像是后者
5. Docker
Docker是一个容器,就是给你装各种中间件和服务的,它依赖于linux内核,所以需要在linux上运行,windows用户只能整个虚拟机咯
感觉主要在应用程序上线时才用
镜像和容器???
镜像包含容器把,大概,因为需要先获得image,再从image上获得container,最后对container操作,image更像是container的container。
Docker存在的意义是什么?
各种官方上的理解是让你的开发环境和真正的测试和部署的环境一致
但是SpringBoot, mysql nginx redis 和微服务的各种组件又是怎样在docker里扮演角色的呢?
docker肯定是基于虚拟机运行的嘛,因为需要linux内核
在linux主机上,以docker为基础分别部署mysql nginx redsi的tar文件吗?那到底springboot项目要不要呢????
要的吧?,还是直接在windows主机上ping虚拟机? 应该是前者
6. RabbitMQ
Message Queue,,消息队列,听说消息队列是命令模式的典型
大概是个什么流程呢?
先建立连接啦,然后给你个频道,不会是连接工厂给你个连接,再从这里面抽一个频道给你把,类似进程和线程?
然后就给你把消息丢queue里缓存着,再按照某种算法丢给你的consumer
6. GateWay
网关,有点过滤那意思,符合规范的才放行,
第一层 网关,过了给路由or交换机,然后再给服务
7. ElasticSearch
搜索引擎?核心是倒排索引
一般的mysql的查询顺序按照你给的条件or索引然后返回数据,倒排看起来就是反着来
前言#
传统数据库查询数据的操作步骤是这样的:建立数据库->建表->插入数据->查询
索引(index)
一个索引可以理解成一个关系型数据库
类型(type)
一个type就像一类表,比如user表、order表
注意
1、ES 5.X中一个index可以有多种type
2、ES 6.X中一个index只能有一种type
3、ES 7.X以后已经移除type这个概念
映射(mapping)
mapping定义了每个字段的类型等信息。相当于关系型数据库中的表结构
文档(document)
一个document相当于关系型数据库中的一行记录
字段(field)
相当于关系型数据库表的字段
集群(cluster)#
集群由一个或多个节点组成,一个集群由一个默认名称“elasticsearch”
节点(node)#
集群的节点,一台机器或者一个进程
分片和副本(shard)#
副本是分片的副本。分片有主分片(primary Shard)和副本分片(replica Shard)之分
一个Index数据在屋里上被分布在多个主分片中,每个主分片只存放部分数据
每个主分片可以有多个副本,叫副本分片,是主分片的复制
8. Sentinel
分布式限流中间件
9. Seata
分布式的事务管理组件
10. Nginx
nginx + openresty + lua
反向代理: 正常的代理对服务器透明,反向代理对用户透明
11. Redis
Redis是最常见的nosql数据库,用来做对快速读写有要求的数据的存储
启动: redis-server & (后台启动)
客户端UI: redis-cli
bind : 默认只允许本机访问
持久化策略: AOF RDB
AOF:append only file 增量操作 你每写一条我加一条
RDB: read-only data base 对当前的所有操作快照备份,写入RDB文件 根据操作的数量决定每次写的时间
连接SpringBoot
- redis.conf-> protected mode no
- dependency
- 模板操作
缓存穿透和缓存雪崩: 说白了都是因为某种原因导致没法访问Redis都去找数据库了
解决缓存穿透加个锁就可以了,缓存雪崩是因为查询到的一直是空数据,所以也没法访问redis,这种时候就应该返回条无关数据给redis,这样就不会去一直IO数据库了
集群:
redis主从:slaveof 记得更改端口和选择aof和rdb
哨兵模式: 大概就是给你个Monitor,如果主redis宕机了,monitor检测到,触发某种选举机制,比如过半制度,成为新的主redis,并通知别的slave更改主redis
但是如果宕机的那个主机复活了怎么办,显然,这个redis肯定觉得自己还是主,但是我们应该把它变为从的,根据过半选举,这个人被动成为从机?
据给redis,这样就不会去一直IO数据库了
集群:
redis主从:slaveof 记得更改端口和选择aof和rdb
哨兵模式: 大概就是给你个Monitor,如果主redis宕机了,monitor检测到,触发某种选举机制,比如过半制度,成为新的主redis,并通知别的slave更改主redis
但是如果宕机的那个主机复活了怎么办,显然,这个redis肯定觉得自己还是主,但是我们应该把它变为从的,根据过半选举,这个人被动成为从机?