eureka服务治理
netflix公司(视频网站)的服务注册发现机制的技术,被springcloud拿来实现服务治理,springcloud中唯一可以使用的一个服务治理组件.springcloud核心组件,没有这个组件,无法实现其他的微服务功能.
eureka的功能
eureka组件两个角色
搭建的功能可以使用eureka不同角色实现服务治理的不同功能
客户端:eureka-client,就是配合拆分的项目(springboot-user,springboot-order),实现注册与发现.
服务端:eureka-server,管理所有的注册信息.
eureka治理组件的结构
搭建springboot的eureka-server的过程
一旦依赖了eureka-server springboot自动实现整个配置过程,启动时与运行eureka-server进程
搭建的eureka-server名字叫做注册中心。默认情况下把当前工程运行的进程既看成服务端,也堪称是客户端(默认自己在自己的注册中心注册自己的服务信息)
服务名称:高可用时,多个eureka-server公用的一个服务名称
ip优先:如果不设置ip优先,所有治理通信使用域名,本机localhost无法在服务器集群中使用,true使用网卡ip地址
关闭抓取:由于注册中心自己把自己看成eurekaclient,如果不关闭注册抓取,会在启动时报错,找不到服务端.
注册中心地址:高可用结构中,多个注册中心相互注册时配置的值.
配置启动类
@EnableEurekaServer
访问http://localhost:8761观察控制台
多个客户端注册的结构上可以通过控制台观察注册信息(目前注册信息是空的)
搭建eureka-client客户端工程
客户端功能需要携带信息到注册中心注册数据,等待被别人(外界客户端,外界浏览器,内部其他服务)调用发现.所以eureka-client基本都是微服务.
quickstart
pom文件
继承自定义父级工程(1.5.9.RELEASE的springboot)
依赖:
eureka-client依赖
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
application.properties
端口 8091
服务名称 service-hi
ip-prefer
注册中心地址
默认注册和抓取就是true,不需要单独配置
server.port=8091
spring.application.name=service-hi
#eureka -client
eureka.instance.prefer-ip-address=true
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
启动类
@EnableEurekaClient
准备一个测试功能
以端口号为标识,返回一个helloworld 的字符串(区分集群中到底访问的是哪个服务实例)
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HiController {
//使用属性读取一个端口号
@Value("${server.port}")
private String port;
//测试访问案例,携带参数name 返回hello world 端口号
@RequestMapping(value="/client/hello",method=
{RequestMethod.GET,RequestMethod.POST})
public String sayHi(String name){
return "helloworld eureka "+name+",i am from "+port;
}
}
创建一个service-hi服务的集群
注册中心,管理一个服务(通过服务名称判断是否是同一个服务)的所有注册者信息
利用一个注册中心心中,启动多个后端服务工程,注册同一个服务名称实现服务集群的创建
eureka治理组件的原理
eureka客户端:
通过配置注册中心地址 http://localhost:8761/eureka, 对客户端提供了一个可以访问注册中心的接口地址,客户端总会通过http请求访问这个地址实现各种功能的调用.
注册: 客户端会在启动时,携带自身信息(服务名称,ip地址,端口号,等等),在注册中心维护一份注册信息,注册的开启与关闭就是通过配置eureka.client.register-with-eureka实现的
抓取: 客户端会访问注册中心服务端,实现每隔30秒中抓取一次注册中心的注册信息
心跳:客户端为了保证让服务端总是记录自己的信息而不做超时剔除,会每隔30秒钟发送一次心跳
eureka服务端
管理注册:根据请求过来的客户端携带的信息,在内存中生成一份当前微服务集群里所有微服务服务信息数据(双层map),而客户端抓取的注册信息就是这个双层map对象.双层map代码结构
map<String,map<String,Instance>>
第一层map的key值:服务名称,整个集群中,同一个服务名称只能在一个注册中心中存在一个key
第一层map的value值:第二层map对象
第二层map对象的key值: 实例名称.默认结构 域名:服务名称:端口号
第二层map对象的value值:该实例的详细信息,包含ip 端口 时间戳等
判断超时监听:
通过每隔60秒中,判断一次注册信息中所有实例的最后时间戳是否超时(距离现在时间)90秒没有客户端发送心跳检测,如果超过时间点,将会把实例从map对象中key-value剔除
保护机制:
为了防止由于网络波动导致的大面积的服务提供者未能有效的发送心跳续约,从而按照超时逻辑被剔除,而被提出的服务并没有宕机故障。会造成微服务不可用,甚至瘫痪。所以出现了保护机制。当eureka服务端,一次性判断大量服务宕机故障(15%以上),属于不正常剔除。开启保护机制,保存所有微服务不剔除。阈值(15%)测试环境中非常容易达到
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.
观察超时剔除可以关闭自我保护机制:
在注册中心中,关闭配置属性
eureka.server.enable-self-preservation=false
eureka治理中专业名词
注册中心:不要把他单独堪称服务端,也具备客户端角色
服务提供者(服务实例):都是客户端所在的工程
eureka的高可用结构
客户端集群:一旦将多个客户都安服务提供者启动后注册在注册中心,为同一个服务提供调用功能,这个集群就是高可用。
注册中心高可用:目前结构只有一个注册中心。没法形成高可用。一定要形成注册中心的集群。
原理:将多个(2个)注册中心,相互作为客户端进行注册,相互抓取注册信息同步数据。