微服务架构的4个核心问题:
- 服务很多,客户端应该如何访问?
- 这么多服务,服务间应该如何通信?
- 这么多服务,如何治理?
- 服务挂了怎么办?
解决方案:
spring cloud 生态
-
springCloud NeFlix 一站式解决方案
api网关 zuul组件
Feign —HttpClient —Http通信方式,同步,阻塞
服务注册与发现 Eureka
熔断机制:Hystrix
-
Apache Dubbo Zookeeper
API:没有,使用第三方组件,或自己实现
Dubbo
Zookeeper
熔断机制:没有
方案不完善
-
springCloud Alibaba 一站式解决方案,更简单
SpringCloud和Springboot
- springboot专注于单个微服务的开发
- springcloud关注于全局的微服务协调治理框架,它将springboot开发的一个个单体服务整合并管理起来,为各个微服务之间提供:配置管理、服务发现、端路器、路由、微代理、事件总线、全局锁、决策竞选、分布式对话等集成服务。
- springboot可以离开springcloud独立使用,但是springcloud依赖springboot
- ** springboot专注于快速、方便开发单个个体微服务,springcloud关注全局的微服务治理框架**
环境搭建
- 新建maven项目
- 导依赖
- springcloud
- springboot
- 数据库
- springboot启动器
- log4j
- Junit
- 创建连接数据库
- 创建实体类(实现序列化)
- 编写配置文件
- 提供者
- 消费者
Rest访问
Eureka 服务注册与发现
Eureka Server 提供服务注册与发现
Eureka Client 心跳机制(默认30s刷新)
与Zookeeper的区别:
CAP原则:C-数据一致性 A-可用性 P-容错性
- Zookeeper满足CP,Eureka满足AP
- Zookeeper:数据要在各个服务间同步完成才返回用户结果,如果出现网络波动,会立即从服务列表中删除,服务不可用
- Eureka:网络波动时,启动自我保护机制,虽然用户获取到的服务有可能不可用,但是能获取到服务列表,访问服务列表时可以利用重试机制,找到正确可用的服务,更符合分布式高可用需求
- Zookeeper集群节点中有主从之分,Eureka各个集群节点平等
- Eureka服务发现要主动获取,Zookeeper采用监听机制
- Zookeeper监听服务列表变化,实时通知客户端更新
- Eureka主动获取服务列表,将其缓存,30s后重新拉取
基于NeFlix Ribbon实现的一套客户端负载均衡工具。
负载均衡(LoadBalance)
将用户的请求均摊到多个服务器上,从而达到系统的高可用(HA)
常见算法:
Feign
声明式web server客户端,让服务间调用更简单,调用微服务的两种方法:
Hystrix
用于分布式系统的延迟和容错的开源库,断路器
服务熔断
(服务端)对应雪崩效应的一种微服务链路保护机制。当某服务不可用或者调用超时时,调用备选方法,快速响应,返回友好提示(类似保险丝):
- 导包
- 编写熔断备选方法,使用@HystrixCommand(fallbackMethod=“备选方法”)注解指定熔断回调方法
- 开启断路器 @EnableDiscoveryClient(服务发现)/@EnableCircuitBreaker(过时)
服务降级
(客户端)从整体网站请求负载考虑,当某个服务熔断或者关闭之后,服务将不再被调用,此时客户端可以准备一个fallbackFactory,返回一个默认值,整体服务水平下降,但是请求是正常的
@FeignClient (value=“”, fallback=“继承fallbackFactory的类”)
Dashboard流量监控
- 导依赖(spring-cloud-starter-netflix-hystrix-dashboard)
- 开启@EnableHystrixDashboard
- 增加一个ServletRegistrationBean bean = new ServletRegistrationBean (new HystrixMetricsStreamServlet());
- bean.addUrlMappings(“/actuator/hystrix.stream”);
Zuul路由网关
包含对请求的路由和过滤
Zuul本身会注册到Eureka中
- 导入依赖
- 编写配置文件
- 开启@EnableZuulProxy
Spring Cloud Config 分布式配置中心
中文文档:
https://www.bookstack.cn/read/spring-cloud-docs/docs-project-SpringCloudConfig.md