SpringCloud介绍
概念: Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
1、什么是微服务架构
微服务架构将系统按照功能点进行拆分,拆分出独立的微型的系统 对比下SOA:
SOA:更加侧重于 分层,没有集成的servlet容器,在统一的语言环境实现(一个服务)
微服务:更加侧重于 功能拆分 三层都有,集成servlet容器,跨平台跨语言(独立的应用)
2、拆分出来的SOA/微服务架构需要考虑的问题
+ 1 系统通信问题? dubbo
+ 2 服务的治理的问题? zookeeper
+ 3 负载均衡的问题? nginx
+ 4 登录一次的问题? sso-->springseucity/cas/
+ 5 配置文件集中管理? apollo,nacos,spring cloud config
+ 6 级联失败的问题? hystrix , alibaba sentinel
spring cloud 组件解决
spring cloud 是基于【springboot】的一系列框架的有序集合,通过springboot提供了自动配置,进行自动的配置,屏蔽掉复杂的配置和原理,提供简单易用的功能。提高开发效率。
1.添加起步依赖 2.添加注解 Eanble*
3、Spring Cloud 和 Dubbo的区别
dubbo 实现通信的框架
实现通信的协议 RPC
性能高
spring cloud
是一些列框架合集
实现通信 HTTP
性能低
4、restTemplate
restTemplate 是spring的组件 (http的客户端)理解:可以模拟浏览器发送请求 和接收响应。restTemplate是封装了httpclient/okhttp/urlconnection(理解成浏览器的内核)。默认的情况下使用的是urlconnection。 回顾创建springboot步骤
- 创建一个maven项目
- 在pom.xml中配置parent 和 起步依赖
- 启动类注解@SpringbootApplication
- 配置文件application.yml
注意:如果创建的maven项目是灰色的,在IDEA右边maven点击 + 号,去对应的文件中添加pom.xml
5、使用RestTemplate步骤
- 使用RestTemplate现在spring容器中注册
- 在controller中注入RestTemplate
- 调用RestController的方法(getForObjec),远程调用provider,获取用户数据
- RestTemplate会自动将 Json 转为对象类型
6、spring cloud eureka
一、Eureka简介
Eureka解决了第一个问题:服务的管理,注册和发现、状态监管、动态路由(负载均衡)
Eureka负责管理记录服务提供者的信息。服务调用者无需自己寻找服务,Eureka自动匹配服务给调用者
Eureka与服务之间通过心跳机制进行监控
spring cloud euraka 作为注册中心使用
基础架构图
注册中心(建立服务名和 ip,port的映射关系 user-provider:["localhost:18081","localhost:18082"])
eureka 有两个角色: 1 Eureka server 服务端 微服务
2 Eureka client 客户端 微服务
Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
服务提供者:启动后向Eureka注册自己的信息(地址,提供什么服务)
服务消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
在以上使用RestTemplatte的案例中,我们访问的ip 和 端口并不是动态的,使用eureka进行改进
在这之前我们先创建了父工程,对springboot 和 springcloud做统一版本控制
父工程的打包方式为pom
<!--springboot的版本控制-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<!--SpringCloud包依赖管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1、创建eureka 服务端(springboot工程)
首先导入依赖
<dependencies>
<!--eureka-server依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
在主启动类中加@EnableEurekaServer注解 开启 eureka 该微服务作为服务端
在application.yml进行配置
server:
port: 7001 #端口号
spring:
application:
name: eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId)
eureka:
client:
register-with-eureka: false #是否将自己注册到Eureka中
fetch-registry: false #是否从eureka服务端获取服务信息
service-url:
defaultZone: http://localhost:7001/eureka # EurekaServer的注册地址
2、创建客户端(provider提供者) 导入依赖
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在主启动类中加@EnableEurekaClient注解 启动eureka client 该微服务就是一个eureka 的客户端
在application.yml中进行配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
application:
name: user-provider
server:
port: 8081
# 配置注册地址
eureka:
client:
service-url:
#EurekaServer的地址
defaultZone: http://localhost:7001/eureka
3、创建客户端(consumer消费者) 导入依赖
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在主启动类中加@EnableEurekaClient注解 启动eureka client 该微服务就是一个eureka 的客户端
在application.yml中进行配置
server:
port: 8082
spring:
application:
name: user-consumer
# 配置注册地址
eureka:
client:
service-url:
#EurekaServer的地址
defaultZone: http://localhost:7001/eureka
三个工程都开启,访问我们的 eureka 工程的地址
这样就看到服务中注册的两个客户端,接下来就解决动态获取ip 和 端口
eureka的自我保护机制
当自我保护机制开启的状态:会判断 在 15 分钟内,低于 85% 的错误率,没必要剔除
相当于在15分钟内容 发送100个请求,有84个错误,有16次成功,那么就不会剔除,如果一旦超过一个阈值,就任务提供者挂掉,会自动剔除
自我保护机制:
默认的情况下开启了自我保护机制,当在15分钟内,错误率低于 85%,是不会剔除,超过了85% 就会剔除
服务端 微服务
+搭建步骤:
+ 1.添加起步依赖(eureka-server)
+ 2.@EnableServer
+ 3.配置注册的地址
客户端 微服务
+搭建步骤
+ 1.添加起步依赖(eureka-client)
+ 2.@EnableClient
+ 3.配置注册的地址
使用:从eureka中动态获取id和端口进行调用
PO : 持久化对象 setter getter(数据库表对应关系)
POJO : 简单的JAVA对象
DTO : 数据传输对象 (Data transfer Object) 用于系统通信时使用 封装数据(侧重数据)
BO : 业务对象 一般用于业务层
VO : 值对象(Value Object)一般用于web层
ENTITY : 持久化对象 一般在ORM框架中的说法
注意:
如果我们想复制一个maven项目,复制出来的文件名是灰色的,没有蓝色的模块标志
是因为刚复制出来的 artifactId 和之前同名重复了,还有要在我们父模块中pom.xml新增module标签
再次刷新一下pom文件就可以了
7、spring cloud ribbon
一、功能
- 实现负载均衡的组件
- 能实现Ribbon的轮询,随机算法配置
- 理解源码对负载均衡的切换
二、Ribbon简介
什么是Ribbon?
Ribbon 是 Netflix 发布的负载均衡器,有助于控制HTTP客户端行为,为Ribbon配置服务提供者地址列表后,Ribbon就可以基于负载均衡算法,自动帮助服务消费者请求。
Ribbon默认提供负载均衡算法:轮询,随机,重试法,加权,当然,我们可用自己定义负载均衡算法
三、使用
- 在user-consumer 工程中添加起步依赖
- 加一个注解loadBalanced
- 修改调用的方式
8、Hystrix
8.1 Hystrix简介
Hystrix,英文意思是豪猪,全身是刺,刺是一种保护机制。Hystrix也是Netflix公司的一款组件
Hystrix的作用是什么?
Htstrix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库、防止出现级联失败就是雪崩效应
8.2 雪崩效应
什么是雪崩效应?
1.微服务中,一个请求可能需要多个微服务接口才能实现,会形成复杂的调用链路。
2.如果某服务出现异常,请求阻塞,用户得不到响应,容器中线程不会释放,于是越来越多的用户请求堆积,越来越多线程阻塞。
3.单服务支持线程和并发数有限,请求如果一直阻塞,会导致服务器资源耗尽,从而你导致所有其他服务都不可用,从而形成雪崩效应
Hystrix解决雪崩问题的手段,主要是服务降级(兜底),线程隔离
熔断器状态机有3个状态:
1.Closed:关闭状态,所有请求正常访问
2,Open:打开状态,所有请求都会被降级
Hystrix会对请求情况计数,当一定事件失败请求百分比达到阈值,则触发熔断,断路器完全关闭默认失败比例的阈值是 50%。请求次数最低不少于20次
3.Half Open:半开状态
Open状态不是永久的,打开一会后会进入休眠时间(默认5秒),休眠事件过去会进入半开状态
半开状态:熔断器会判断下一次请求的返回状况,如果成功,熔断器切回closed状态,如果失败,熔断器切回open状态。threshold reached到达阈值
uoder threshold 阈值以下
防止雪崩的效应的仿生:
1.线程隔离 (壁仓模式)
2.熔断需要 进行 兜底方法(服务降级)(备胎模式)(比如正常获取真实数据,出现错误返回虚拟数据)
3.信号量 (当达到一定阈值,不允许请求进来)
流程图:
hystrix的使用
加入步依赖 是在调用方 加入起步依赖
<!--熔断器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
启用注解enbale*
在方法中修饰一个HystrixCommand注解指定兜底的方法
兜底的方法要求:方法的返回值返回值一致,方法的参数类型和个数保持一致
9、 小结
- Hystrix的作用:用于隔离访问远程服务、第三方库、防止出现级联失败也就是雪崩效应。
- 理解雪崩效应:
properties
1.微服务中,一个请求可能需要多个微服务接口才能实现,会形成复杂的调用链路。
2.如果某服务出现异常,请求阻塞,用户得不到响应,容器中线程不会释放,于是越来越多用户请求堆积,越来越多线程阻塞。
3.单服务器支持线程和并发数有限,请求如果一直阻塞,会导致服务器资源耗尽,从而导致所有其他服务都不可用,从而形成雪崩效应;
- 知道熔断器的3个状态以及3个状态的切换过程
properties
1.Closed:关闭状态,所有请求正常访问
2.Open:打开状态,所有请求都会被降级。
Hystrix会对请求情况计数,当一定时间失败请求百分比达到阈(yu:四声)值(极限值),则触发熔断,断路器完全关闭
默认失败比例的阈值是50%,请求次数最低不少于20次
3.Half Open:半开状态
Open状态不是永久的,打开一会后会进入休眠时间(默认5秒)。休眠时间过后会进入半开状态。
半开状态:熔断器会判断下一次请求的返回状况,如果成功,熔断器切回closed状态。如果失败,熔断器切回open状态。
threshold reached 到达阈(yu:四声)值
under threshold 阈值以下
- 能理解什么是线程隔离,什么是服务降级
properties
1.线程隔离:是指Hystrix为每个依赖服务调用一个小的线程池,如果线程池用尽,调用立即被拒绝,默认不采用排队。
2.服务降级(兜底方法):优先保证核心服务,而非核心服务不可用或弱可用。触发Hystrix服务降级的情况:线程池已满、请求超时。
- 能实现一个局部方法熔断案例
properties
1.定义一个局部处理熔断的方法failBack()
2.在指定方法上使用@HystrixCommand(fallbackMethod = "failBack")配置调用
- 能实现全局方法熔断案例
properties
1.定义一个全局处理熔断的方法defaultFailBack()
2.在类上使用@DefaultProperties(defaultFallback = "defaultFailBack")配置调用
3.在指定方法上使用@HystrixCommand
\