赞
踩
目录
三. SpringCloud 和 SpringCloud Alibaba
2. Spring、SpringBoot、SpringCloud 区别?
3. SpringCloud 和 SpringCloud Alibaba (前五行 微服务五大件)
单体架构 ——> 集群 ——> 垂直化 ——> 服务化(SOA:面向服务的架构) ——> 微服务化(SOA的细粒度化)
SOA和微服务的区别?
- SOA是面向服务的架构:解耦,解决信息孤岛问题,数据之间要互联互通
- 微服务是SOA的细粒度化:比如把用户服务拆成账户服务、积分服务等
服务注册中心的作用?
- 服务的动态感知:服务上线下线
- 服务地址的高效管理:不需要每个客户端都去管理服务地址,而是可以通过服务名直接调用服务
注:服务注册中心有Zookeeper、Eureka、Nacos、consul
网关的作用?
路由、权限认证、日志记录、限流、熔断
限流、降级、熔断?
- 限流:限流算法有令牌桶、漏桶、滑动窗口,限流框架有阿里的sentinel(滑动窗口)、springcloud的hystrix(信号量)
- 降级:关闭某些服务接口或者页面,以保证核心服务可用。被动降级是限流或熔断导致的降级,主动降级指的是关闭评论、广告等不重要功能保证核心服务可用。
- 熔断:当某些服务异常,则及时熔断此微服务的调用,快速返回错误响应信息。防止雪崩的发生。(Hystrix默认5秒内20次错误调用,会启动熔断机制)
利:
高度模块化,边界清晰。高内聚、低耦合。
可独立部署,互不影响
弊:
分布式带来的高度复杂性,比较难看清楚整个大系统是如何运作的
数据一致性问题
运维复杂,可靠性、稳定性、监控、容量规划方面都有很高的要求
SpringBoot是Spring组件一站式使用框架,简化了spring的使用,提供了各种start,让开发者能快速上手。
@SpringBootApplication。主要包含三个注解:
SpringBoot采用 “约定大于配置” 的思想,把所有可能需要的配置提前写好,写在自动配置的jar包中。基本每个start都有对应的自动配置。
原理就是把spring.factory里的xxxAutoConfiguration都加载到Spring容器中。
xxxAutoConfiguration:自动配置类
xxxProperties:封装配置文件中的相关属性
配置文件的加载顺序?
xxx.properties、yaml
SpringBoot核心配置文件是什么?
application(.yml或.properties) 或 bootstrap(.yml或.properties)。application常用于springboot项目,bootstrap常用于springcloud项目加载远程配置文件。
springboot actuator用于服务监测和管理。可以通过 http://localhost:8080/actuator/{端点} 的方式访问端点。常见的端点有:
使用spring-boot-starter-security依赖项,security主要核心功能有:
一个完整的项目被拆分成微服务后,session就被物理隔离开了。这时候可以使用Spring Session + redis的方案,操作redis上的session,就能解决这个问题。
使用Spring的@scheduled注解,或者使用第三方框架quartz或者xxl-job。
Springcloud是一个微服务全家桶,是基于SpringBoot提供的一整套微服务解决方案

| 服务治理 | Spring Cloud落地技术 | Spring Cloud Alibaba落地技术 |
| 服务注册与发现 | Eureka、Zookeeper | Nacos |
| 服务调用 | Feign、OpenFeign | Dubbo(HSF) |
| 负载均衡 | Ribbon | Ribbon |
| 网关 | SpringCloud Zuul | Getway |
| 服务容错 | Hystrix | Sentinel |
| 分布式调度 | --(替代方案:xxl-job) | ScheduleX |
| 配置中心 | Spring Cloud Config | Diamond |
| 消息 | --(替代方案:RabbitMQ、Kafka) | RocketMQ |
| 服务总线 | Bus | Nacos |
| 服务部署 | Docker、Kubernetes、OpenStack | Docker |
| 分布式事务 | --(替代方案:2pc) | Senta |
| 服务监控 | 待补充 | AliMonitor(应用监控)、Arthas(在线诊断) |
| 链路追踪 | Spring Cloud Sleuth | SkyWalking |
总结目前市面上的技术使用,可以看到SpringCloudNetflix(Eureka、Feign、Ribbon、Hystix、Zuul) 的技术基本被SpringCloudAlibaba替代了:

