本篇是 SpringCloud 学习笔记的第五篇。 Eureka的单机版使用,在本篇中将详细的介绍Eureka是什么?能做什么?
本篇关联篇章如下:
Eureka Server 提供服务注册服务
各个节点启动后,会在EurekaServer 中进行注册,这样EurekaServer 中的服务注册表建辉存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到
Eureka Client Java客户端
Eureka Client 是一个 Java客户端,用于简化Eureka Server 的交互,客户端同时也丠一个内置的使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server 发送心跳(默认周期是30s)如果Eureka Server 在多个心跳周期内没有接受到某个节点的心跳,EurekaServer 将会从服务注册表中把这个服务节点移除(默认90s)
默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该Eureka Server节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话讲解:好死不如赖活着
综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。
在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保护模式。
某时刻某一个微服务不可用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存
上面主要是关于Eureka的介绍,下面Base之前构建的服务的生产者和消费者来实现单机版的Eureka
新建模块: springcloudDemo-Eureka-7001,具体的使用Maven构建模块的操作方法就不演示了,请查看上面的关联文章。具体项目结构:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>com.mike.demogroupId>
<artifactId>springcloudDemoartifactId>
<version>0.0.1-SNAPSHOTversion>
parent>
<artifactId>springcloudDemo-Eureka-7001artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eureka-serverartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>springloadedartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
dependency>
dependencies>
project>
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称, C:\Windows\System32\drivers\etc 的hosts已经加入映射
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#单机
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
打开 C:\Windows\System32\drivers\etc
将域名 eureka7001.com
映射到 127.0.0.1
至于其他操作系统,大家可以百度一下或谷歌,由于之后会有集群所以为了方便设置了域名。
package com.mike.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer//EurekaServer服务器端启动类,接受其它微服务注册进来
public class EurekaServer7001_App
{
public static void main(String[] args)
{
SpringApplication.run(EurekaServer7001_App.class, args);
}
}
启动 Eureka 模块
http://eureka7001.com:7001/
这里可以看到,没有任何服务注册进来。
服务提供者: springcloudDemo-provider-dept-8001,这个模块在之前我们已经构建完成。请查看文章开口的文章列表。
pom文件添加Eureka 的依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eurekaartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
父项目(springcloudDemo)
在POM文件中加入:
<build>
<finalName>springcloudDemofinalName>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
<configuration>
<delimiters>
<delimit>$delimit>
delimiters>
configuration>
plugin>
plugins>
build>
上面的修改主要是为了使 服务的提供者 设置的服务信息生效即下方的application.yml 修改中的内容:
info:
app.name: atguigu-springcloudDemo
company.name: www.atguigu.com
build.artifactId: $project.artifactId$
build.version: $project.version$
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: com.mike.demo.entities # 所有Entity别名类所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
name: springcloudDemo-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://XXXXXXXXXX:3306/cloudDB01 # 数据库名称
username: root
password: XXXX
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
eureka:
client: #客户端注册进eureka服务列表内
service-url:
#单机版
defaultZone: http://localhost:7001/eureka
instance: # 将服务名称修改 (页面中显示服务名称 原: localhost:springcloudDemo-dept:8001 修改为springcloudDemo-dept8001)
instance-id: springcloudDemo-dept8001
prefer-ip-address: true
info:
app.name: atguigu-springcloudDemo
company.name: www.atguigu.com
build.artifactId: $project.artifactId$
build.version: $project.version$
@EnableEurekaClient
//本服务启动后会自动注册进eureka服务中
查看服务是否注册进已经开启的Eureka服务器,首先启动Eureka服务器再启动服务的提供者(先有联通运营商后有我们这些联通用户并联网)
查看截图:
红框的查看已经显示了有一个服务注册进入到了Eureka服务器中,上面的红色报错,是因为Eureka自我保护机制导致,长时间没有服务注册。
下面重启所有的服务,查看错误是否消除
info:
app.name: atguigu-springcloudDemo
company.name: www.atguigu.com
build.artifactId: $project.artifactId$
build.version: $project.version$
– 对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
import org.springframework.cloud.client.discovery.DiscoveryClient;
@Autowired
private DiscoveryClient client;
// Eureka 服务发现测试
@RequestMapping(value = "/dept/discovery", method = RequestMethod.GET)
public Object discovery()
{
List<String> list = client.getServices();
System.out.println("**********" + list);
List<ServiceInstance> srvList = client.getInstances("MICROSERVICECLOUD-DEPT");
for (ServiceInstance element : srvList) {
System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t"
+ element.getUri());
}
return this.client;
}
重启Eureka 和 provider
输入: http://eureka7001.com:8001/dept/discovery
自此单节点的Eureka 如何部署并使用已经完成了。