微服务概述
微服务化就是将传统的一站式应用,根据业务进行拆分成一个一个服务,彻底地去耦合,每个微服务提供单个业务服务,一个服务做一件事。
微服务:强调的时候服务的大小,关注的是某一个点,是具体解决某一个问题/提供对应服务的一个服务应用。
微服务架构:一种架构模式,提供将单一应用程序划分成一组小的服务,服务之间相互协调、相互配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务之间采用轻量级的通信机制相互协作(通常是基于Http协议的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境中。另外,应当尽量避免统一的、集中式的服务管理机制,对具体的服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。
微服务优缺点
优点:足够内聚,易于维护;开发简单开发效率高,一个服务可能就是专一的只干一件事情。
缺点:需要分布式系统的复杂性;多服务运维难度;服务之间的通信成本;数据一致性;性能监控
微服务技术栈
多种技术的集合体
服务开发:Springboot 、Spring 、 SpringMVC
服务注册与发现:Eureka、Consul、Zookeeper、Nacos
服务熔断器:Hystrix、Envoy
负载均衡:Ribbon、Nginx
服务接口调用:Feign,Dubbo
消息队列:Kafka、RabbitMQ、RocketMQ
服务配置中心管理:SpringCloudConfig、Nacos
SpringCloud第一代组件
基于SpringBoot提供了一套微服务解决方案,是各个微服务架构技术落地实现的集合体,包含服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件。
SpringBoot与SpringCloud
SpringBoot专注于快速方便的开发单个个体微服务。
SpringCloud关注于微服务的协调与治理,也就是对springboot开发的项目进行整合与管理。
Dubbo与SpringCloud
Dubbo的定位是一款RPC框架
SpringCloud提供的是微服务架构下的一站式解决方案
Eureka
CAP理论:Consistency数据一致性,Availability服务可用性,Partition tolerance分区容错性。
Eureka与Zookeeper区别:
Zookeeper注重服务的一致性,主机挂了,集群整体不对外提供服务,需要120s重选主节点才能对外提供服务;
Eureka注重服务的可用性,只要有一台主机活着,就能对外提供服务。
与其他注册中心组件的对比:
组件 | 语言 | CAP | 接口协议 |
---|---|---|---|
Eureka | Java | AP | Http |
Zookeeper | Java | CP | 客户端 |
Consul | Go | CP | Http/DNS |
Nacos | Java | AP/CP | Http |
服务注册:当项目(eureka客户端)启动时,就会向eureka-serever发送自己的元数据(运行的ip,端口port,健康状态的监控等),Eureka会保存这些元数据,通过RestFul api提供调用
服务续约(心跳):项目启动成功后,除了向eureka-server注册自己,还会每隔30s向eureka-server汇报自己,表示自己还活着。
服务剔除:当项目没有在90s汇报自己的情况,eureka-server会认为此节点死掉了,会将其剔除。
服务下线:当项目关闭时,会给eureka-server报告,说明自己要下机了。
Eureka Client会缓存Eureka Server的信息,即使Eureka Server全部宕掉,也可以通过缓存获取服务的信息。
多个Eureka Server会通过复制来同步服务注册列表。
Ribbon
- 服务端负载均衡:Nginx/F5
- 在服务器端完成请求的分发。将客户端发起的请求根据负载算法分发到不同的服务器上。
- 客户端负载均衡:Ribbon
- 在客户端实现负载算法。消费者客户端从注册中心拿到服务列表,通过负载算法请求具体的某一台服务器实现调用。
Eureka-client已经引入了Ribbon相关的包,通过@LoadBalanced
注解即可完成负载。
Hystrix
服务雪崩 :上游服务调用下游微服务,下游服务器请求响应时间变慢,导致大量请求堆积,造成线程大量阻塞,将服务器压垮,导致整个调用链路崩溃。
hystrix熔断器可以在下游服务器超时时,阻断对下游服务的调用,防止调用链路雪崩。
hystix也可以通过设置fallback函数对服务进行降级处理。
1 | ( |
Hystrix舱壁模式(线程池隔离)
不设置线程池时,所有熔断器默认共用一个线程池中的10个线程。
1 | ( |
自定义跳闸参数,活动窗口时间
1 | /** |
Feign
轻量级RESTful风格的HTTP客户端,以Java注解方式发起HTTP请求,实现调用远程服务,类似于Dubbo的服务调用
与dubbo的区别:
- Feign通过REST API实现远程调用,是基于HTTP的,服务提供者需要对外暴露HTTP接口供消费者调用。通过短连接进行通信,不适合高并发的访问。服务粒度是http接口级的。
- Dubbo更加灵活,通过RPC调用实现远程调用,支持多种传输协议(Dubbo、http、rmi、redis等等)。默认使用Dubbo协议,采用长连接进行通信,适合高并发场景。服务粒度是方法级的。
GateWay
Spring Cloud GateWay不仅提供统⼀的路由方式(反向代理)并且基于 Filter 链的方式提供了网关基本的功能,例如:鉴权、流量控制、熔断、路径重写、日志监控等。
Config
Spring Cloud Config 分布式配置中心
配置文件的刷新方案:
手动向Client客户端发起POST请求,http://localhost:8081/actuator/refresh , 刷新配置信息
通过消息总线更新,Spring Cloud Bus(基于MQ的,支持RabbitMq/Kafka),MQ消息代理构建⼀个共用的Topic,通过这个Topic连接各个微服务实例,MQ广播的消息会被所有在注册中心的微服务实例监听和消费。
手动向config server发起POST请求,http://localhost:9003/bus-refresh ,mq就会刷新所有Client配置信息
微服务统一认证授权
SpringCloud OAuth对多个微服务进行统一的认证授权。
OAuth2授权流程:
SpringCloud第二代组件(SCA)
SpringCloud Alibaba
Nacos
服务注册中心 + 配置中心
nacos领域模型:
namespace:对不同的环境进行隔离。例如开发环境,测试环境和生产环境等。
group:将若干服务和配置归为一组,通常表示某个项目。
service:某一个微服务。
dataId:一个具体的配置文件。
Nacos服务分级模型:
Sentinel
一个面向云原生微服务的流量控制,熔断降级组件。
以一种非侵入式的方式实现了服务的熔断、限流、降级,通过提供的dashboard来管理服务。
流量控制规则:
- 快速失败:到达指定的qps货线程数后,直接拒绝请求。
- 请求预热:将设置的qps在指定时间内,从指定值的1/3逐渐增长到指定值。场景:预防请求量的突然增长
- 排队等待:将超出qps的请求放入队列中排队,处理后按序放行,超过指定时间还没放行的请求会直接拒绝。场景:削峰填谷
降级规则:
- RT:超时拒绝服务,活动窗口时间过了就会恢复服务
- 异常比例
- 异常数
Dubbo
使用Dubbo RPC + Dubbo LB 代替 Feign + Ribbon