原创

SpringCloud学习笔记


SpringCloud学习

几大组件

​ eureka

​ ribbon

​ hystrix

​ zuul

​ feign

​ springcloud-config

搭建环境的步骤

​ 导入依赖

​ 编写配置

​ 启动器开启EnableXXX注解

微服务架构4个核心问题

​ 1.服务很多,客户端怎么访问?

​ 2.这么多服务?服务之间如何通信?

​ 3.服务如何治理?

​ 4.服务挂了怎么办

解决方案

​ spring cloud 生态

  1. spring cloud NetFlix

    ​ 一站式解决方案

    ​ api网关,zuul组件

    ​ Feign ---HttpClinet --Http通信方式,同步,阻塞

    ​ 服务注册发现:Eureka

    ​ 熔断机制:Hystrix

  2. Apache Dubbo Zookeeper

    ​ 半自动,需要整合别人的

    ​ api:没有,找第三方组件,或者自己实现

    ​ Dubbo

    ​ Zookeeper

    ​ 没有熔断机制,借助Hystrix

  3. spring cloud Alibaba

    ​ 最新的一站式解决方案,更简单

万变不离其宗

  1. API 路由
  2. HTTP,RPC 通信
  3. 注册和发现 高可用
  4. 熔断机制 防止服务崩溃

什么是SpringCloud

SpringCloud,基于springboot提供了一套微服务解决方案

服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件

SpringCloud为开发人员提供了快速构建分布式系统的一些工具

包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策精选、分布式会话等等

SpringCloud和SpringBoot的关系

  • Springboot专注快速方便的开发单个个体微服务

  • SpringCloud是关注全局的微服务协调整理治理框架

  • Dubbo和SpringCloud技术选型

    ​ 分布式+服务治理Dubbo

    ​ 目前成熟的互联网架构:应用服务化拆分+消息中间件

Eureka服务注册与发现

什么是Eureka

​ Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务以实现云端中间层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符就可以访问到服务。基于C/S架构

原理

  • Eureka采用了C-S的架构设计,EurekaServer作为服务注册功能的服务器,它是服务注册中心
  • Eureka包含两个组件 Eureka Server 和 Eureka Client
  • Eureka Server提供服务注册服务,各个节点启动后,会在EurekaServer中进行注册
  • Eureka Client使一个java客户端,用于简化EurekaServer的交互,客户端同时也具备一个内置的,使用轮询负载算法的负载均衡器

三大角色

  • Eureka Server:提供服务的注册与发现
  • Server Provider:将自身服务注册到Eureka中,从而使消费方能够找到
  • Server Consumer:服务消费方从Eureka中获取注册服务列表,从而找到消费服务

自我保护机制

  • 某时某刻一个微服务不可以用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存!
  • 在自我保护模式中,EurekaServer会保护服务注册表中的信息,不再注销任何服务实例
  • 是一种应对网络异常的安全保护措施 就是宁可保留所有微服务也不盲目注销任何健康的微服务

ACID原则

原子性 一致性 隔离性 持久性

CAP C 强一致性 A 可用性 P 分区容错性

CAP原则最多只能同时满足两种 不可能同时存在三种

由于分区容错性P在分布式系统中是必须要保证的,因此我们只能在A和C之间进行权衡

Zookeeper保证的是 强一致性和分区容错性  				CP

Eureka保证的是 可用性和分区容错性    						AP 

Ribbon

写在服务消费方

  • spring cloud rubbon 是基于Netflix Ribbon实现的一套客户端负载均衡的工具
  • 负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的高可用
  • 常见的负载均衡软件有Nginx、Lvs等待

分为集中式和进程式

  • 集中式 ​ 在服务的消费和提供方之间使用独立的LB设施,如Nginx:反向代理服务器,由该设施负责把访问请求通过某种策略转发至服务的提供方

  • 进程式 ​ 将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选出一个适合的服务器

    ​ Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址

