SpringCloud学习总结(一)
一、简介
SpringCloud是Spring旗下的一个项目,是一系列框架的有序集合;Spring最擅长的就是集成,把世界上最好的框架集成到自己的项目中,SpringCloud也是一样,他将现在非常流行的一些技术整合到了一起,实现了诸如:配置管理、服务发现、负载均衡、熔断器等功能;协调分布式环境中各个系统,为各类服务提供模板性配置。
其主要涉及的组件包括:
- Eureka 注册中心
- Gateway 网关
- Ribbon 负载均衡
- Feign 服务调用
- Hystrix 熔断器
- Config 配置中心
架构图:
SpringCloud的版本以伦敦地铁站的名字来命名。
二、Eureka注册中心
Eureka服务注册中心,负责管理记录服务提供者的信息,提供服务注册和发现功能
原理图:
- EurekaServer 服务注册中心,对外暴露自己的地址
- 服务提供者 启动后向服务注册中心注册自己的信息(地址,提供的服务)
- 服务消费者 向服务注册中心订阅服务,Eureka会将对应服务的所有提供者的地址列表发送给消费者,并且定期更新
- 心跳(续约) 提供者定期通过http方式向Eureka刷新自己的状态
搭建EurekaServer工程
添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
编写启动类
//声明当前应用时Eureka服务
@EnableEurekaServer
@SpringBootApplication
@EnableDiscoveryClient //开启Eureka客户端发现功能
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
编写配置文件
server:
port: ${port:10086}
spring:
application:
name: eureka-server
eureka:
client:
service-url:
# eureka 服务地址,如果是集群的话;需要指定其它集群eureka地址
defaultZone: http://127.0.0.1:10086/eureka
# 不注册自己
register-with-eureka: false
# 不拉取服务
fetch-registry: false
server:
# 服务失效剔除时间间隔,默认60秒
eviction-interval-timer-in-ms: 60000
# 关闭自我保护模式(默认是打开的)
enable-self-preservation: false
服务注册:
就是在服务工程里添加Eureka的客户端依赖,客户端代码会自动把服务注册到Eureka中
添加依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
修改启动类,在启动类上加@EnableDiscoveryClient注解,开启客户端发现功能
修改配置文件
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
服务发现
添加依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
修改启动类
添加@EnableDiscoveryClient注解
编写配置文件
spring:
application:
name: consumer-demo
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
配置高可用的Eureka
Eureka可以是一个集群,形成高可用的注册中心
多个EurekaServer服务之间互相注册,当服务提供者注册服务到某一个节点时,该节点会把信息同步到每一个节点,从而实现数据同步,因此,无论客户端访问到的是集群中任意一个节点,都可以获取到完整的服务列表信息。
三、负载均衡Ribbon
Ribbon是netflix发布的负载均衡器,根据服务名到Eureka服务中获取服务地址列表,再根据或利用Ribbon负载均衡算法从地址列表中获取一个服务地址并访问
负载均衡算法:
- 轮询(默认)
- 随机
开启负载均衡
因为eureka中已经集成了Ribbon,所以无需导入新的依赖
在实例化RestTemplate的方法加@LoadBalanced注解
四、熔断器Hystrix
简介
Hystrix在英语中是豪猪的意思,它在微服务系统中是一款提供保护机制的组件,由netflix公司开发。
是一个开源的延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败
雪崩问题
由于某一个服务出现问题,导致线程阻塞,从而影响到其他正常的服务
Hystrix解决雪崩问题的方式
- 线程隔离
- 服务熔断
解读
- Hystrix会为每个依赖服务分配一个小的线程池,如果线程池已满调用将会立即拒绝,默认不采用排队,加速失败判断时间
- 用户的请求不再直接访问服务,而是通过线程池中空闲的线程来访问,如果线程池已满或请求超时,会进行服务降级
- 服务降级:优先保证核心服务,而非核心服务不可用或弱可用
- 服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多会影响当前依赖服务对应的线程池的资源,对其他服务没有影响
引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-hystrix</artifactId>
</dependency>
</dependencies>
开启熔断
启动类上添加@EnableCircuitBeaker注解
可以使用组合注解@SpringCloudApplication代替
@SpringBootApplication、@EnableDiscoveryClient和@EnableCircuitBeaker
服务熔断原理
熔断状态机模型
三个状态:
- 关闭 此时所有请求都可以正常访问
- 半开 会释放部分请求正常访问,如果成功,则关闭熔断器,否则打开熔断器
- 开启 此时所有请求都会被降级,默认5秒后会进入半开状态