基础
集中式架构
所有功能全部都在一个项目中,可以说是最常见的项目。好处是简单,没有那么多花里胡哨的操作,主要是在CRUD。缺点是高耦合(不利于维护)。
垂直拆分
将项目中不同的功能独立拆分出来(用户模块、订单模块、支付模块......),最终合并到一起。可以很好的解耦,而且可以针对某个模块去优化。缺点是因为模块间相互独立,会存在很多重复操作。
分布式服务
将核心业务抽取出来,作为独立的服务,系统间相互调用,形成服务中心。优点是代码复用性高,开发效率高。缺点是服务间相互调用,逻辑复杂。
流动计算架构(SOA)
注册中心
所有服务在注册中心注册(提供什么服务,IP和端口是什么),当要调用服务时,通过注册中心调用。所有服务由注册中心管理,也就是说注册中心是服务治理的角色。这种架构就是面向服务的架构。优点是管理服务较轻松,缺点是服务间有依赖关系,一旦某个环节出错会有较大的影响。
微服务架构
每个服务对应着唯一的业务能力,拆分的很小(拆的太小的话会带来运维的复杂度)。强调服务与服务之间的独立性(独立数据源、独立开发、独立部署......)。每个服务都可以当成独立的组件。
服务调用方式
各种服务之间,相互调用的方式。
- RPC
- 远程过程调用。自定义数据格式。使用原生TCP建立长链接,速度快效率高。dubbo框架就是基于RPC。
- HTTP
- 基于TCP的协议,有规定的数据传输格式。对服务的提供和调用方没有任何技术限定,自由灵活。Spring Cloud就是基于HTTP。
HTTP客户端工具
用来处理请求和响应的工具。
- Spring的RestTemplate
qq对HTTP客户端进行封装,而且可以对JSON序列化和反序列化。它支持的HTTP客户端有
HttpClient
、OKHttp
、HttpUrlConnection
。
Spring Cloud
Eureka
介绍
服务的注册中心,它自己也是一个服务(可以是集群)。注册中心与服务之间有一个心跳机制,服务一段时间(默认30秒)会发一个消息给注册中心。如果注册中心发现服务很久没发(默认90秒),就会认为该服务出故障,将它剔除。
- 提供者d'w
- 启动后向Eureka注册自己的信息(提供什么服务、地址)
- 消费者ss
- 向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表(定期更新)发送给消费者。
Eureka配置
配置Eureka server和client步骤大致3步:
- 添加依赖
- server 添加
spring-cloud-starter-netflix-eureka-server
。 - client 添加
spring-cloud-starter-netflix-eureka-client
。
- server 添加
- 添加注解
- server添加
@EnabeEurekaServer
。 - client添加
@EnabeEurekaClient
,也可以使用@EnableDiscoveryClient
,后者兼容多种注册中心。
- server添加
- 修改配置
- 添加应用名(spring.application.name)。
- 指定注册中心地址(eureka.client.service-url.defaultZone)。
高可用的Eureka Server
和hadoop集群的高可用一样,就是多启动几台Eureka Server,相互注册就是高可用。
失效剔除和自我保护
服务因为各种原因没有发送心跳
而且没有收到下线
请求,这段时间超过90秒的服务会被剔除,默认每60秒清除一次这种服务,这就是失效剔除。
服务实例最近15分钟心跳续约比例低于85%的服务,会认为这个服务有点小问题,暂时停止失效剔除,这个机制叫自我保护。
Ribbon
Ribbon是一个负载均衡器,如果一个服务是由多台机器集群提供,可以使用Ribbon调节。
雪崩问题
因为某个小问题(如请求阻塞)导致服务出错,从而导致所有服务都不可用,就是雪崩问题。
Hystrix
Hystrix使一个容错库,为了避免出现级联失败。解决雪崩问题的方法有两个:
- 线程隔离
- 把不同的服务请求用不同的线程池去隔离,这样即使资源耗尽也只是耗尽线程池的资源。
- 如果服务一直不可用,超过了超时时间,会返回失败结果(服务降级)。
- 降级服务的原则是优先保证核心服务,非核心服务不可用或者弱可用。
- 服务熔断
- 和股票一样,短时间内跌到一定幅度就会自动停盘一会儿。
- 所有请求正常时熔断器关闭状态(
Closed
状态)。 - 默认情况下,20次请求概率低于50%就会触发熔断器(
Open
状态)。熔断器打开期间所有请求直接失败。 - 默认再熔断器打开5秒后会半开熔断器(
Half Open
状态)。此时会允许部分请求通过,如果放行的请求状态都正常就会关闭熔断器。如果不是,重新计时然后进入半开状态,反复循环。
Zuul
微服务网关。它的核心是一系列的过滤器,可以完成以下功能
- 身份认证
- 识别每个资源的验证要求,拒绝不符合要求的请求。
- 监控
- 监控有意义的数据和统计结果。
- 动态路由
- 动态地将请求路由到不同的后端集群。
- 压力测试
- 逐渐增大请求量测试性能。
- 负载分配
- 为每一种负载类型分配对应容量,并弃用超出限定值的请求。
- 静态响应处理
- 在边缘位置直接建立部分响应,避免其转发到内部集群。