Spring Cloud框架集

本文深入探讨微服务架构的概念,及其与分布式架构的区别。详细介绍了SpringCloud作为微服务框架的功能,包括配置管理、服务发现、断路器等组件。阐述了Eureka注册中心的工作原理, Ribbon负载均衡和Hystrix断路器的作用,以及Feign和Zuul在微服务中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述



Spring Cloud是什么东西?

   SpringCloud是基于SpringBoot的一整套实现微服务的框架。 它提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。最重要的是,基于SpringBoot,会让开发微服务架构非常方便。

================================================================================================

分布式和微服务的区别?

  从概念理解,分布式服务架构强调的是服务化以及服务的分散化,微服务则更强调服务的专业化和精细分工;从实践的角度来看,微服务架构通常是分布式服务架构,反之则未必成立。所以,选择微服务通常意味着需要解决分布式架构的各种难题

在这里插入图片描述



1. 注册中心Eureka

  1. 服务注册
    Eureka Server作为服务注册中心,为微服务架构提供服务注册功能。微服务节点启动后,会在Eureka中进行注册,Eureka Server中会存储所有的可用微服务节点信息。
  2. Eureka客户端
    Eureka Client是一个java客户端,用于简化与Eureka Server的交互。客户端同时也具备一个内置的、使用轮询算法的负载均衡器。
  3. 心跳检测
    在应用启动后,客户端将会向Eureka Server发送心跳(默认为30秒,我们项目配置的是30秒)。Eureka Server如果在多个心跳周期内没有收到某个微服务节点的心跳,将会剔除该节点(默认90秒,我们项目配置的是90秒)。
  4. 集群数据同步
    Eureka Server之间通过复制的方式来进行数据同步。
  5. 客户端缓存功能
    Eureka Client具有缓存功能,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。
  6. 清理失效节点
  7. 自我保护模式
    自我保护模式是指在网络出现异常的情况下,由于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毫秒




====================================================================================================

雪崩效应:是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程

熔断与降级的区别?

相似处:

  1. 目的一致
    都是为了系统的稳定性,防止因为个别微服务的不可用而拖死整个系统服务;
  2. 表现类似
    在表现上都是让用户感知,该服务暂时不可用请稍后再试;
  3. 粒度一致
    粒度上,都是服务级别的粒度,某些情况下,也有更细的粒度,如数据的持久层,只允许查询,不允许增删改。

主要区别:

  1. 触发条件不同
    服务熔断一般是某个服务挂掉了引起的,一般是下游服务,而服务降级一般是从整体的负荷考虑,主动降级;
  2. 管理目标的层次不同
    熔断其实是一个框架级的处理,每个微服务都需要,没有层次之分,而降级一般需要对业务有层级之分,一般是从最外围服务开始。

4. Feign声明式客户端接口

微服务应用中,ribbon 和 hystrix 总是同时出现,feign 整合了两者,并提供了声明式消费者客户端



调用流程
在这里插入图片描述



5. zuul API网关

zuul API 网关,为微服务应用提供统一的对外访问接口。zuul 还提供过滤器,对所有微服务提供统一的请求校验。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值