Kubernetes原理
Kubernetes 中的绝大部分概念都抽象成 Kubernetes 管理的一种资源对象,下面我们一起复习一下我们上节课遇到的一些资源对象:
Master:Master 节点是 Kubernetes 集群的控制节点,负责整个集群的管理和控制。Master 节点上包含以下组件:
kube-apiserver:集群控制的入口,提供 HTTP REST 服务
kube-controller-manager:Kubernetes 集群中所有资源对象的自动化控制中心
kube-scheduler:负责 Pod 的调度
Node:Node 节点是 Kubernetes 集群中的工作节点,Node 上的工作负载由 Master 节点分配,工作负载主要是运行容器应用。Node 节点上包含以下组件:
kubelet:负责 Pod 的创建、启动、监控、重启、销毁等工作,同时与 Master 节点协作,实现集群管理的基本功能。
kube-proxy:实现 Kubernetes Service 的通信和负载均衡
运行容器化(Pod)应用
Pod: Pod 是 Kubernetes 最基本的部署 ...
天天商城
我开发的这个系统是基于b2c的电商系统,我来给您介绍一下这个项目的架构,这个系统一共是分成两个子系统,分别是前台和后台,前台使用主流的前端框架Vue ,使用Es6的开发规范 ,采用模块化的开发模式。 后端部分采用SpringCloud架构 ,利用SpringBoot构建应用。我主要参与的是后台的开发,主要包括商品,订单模块。
商品管理的目的主要是有三个,一是让用户快速地找到商品,可以根据关键词或者类目来搜索。二是为同类型的商品提供标准属性和属性值,便于统一管理商品。三是商品的上架和下架。商品模块在建模上就很复杂,商品信息要拆分成spu和sku两种,spu存放的是商品的主要信息,sku存放的是商品的组合信息,比如说苹果手机,不同的内存和颜色就可以产生不同的sku记录。还有比较复杂的是规格属性和销售属性的参数定义,他们是由三级分类组织起来的,规格属性还有分组,比如说1主体:入网型号,品牌,生产日期;2基本信息:运营商标识,机身重量;3cpu信息:cpu品牌,型号,只有sku才有明确的销售属性,比如颜色,内存,我们单独设计了属性表,来存放属性的类型和值,spu,sku详情表里存放了属性表的i ...
Gateway原理
Spring Cloud Gateway 使用了 Spring WebFlux 非阻塞网络框架,网络层默认使用了高性能非阻塞的 Netty Server,解决了 Spring Cloud Zuul 因为阻塞的线程模型带来的性能下降的问题。
Gateway 本身是一个 Spring Boot 应用,它处理请求是逻辑是根据配置的路由对请求进行预处理和转发。
路由判断:客户端的请求到达网关后,先经过 Gateway Handler Mapping 处理,这里面会做断言(Predicate)判断,看下符合哪个路由规则,这个路由映射后端的某个服务。
请求过滤:然后请求到达 Gateway Web Handler,这里面有很多过滤器,组成过滤器链(Filter Chain),这些过滤器可以对请求进行拦截和修改,比如添加请求头、参数校验等等,有点像净化污水。然后将请求转发到实际的后端服务。这些过滤器逻辑上可以称作 Pre-Filters,Pre 可以理解为“在…之前”。
服务处理:后端服务会对请求进行处理。
响应过滤:后端处理完结果后,返回给 Gateway 的过滤器再次做处理,逻辑上可以称作 ...
nacos原理
Spring Cloud集成Nacos的实现过程 在Spring-cloud-commons包下的META-INF/spring.factories中包含自动装配的配置信息,其中AutoServiceRegistrationAutoConfiguration就是服务注册相关的配置类,
在AutoServiceRegistrationAutoConfiguration配置类中,注入了AutoServiceRegistration实例。AbstractAutoServiceRegistration抽象类实现了该接口,最终NacosAutoServiceRegistration继承AbstractAutoServiceRegistration
客户端最终调用了reqApi方法,把信息封装成params的map向Nacos Server /nacos/v1/ns/instance 接口发送了一个POST请求,把当前实例注册进去,到这里整个客户端的核心注册流程就分析完了
nacos服务端提供接口请求地址,/v1/ns/instance,具体代码在nacos-naming下的Instance ...
OpenFeign原理
Feign底层默认是JDK自带的HttpURLConnection,它是单线程发送HTTP请求的,不能配置线程池,我们使用Ckhttp或者HttpClient来发送http请求,并且它们两个都支持线程池。
1、在 Spring 项目启动阶段,服务 A 的OpenFeign 框架会发起一个主动的扫包流程。2、从指定的目录下扫描并加载所有被 @FeignClient 注解修饰的接口,然后将这些接口转换成 Bean,统一交给 Spring 来管理。3、根据这些接口会经过 MVC Contract 协议解析,将方法上的注解都解析出来,放到 MethodMetadata 元数据中。4、基于上面加载的每一个 FeignClient 接口,会生成一个动态代理对象,指向了一个包含对应方法的 MethodHandler 的 HashMap。MethodHandler 对元数据有引用关系。生成的动态代理对象会被添加到 Spring 容器中,并注入到对应的服务里。5、服务 A 调用接口,准备发起远程调用。6、从动态代理对象 Proxy 中找到一个 MethodHandler 实例,生成 Request,包含 ...
CompletableFuture原理
以Async结尾的方法,都是异步方法,对应的没有Async则是同步方法,一般都是一个异步方法对应一个同步方法。
以run开头的方法,其入口参数一定是无参的,并且没有返回值,类似于执行Runnable方法。
以supply开头的方法,入口也是没有参数的,但是有返回值
以Accept开头或者结尾的方法,入口参数是有参数,但是没有返回值
以Apply开头或者结尾的方法,入口有参数,有返回值
CompletableFuture同时实现了两个接口,分别为Future和CompletionStage,CompletionStage是CompletableFuture提供的一些非常丰富的接口,可以借助这些接口来实现非常复杂的异步计算工作.
先来分析一下CompletableFuture的get方法的实现细节,CompletableFuture实现了Future的所有接口,包括两个get方法,一个是不带参数的get方法,一个是可以设置等待时间的get方法,首先来看一下CompletableFuture中不带参数的get方法的具体实现
result字段代表任务的执行结果,所以首先判断是否为n ...
Sentinel原理
在 Sentinel 里面,所有的资源都对应一个资源名称(resourceName),每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 SphU API 显式创建。Entry 创建的时候,同时也会创建一系列功能插槽(slot chain),这些插槽有不同的职责,例如:
NodeSelectorSlot :收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;
ClusterBuilderSlot :用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;
StatisticSlot :用于记录、统计不同纬度的 runtime 指标监控信息;
SystemSlot :通过系统的状态,例如 load1 等,来控制总的入口流量;
AuthoritySlot :根据配置的黑白名单和调用来源信息,来做黑白名单控制;
FlowSlot :用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;
D ...
synchronized实现原理
synchronized就在JDK1.6做了锁升级的优化
无锁、匿名偏向:当前对象没有作为锁存在。
偏向锁:如果当前锁资源,只有一个线程在频繁的获取和释放,那么这个线程过来,只需要判 断,当前指向的线程是否是当前线程 。 如果是,直接拿着锁资源走。 如果当前线程不是我,基于CAS的方式,尝试将偏向锁指向当前线程。如果获取不到,触发 锁升级,升级为轻量级锁。(偏向锁状态出现了锁竞争的情况)
轻量级锁:会采用自旋锁的方式去频繁的以CAS的形式获取锁资源(采用的是自适应自旋锁) 如果成功获取到,拿着锁资源走 如果自旋了一定次数,没拿到锁资源,锁升级。
重量级锁:就是最传统的synchronized方式,拿不到锁资源,就挂起当前线程。ObjectMonitor
AQS就是AbstractQueuedSynchronizer抽象类,AQS其实就是JUC包下的一个基类,JUC下的很多 内容都是基于AQS实现了部分功能,比如ReentrantLock,ThreadPoolExecutor,阻塞队列, CountDownLatch,Semaphore,CyclicBarrier等等都是基于 ...