服务启动的时候,服务上的Eureka客户端会把自身注册到Eureka服务端,并且可以通过Eureka服务端的注册表知道其他注册的服务
服务间发起请求的时候,服务消费者方基于Ribbon服务做到负载均衡,从服务提供者的多台机器中选择一台。常见的负载均衡算法:轮询、随机、权重。
Feign使用的时候会集成Ribbon,Ribbon去Eureka服务端找到服务提供者所在的服务器信息(比如服务名、ip、端口等),然后根据负载均衡策略选择一个,拼接url后发出清楚
发起的请求是通过Hystrix的线程池去访问服务,不同的服务通过不同的线程池,实现不同的服务调度隔离。如果服务出现故障,通过服务熔断,避免服务雪崩问题;并且通过服务降级,保证服务核心功能正常提供。
- 隔离:服务之间请求用线程池隔离,防止所有线程都卡在某一个异常的下游节点
- 熔断:服务异常及时熔断,返回错误响应信息,防止服务雪崩(下游节点异常从而超时影响到上游节点,从而影响到整个链路),Hystrix默认5秒20次异常请求则熔断。
- 降级:需要有降级逻辑,请求走熔断器过程中,需要把该请求记录到故障数据库,方便后续回补数据
前端调用后端的时候,统一走Zull网关进入,通过Zull网关转发请求给对应的服务。公有域名转ip,鉴权。
- 服务启动和请求全过程:
- 1. 服务启动的时候Eureka客户端会把自身注册到Eureka服务端,并且也能通过Eureka服务端发现其他服务。
- 2. 当前端发起请求时,先进入Zuul网关,网关通过Eureka服务端拿到服务提供者信息,通过路由策略转发请求给相应的服务,服务收到请求会先过Hystrix做服务容错(限流、熔断、降级),然后再根据业务逻辑处理请求。
- 3. 当后端服务之间相互请求时,Feign每5秒会从Eureka服务端同步一次服务器信息缓存到本服务器,ribbon直接从缓存中的服务器信息中选择一个,转发请求到相应服务器,依然是先到Hystrix,再做业务逻辑处理。
-
- 使用Eureka有服务安全下线问题
- Eureka会跟服务器之间保持心跳,三次心跳失败,就会把服务器节点拿掉。但是就有一个问题,服务下线和Eureka知晓之间的时间请求都会失败。
- 如何解决这个问题?
- 这个需要服务提供方来保证。Eureka服务端提供了一个接口,可以调用接口把服务器节点信息拿掉,服务下线前有一个回调钩子,可以在这个回调里边调用Eureka,先把节点信息拿到再shutdown服务,就可以保证服务安全下线。
Nacos是注册中心+配置中心的组合(Nacos = Eureka + Config),就不用多部署一套配置中心的集群
Dubbo是分布式系统中常用的RPC框架,可以帮我们做服务地址的管理、服务的注册与发现、服务监控等。Dubbo一般配合Zookeeper使用。
Dubbo工作流程:

角色:Container-容器、Provider-服务提供方、Consumer-服务消费方、Register-注册中心、Monitor-监控器
服务间发起请求的时候,服务消费者方基于Ribbon服务做到负载均衡,从服务提供者的多台机器中选择一台。常见的负载均衡算法:轮询、随机、权重。
Sentinel是阿里开源的高可用流量管理框架,提供了 限流、熔断、降级、系统负载保护等多个维度来保障服务稳定性。
降级策略:
- 平均响应时间超过阈值
- 每秒异常比例超过阈值
- 一分钟内异常数目超过阈值
xxl-job 是一个分布式调度平台,有调度中心和执行器两大部分组成。
xxl-job工作原理:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。