spring-cloud
什么是springcloud?
Spring Cloud 是一系列框架的有序集合
Spring Cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来
通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包
它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、 断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署
Spring 公司将其他公司中微服务架构常用的组件整合起来,并使用 SpringBoot 简化其开发、配置。称为 Spring Cloud
springcloud与dubbo区别是什么?
Spring Cloud 与 Dubbo 都是实现微服务有效的工具。
Dubbo 只是实现了服务治理,而 Spring Cloud 子项目分别覆盖了微服务架构下的众多部件
Dubbo 使用 RPC 通讯协议, Spring Cloud 使用 RESTful 完成通信, Dubbo 效率略高于 Spring Cloud
什么是微服务?
微服务就是将项目的各个模块拆分为可独立运行、部署,测试的架构设计风格
自我保护机制
什么是自我保护机制?
当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
自我保护机制意义是什么?
自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定
负载均衡
服务端负载均衡
负载均衡算法在服务端
nginx 由负载均衡器维护服务地址列表
客户端负载均衡
负载均衡算法(策略)在客户端
Eureka在客户端维护服务地址列表
Ribbon是Netflix提供的一个基于Http和Tcp的客户端负载均衡工具
Nacos,Eureka,Consul,Zookeeper
Hystrix
Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败(雪崩)。
Hystix 主要功能
隔离
· 一个服务失败,导致整条链路的服务都失败的情形。
· 出现原因
• tomcat线程池在调用远程接口时,陷入长时间等待
· 隔离方式
• 线程池隔离创建单独线程池(10个),设置超时时间,tomcat贤臣吃也最多只会阻塞10个线程
• 应用场景请求并发量大,并且耗时长(读取数据库):采用线程池隔离策略,这样可以保证大量的容器线程(tomcat)可用,不会由于服务原因,一直处于主色或等待状态,快速返回失败
• 信号量隔离不会创建新的线程池,用的还是tomcat线程池,但是设定最大阈值,超过阈值就不会再进行方法调用
• 请求并发量大,并且耗时短,(读取缓存):采用信号量隔离,因为这类服务返回通常非常快,不会占用容器线程太久时间,而且减少了线程切换的一些开销,提高了缓存服务的效率
· 什么时候使用?
• 当请求的服务网络开销比较大的时候,或者是请求比较耗时的时候,我们最好是使用线程隔离策略,这样的话,可以保证大量的容器(tomcat)线程可用,不会由于服务原因,一直处于阻塞或等待状态,快速失败返回。而当我们请求缓存这些服务的时候,我们可以使用信号量隔离策略,因为这类服务的返回通常会非常的快,不会占用容器线程太长时间,而且也减少了线程切换的一些开销,提高了缓存服务的效率。
· 两种隔离方式的区别?
•
降级
· 当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
熔断
· 服务失败达到一定的值会将断路器打开10s内请求次数最少不低于20次,失败请求占比达到50%打开后休眠五秒,半开允许部分请求访问,访问成功一定比率,则关闭熔断
限流
· 令牌桶算法:以一定速率往桶里补充令牌,只有获取到令牌之后才可以去进行业务处理。允许一定突发流量。
· 漏桶算法:以一定的速率控制请求处理。
Gateway
什么是网关?
网关就是系统的入口,封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、缓存、负载均衡、流量管控、路由转发等
动态路由
cloud: # 网关配置 gateway: # 路由配置:转发规则 routes: #集合。 # id: 唯一标识。默认是一个UUID # uri: 转发路径 # predicates: 条件,用于请求网关路径的匹配规则 # filters:配置局部过滤器的 - id: gateway-provider # 静态路由 # uri: http://localhost:8001/ # 动态路由 uri: lb://GATEWAY-PROVIDER predicates: - Path=/goods/** - id: gateway-consumer # uri: http://localhost:9000 uri: lb://GATEWAY-CONSUMER predicates: - Path=/order/**
过滤器
补充
pom依赖原则
1.近者优先2.先声明者优先如果路径相同,谁先声明使用哪个版本如果路径不同,优先使用路径比较短的版本
前端到后端执行流程
请求参数
@PathVariable 路径参数{}占位符注入参数
@RequestBody 请求体json对象
@RequesParam 请求参数?id=1 可不可以不加?但是加了之后要必需传递