Feign

  • ​ 是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service

  • ​ 只需要创建一个接口,然后添加注解即可

  • 调用微服务访问的两种方法

    ​ 1.微服务名字[ribbon]

    ​ 2.接口和注解[feign]

    ​ 在feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它(类似于Dao接口上标注Mapper注解,现在是微服务接口上标注一个Feign注解即可)

Hystrix

是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性

服务熔断

  • 在服务端做 某个服务超时或者异常,引起熔断
  • ‘断路器’本身是一种开关配置,当都某个服务单元发生故障之后,通过断路器的故障监控,向调用方法返回一个服务预期 ​ 的,可处理的备选响应,而不是长时间的等待或者抛出调用方法无法处理的异常,这样就可以保证了服务调用方的线程不 ​ 会被长时间、不必要的占用,从而避免了故障在分布式系统中的蔓延乃至雪崩
  • 当链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响 ​ 应信。当检测到该节点微服务调用响应正常后就会恢复调用链路
  • 熔断机制的注解 @HystrixCommand
  • 导入hystrix依赖可以使用

服务降级

  • ​ 在客户端做 从整体的网站请求负载考虑 当某个服务服务熔断或关闭之后,服务将不再被调用 此时在客户端可以准备一个自己的失败回调FallbackFactory 返回一个默认值
  • ​ 就是当一个服务器访问量过大时,关闭其他服务来保证访问量大的服务器

服务监控

  • 跟消费者相关 客户端相关
  • 单独一个包写这个监控页面监控服务器
  • 导入dashboard依赖
  • 主启动类@EnableHystrixDashboard 开启
  • 服务端要有监控的依赖 导入acturator依赖
  • localhost:端口号/hystrix 可以进入页面
  • 在其他服务端的主启动类增加一个servlet
@Bean	固定代码	需要导入Hystrix包
public ServletRegistrationBean xxx(){
			ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());				
			registrationBean.addUrlMappings("/actuator/hystrix.stream");
			return registrationBean;
}

Zuul路由网关

  • Zuul包含了对请求的路由和过滤两个最主要的功能
  • 路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程 进行干预,是实现请求校验,服务聚合等功能的基础。Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得
  • 提供:代理+路由+过滤 三大功能
  • Zuul会注册进Eureka

SpringCloud Config

​ springcloud config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置

分为服务端和客户端两部分:

  • 服务端

    ​ 也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密,解密信息等访问接口

  • 客户端

    ​ 是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。默认采用git来存储配置信息

分布式配置中心

  • 集中管理配置文件
  • 不同环境,不同配置,动态化的配置更新,分环境部署
  • 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉去配置自己的信息
  • 当配置发生变动时,服务不需要重启即可感知到配置的变化,并应用新的配置 (需要热部署插件)
  • 将配置信息以REST接口的形式暴露

bootstarp.yml和application.yml

bootstarp.yml 是系统级别的配置

application.yml 是用户级别的配置

客户端链接服务器 服务器链接远程仓库

​ bootstrap.yml配置例子

		spring:
		 cloud:
		  config:
		   name: config-client  #需要从git上读取的名称 不需要后缀
		   profile: dev		#设置被拿到哪个生产环境
		   lable: master   #设置从哪个分支去拿
		   uri: http://localhost:3344  #连接config-server
		全部配置好了相当于访问http://localhost:3344/config-client-dev.yml/master
	application.yml
		spring: 
		 application:
		  name: springcloud-config-client-3355	#配置名字

例如配置controller看是否能拿到数据

​ 例子

@RestController
public class ConfigClientController{
		@Value("${spring.application.name}")
		private String applicationName;
		@Value("${eureka.client.server-url.defaultZone}")
		private String eurekaServer;
		@Value("${server.port}")
		private String port;
		
		@RequestMapping("/config")
		public String getConfig(){
			return "application:" + applicationName+
					"eurekaServer:" + eurekaServer+
					"port:" + port;
		}
}
后端
springcloud

评论