Spring Cloud是什么东西?
SpringCloud是基于SpringBoot的一整套实现微服务的框架。 它提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。最重要的是,基于SpringBoot,会让开发微服务架构非常方便。
================================================================================================
分布式和微服务的区别?
从概念理解,分布式服务架构强调的是服务化以及服务的分散化,微服务则更强调服务的专业化和精细分工;从实践的角度来看,微服务架构通常是分布式服务架构,反之则未必成立。所以,选择微服务通常意味着需要解决分布式架构的各种难题
1. 注册中心Eureka
- 服务注册
Eureka Server作为服务注册中心,为微服务架构提供服务注册功能。微服务节点启动后,会在Eureka中进行注册,Eureka Server中会存储所有的可用微服务节点信息。 - Eureka客户端
Eureka Client是一个java客户端,用于简化与Eureka Server的交互。客户端同时也具备一个内置的、使用轮询算法的负载均衡器。 - 心跳检测
在应用启动后,客户端将会向Eureka Server发送心跳(默认为30秒,我们项目配置的是30秒)。Eureka Server如果在多个心跳周期内没有收到某个微服务节点的心跳,将会剔除该节点(默认90秒,我们项目配置的是90秒)。 - 集群数据同步
Eureka Server之间通过复制的方式来进行数据同步。 - 客户端缓存功能
Eureka Client具有缓存功能,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。 - 清理失效节点
- 自我保护模式
自我保护模式是指在网络出现异常的情况下,由于Eureka Server无法收到客户端的心跳续约,Eureka Server会判断该节点不可用,但其实该节点可能是正常的,可用的。为了避免误删,Eureka Server引入了自我保护模式。
======================================================================================================
eureka和zookeeper的区别?
eureka: AP, 强调可用性;集群 - 对等结构
zookeeper: CP, 强调一致性;集群 - 主从结构
2. 负载均衡ribbon
ribbon 提供了负载均衡和重试功能, 它底层是使用 RestTemplate 进行 Rest api 调用
#yml配置
ribbon:
MaxAutoRetriesNextServer: 2
MaxAutoRetries: 1
OkToRetryOnAllOperations: true
-
ConnectionTimeout
-
ReadTimeout
-
OkToRetryOnAllOperations=true
默认只对GET请求重试, 当设置为true时, 对POST等所有类型请求都重试 -
MaxAutoRetriesNextServer
更换实例的次数 -
MaxAutoRetries
当前实例重试次数,尝试失败会更换下一个实例
======================================================================================================
RestTemplate
RestTemplate 是StringBoot提供的一个Rest远程调用工具
它的常用方法:
- getForObject() - 执行get请求
- postForObject() - 执行post请求
======================================================================================================
整合RestTemplate
- 创建 RestTemplate 实例
RestTemplate
是用来调用其他微服务的工具类,封装了远程调用代码,提供了一组用于远程调用的模板方法,例如:getForObject()
、postForObject()
等
======================================================================================================
@EnableDiscoveryClient
@SpringBootApplication
public class MainRibbonApplication {
@LoadBalanced
@Bean
public RestTemplate getRestTemplate() {
SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory();
f.setConnectTimeout(1000);
f.setReadTimeout(1000);
return new RestTemplate(f);
//RestTemplate 中默认的 Factory 实例中,两个超时属性默认是 -1,
//未启用超时,也不会触发重试
//return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(MainRibbonApplication.class, args);
}
}
======================================================================================================
@RestController
public class RibbonController {
@Autowired
private RestTemplate rt;
@GetMapping("/item-service/{orderId}")
public JsonResult<List<Item>> getItems(@PathVariable String orderId) {
//向指定微服务地址发送 get 请求,并获得该服务的返回结果
//{1} 占位符,用 orderId 填充
return rt.getForObject("http://localhost:8001/{1}", JsonResult.class, orderId);
}
@PostMapping("/item-service/decreaseNumber")
public JsonResult decreaseNumber(@RequestBody List<Item> items) {
//发送 post 请求
return rt.postForObject("http://localhost:8001/decreaseNumber", items, JsonResult.class);
}
/
@GetMapping("/user-service/{userId}")
public JsonResult<User> getUser(@PathVariable Integer userId) {
return rt.getForObject("http://localhost:8101/{1}", JsonResult.class, userId);
}
@GetMapping("/user-service/{userId}/score")
public JsonResult addScore(
@PathVariable Integer userId, Integer score) {
return rt.getForObject("http://localhost:8101/{1}/score?score={2}", JsonResult.class, userId, score);
}
/
@GetMapping("/order-service/{orderId}")
public JsonResult<Order> getOrder(@PathVariable String orderId) {
return rt.getForObject("http://localhost:8201/{1}", JsonResult.class, orderId);
}
@GetMapping("/order-service")
public JsonResult addOrder() {
return rt.getForObject("http://localhost:8201/", JsonResult.class);
}
}
3. Hystrix断路器
微服务宕机时,ribbon 无法转发请求。需要Hystrix来做容错
启动断路器,断路器提供两个核心功能:
- 降级,超时、出错、不可到达时,对服务降级,返回错误信息或者是缓存数据
- 熔断,当服务压力过大,错误比例过多时,熔断所有请求,所有请求直接降级
====================================================================================================
hystrix等待超时后, 会执行降级代码, 快速向客户端返回降级结果, 默认超时时间是1000毫秒
====================================================================================================
雪崩效应:是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程
熔断与降级的区别?
相似处:
- 目的一致
都是为了系统的稳定性,防止因为个别微服务的不可用而拖死整个系统服务; - 表现类似
在表现上都是让用户感知,该服务暂时不可用请稍后再试; - 粒度一致
粒度上,都是服务级别的粒度,某些情况下,也有更细的粒度,如数据的持久层,只允许查询,不允许增删改。
主要区别:
- 触发条件不同
服务熔断一般是某个服务挂掉了引起的,一般是下游服务,而服务降级一般是从整体的负荷考虑,主动降级; - 管理目标的层次不同
熔断其实是一个框架级的处理,每个微服务都需要,没有层次之分,而降级一般需要对业务有层级之分,一般是从最外围服务开始。
4. Feign声明式客户端接口
微服务应用中,ribbon 和 hystrix 总是同时出现,feign 整合了两者,并提供了声明式消费者客户端
调用流程
5. zuul API网关
zuul API 网关,为微服务应用提供统一的对外访问接口。zuul 还提供过滤器,对所有微服务提供统一的请求校验。