1.纵向拆分的独立系统的集群的问题
1.1没有引入管理的功能
系统的管理,授权,监听,熔断等逻辑都没有引入
1.2静态配置的负载均衡的强耦合
在庞大的纵向拆分的集群中,nginx的静态文件维护负载均衡逻辑,容易出现强耦合:
例如:集群中某些节点出现宕机/迁移
可以引入微服务的概念,从架构角度去解决问题
2.微服务框架
2.1微服务
从一个单体项目,从一个功能比较集中的项目中纵向拆分出来独立运行的功能,每个功能的系统–微服务
微:纵向拆分
服务:功能被调用
2.2微服务框架
一个框架技术能够管理大量的拆分的独立系统,监控,熔断等功能,这种框架技术–微服务框架
2.3spring cloud
轻量级的微服务框架,可以基于springboot的自动配置(减少了自定义的大量代码编写)实现了多个微服务框架的组件功能
eureka :服务治理
ribbon :客户端负载均衡调用
zuul:网关,微服务唯一对外提供的接口
feign:ribbon是同一种客户端,封装了ribbon
hystrix:熔断器
config:微服务中配置文件的管理者
1.Eureka服务治理组件
springcloud中的核心组件,可以实现对整个微服务集群所有节点进行服务的发现,服务的抓取和服务监听功能
1.1服务治理的概念中的三个角色
○ 服务注册中心:所有的服务的集中管理角色
○ 服务的提供者:服务提供者会将自己的信息打包(ip,port,服务名称等等),注册在注册中被注册中心管理和维护(注册)
○ 服务的调用者: 可以通过对注册中心的访问,获取服务提供者的信息,从而进行负载均衡的调用(抓取发现)
1.2入门案例服务注册中心
○ 准备一个springboot+springcloud开发环境的工程
§ pom:继承springboot-parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
§ dependencyManagement:导入springcloud的所有依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
§ 引入eureka注册中心的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
○ application.properties
server.port=8888
#eureka相关配置
##关闭当前配置中心的服务抓取和注册
#如果自己到自己注册,需要提供服务名称
spring.application.name=eurekaserver
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=false
#注册中心的地址,但凡是服务提注册者都需要配置这个地址
#注册者会访问这个地址的接口,携带自己节点的信息注册
eureka.client.serviceUrl.defaultZone=http://localhost:8888/eureka
○ 启动类
§ 添加一个eureka的注解,就能实现启动加载eureka的自动配置逻辑,实现一个web应用中包含一个eurekaserver的进程
@SpringBootApplication
//eureka注册中心进程启动时需要springboot加载扫描的注解
@EnableEurekaServer
public class StarterEurekaServer {
public static void main(String[] args) {
SpringApplication.run(StarterEurekaServer.class, args);
}}
○ web页面
http://localhost:8888/
上图显示的内容,就是当前注册中心维护的所有服务信息 展示的服务名称,服务实例名称,(服务的详细信息内存中维护的)
○ 注册中心的作用
§ 管理注册者的服务信息:
内部接收注册者的请求,注册者携带本机/节点的详细参数(ip,port,服务名称) 发送给注册中心,/eureka 接收请求,在内存中存储一个双层map对象 保存所有的内容
§ 服务的监听超时:
多个注册者同时注册一个服务,相当于一个具体的服务被一个集群管理接收请求,每60秒钟判断是否有服务提供者的续约超时达到90秒,一旦满足条件,将会从内存中间超时的实例剔除
○ 注册者实现的逻辑
注册:启动后,当前eureka client一旦赋予注册能力registerWithEureka=true,将会访问注册中心接口8888/eureka 携带详细信息,注册在注册中心,注册中心以服务名称为key值记录一个当前服务的所有节点信息的map对象
续约:eureka client一旦在注册中心提供注册的信息,将会每30秒发起一次心跳(heartbeat)请求,告知注册中心,当前实例是存活的
服务剔除:
30:客户端,发起心跳
60:注册中心,每隔60秒检测一次心跳最后时间
90:注册中心,检测发现超过90秒没有发起心跳检测,将会把该实例剔除
注册中心的保护机制
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
庞大的集群中,如果按照正常的逻辑,管理一个微服务集群(100个服务,每个20节点 2000注册者),超时续约的个数如果在15%以内,eureka注册中心,判断是正常超时,将会按照剔除逻辑对实例进行内存数据的清除,如果超过15%,认为适合不正常超时,将会开启保护机制,一旦开启,所有服务信息(map对象)不会做任何的剔除,形成对微服务的保护.
如果需要观察剔除的现象可以将保护机制关闭
注册中心的配置文件中配置保护关闭未false