SpringCloud的Eureka组件
1.* Eureka概述
1.*.& Eureka是什么
Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于Dubbo的注册中心,比如ZooKeeper。
Netflix在设计Eureka时遵守的就是AP原则。
1.*.& Eureka的基本架构
SpringCloud封装了Netflix公司开发的Eureka模块来实现服务注册和发现(请对比ZooKeeper)。
Eureka采用了C-S的设计架构。Eurake Server作为服务注册功能的服务器,它是服务注册中心。
而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。SpringCloud的一些其他模块(比如Zuul)就可以通过Eureka Server来发现系统中的其他微服务,并执行相关的逻辑。
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动之后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用节点的信息,并可以在界面中直观地看到。
Eureka Client是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
1.*.& Eureka的三大角色
- Eureka Server:提供服务注册与发现
- Service Provider:服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到
- Service Consumer:服务消费方,从Eureka获取注册服务列表,从而能够消费服务
1.* Eureka Server服务注册中心建立
1.*.& 创建microservicecloud-eureka-7001模块
在之前基础上,添加microservicecloud-eureka-7001模块。
1.*.& 修改pom.xml
1.*.& 编写yml
1.*.& 编写EurekaServer7001Application主启动类
在启动类上面,标注启动该新组件技术的相关注解标签@EnableEurekaServer:
1.*.& 测试
结果页面:
1.* 将已有的部门微服务注册进Eureka服务中心
将已有的microservicecloud-provider-dept-8001部门微服务注册进Eureka服务中心。
1.*.& 修改pom.xml
修改pom.xml文件,添加以下两个依赖:
点击查看代码
<!--将微服务provider注册进eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
1.*.& 修改yml
在application.yml中添加如下配置:
点击查看代码
eureka:
client: #客户端注册进eureka服务列表内
service-url:
#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: microservicecloud-dept8001
prefer-ip-address: true #访问路径可以显示IP地址
1.*.& 修改DeptProvider8001Application主启动类
在主启动类中添加注解标签@EnableEurekaClient,表示这是一个Eureka客户端。
1.*.& 测试
图中的Application就是我们的application.yml中定义的spring.application.name的名字。
1.* actuator与注册微服务信息完善
1.*.& 主机名称:服务名称修改
在microservicecloud-provider-dept-8001中修改application.yml,将spring.application.name值修改为microservicecloud-dept,将eureka.instance.instace-id修改为microservicecloud-dept8001,可以看到如下显示:
1.*.& 访问信息有IP信息显示
在microservicecloud-provider-dept-8001项目中,添加如下内容:
点击查看代码
eureka:
client: #客户端注册进eureka服务列表内
service-url:
#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: microservicecloud-dept8001
prefer-ip-address: true #访问路径可以显示IP地址
如上prefer-ip-address配置为true之后就可以显示IP地址:
1.*.& 微服务info内容详细信息
1.*.&.% 问题发现
当我们点击如图所示的超链接:
可以发现,如果没有配置好info内容详细信息,就会跳转到一个error page。
1.*.&.% 修改步骤
1、首先在父工程的pom.xml中添加如下内容:
点击查看代码
<build>
<finalName>microservicecloud</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<delimiter>$</delimiter>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
2、在microservicecloud-provider-dept-8001的pom.xml中添加actuator监控信息完善:
点击查看代码
<!--actuator监控信息完善-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3、在microservicecloud-provider-dept-8001的application.yml中添加info信息
点击查看代码
info:
app.name: hzhiping-microservicecloud
company.name: www.hzhiping.com
build.artifactId: $project.artifactId$
build.version: $project.version$
4、查看效果
分别前后启动microservicecloud-eureka-7001和microservicecloud-provider-dept-8001项目,查看info界面如下:
1.* Eureka的自我保护机制
Eureka Server在运行期间会去统计心跳失败比例在15分钟之内是否低于85%,如果低于85%,Eureka Server会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。
我们在单机测试的时候很容易满足心跳失败比例在 15 分钟之内低于 85%,这个时候就会触发 Eureka 的保护机制,一旦开启了保护机制,则服务注册中心维护的服务实例就不是那么准确了,此时我们可以使用eureka.server.enable-self-preservation=false来关闭保护机制,这样可以确保注册中心中不可用的实例被及时的剔除(不推荐)。
自我保护模式被激活的条件是:在1分钟后,Renews (last min) < Renews threshold。
这两个参数的意思:
- Renews threshold:Eureka Server期望每分钟收到客户端实例续约的总数。
- Renews (last min):Eureka Server最后1分钟收到客户端实例续约的总数。
具体的值,我们可以在Eureka Server界面可以看到:
可以看到,我们部署了3个Eureka Server(自注册模式),另外,又部署7个服务,注册到Eureka Server集群,参数值分别为:
- Renews threshold:17
- Renews (last min):20
下面说下Renews threshold和Renews threshold具体计算方式。
Renews threshold计算代码:
点击查看代码
this.expectedNumberOfRenewsPerMin = count * 2;
this.numberOfRenewsPerMinThreshold = (int) (this.expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold());
count表示服务的数量,如果Eureka Server开启自注册模式,也算一个服务,比如我们上面的示例,count的值就是10(3个自注册服务 + 7个独立服务),serverConfig.getRenewalPercentThreshold()默认是0.85(可以通过eureka.server.renewal-percent-threshold配置)。
所以,根据上面的分析,我们可以计算出Renews threshold的值:(int) (10 * 2 * 0.85) = (int) 17 = 17。
Renews (last min)计算方式:count * 2,数值2表示每30秒1个心跳,每分钟2个心跳的固定频率因子,所以具体值为:10 * 2 = 20。
如果在1分钟后,Renews (last min) < Renews threshold,默认需等待5分钟(可以通过eureka.server.wait-time-in-ms-when-sync-empty配置),即5分钟后你会看到下面的提示信息:
解决方式有三种:
- 关闭自我保护模式(eureka.server.enable-self-preservation设为false),不推荐。
- 降低renewalPercentThreshold的比例(eureka.server.renewal-percent-threshold设置为0.5以下,比如0.49),不推荐。
- 部署多个Eureka Server并开启其客户端行为(eureka.client.register-with-eureka不要设为false,默认为true),推荐。
Eureka的自我保护模式是有意义的,该模式被激活后,它不会从注册列表中剔除因长时间没收到心跳导致租期过期的服务,而是等待修复,直到心跳恢复正常之后,它自动退出自我保护模式。这种模式旨在避免因网络分区故障导致服务不可用的问题。例如,两个客户端实例C1和C2的连通性是良好的,但是由于网络故障,C2未能及时向Eureka发送心跳续约,这时候Eureka不能简单的将C2从注册表中剔除。因为如果剔除了,C1就无法从Eureka服务器中获取C2注册的服务,但是这时候C2服务是可用的。
所以,Eureka的自我保护模式最好还是开启它。
Eureka Server单机版配置示例:
点击查看代码
debug: true
spring:
application:
name: eureka-server
logging:
level:
com.netflix.eureka: 'off'
com.netflix.discovery: 'off'
server:
port: 8100
eureka:
instance:
hostname: localhost
server:
enable-self-preservation: false #关闭自我保护机制,不推荐
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
1.* Eureka的服务发现
对于注册进Eureka里面的微服务,可以通过服务发现来获取到该服务的信息,步骤如下:
1、修改microservicecloud-provider-dept-8001工程的DeptController,注入相关的服务发现类
2、先启动EurekaServer服务,然后再动microservicecloud-provider-dept-8001的启动类
3、访问浏览器,查看对应的服务发现
4、microservicecloud-consumer-dept-80工程的DeptConsumerController修改:
5、访问对应的地址
1.* Eureka集群配置
1、新建microservicecloud-enureka-7002/microservicecloud-enureka-7003
2、修改对应模块的pom文件
3、修改7002和7003的启动类
4、在hosts文件中修改映射配置
5、三台Eureka服务器的yml配置
6、microservicecloud-provider-dept-8001微服务发布上面三台Eureka集群配置中
标签:服务,SpringCloud,eureka,microservicecloud,注册,组件,Eureka,Server From: https://www.cnblogs.com/hzhiping/p/16796832.html具体按照上述步骤查看工程代码。