SpringCloud - 03服务注册与发现Eureka
(1)Eureka[ju'ri:kə]概述
- Eureka是Netflix的一个子模块,也是核心模块之一。
- Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
- 有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,就不需要修改服务调用的配置文件了。
- 功能类似于Dubbo注册中心,如Zookeeper。
(2)Eureka原理简介
- Netflix在设计Eureka时遵守的就是AP原则。
- SpringCloud封装了Netflix公司开发的Eureka模块来实现服务注册和发现。
- Eureka采用了C/S的设计架构。Eureka Server作为服务注册功能的服务器,它是服务注册中心。
- 系统中的其他微服务,使用Eureka 的客户端连接到Eureka Server并维持心跳连接。这样可以通过Eureka Server来监控系统中各个微服务是否正常运行。
- SpringCloud的一些其他模块(如Zuul)可以通过Eureka Server来发现系统中的其他微服务,并执行相关的逻辑。

- Eureka包含两个组件: Eureka Server 和 Eureka Client
- Eureka Server 提供服务注册服务。各个节点启动后,在 Eureka Server中进行注册。
- Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点信息可以在Eureka界面中看到。
- Eureka Client 是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
- 在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。
- 如果Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中将这个服务节点移除(默认90秒)。
(3)Eureka服务注册中心
(3.1)POM文件
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
(3.2)application.yml配置文件
server:
port: 7001
eureka:
instance:
hostname: localhost // Eureka 服务端的实例名称
client:
register-with-eureka: false // false 表示不向注册中心注册自己
fetch-registry: false // false 表示自己端就是注册中心, 职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ //设置与Eureka Server交互的地址,用于查询和注册服务
(3.3)主启动类
@SpringBootApplication @EnableEurekaServer public class EurekaServer7001Application { public static void main(String[] args) { SpringApplication.run(EurekaServer7001Application.class, args); } }
(3.4)测试: http://localhost:7001 No instances available: 没有服务被发现

(4)注册服务microservicecloud-dept-provider
(4.1)POM文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(4.2)修改application.yml
eureka:
client: // 客户端注册进Eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: microservice-dept-provider
prefer-ip-address: true
(4.3)修改主启动类
@SpringBootApplication @EnableEurekaClient public class DeptProviderApplication { public static void main(String[] args) { SpringApplication.run(DeptProviderApplication.class, args); } }
(4.4)测试结果

(5)微服务注册信息完善
(5.1)修改application.yml
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: microservice-dept-provider // 自定义服务名称信息
prefer-ip-address: true // 访问路径显示IP地址
info: // 需要开启actuator : management.endpoints.web.exposure.include='*'
app.name: microservicecloud
company.name: www.bearpx.com
build.artifactId: ${project.artifactId}
build.version: ${project.version}
(5.2)父工程添加构建信息
<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> <delimit>$</delimit> </delimiters> </configuration> </plugin> </plugins> </build>
(5.2)测试

(6)Eureka自我保护
- 某些时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存。
- 默认情况下, 如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server 将会注销该实例(默认90秒)。
- 但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信。以上行为可能变得非常危险。
- 因为微服务本身是健康的, 此时不应该注销这个微服务。Eureka通过"自我保护模式"来解决这个问题。
- 当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点会进入自我保护模式。
- 一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据,即不会注销任何微服务。
- 当网络故障恢复(收到的心跳数重新恢复到阈值以上)后,该Eureka Server节点会自动退出自我保护模式。
- 自我保护模式是一种应对网络异常的安全保护措施,可以让Eureka集群更加的健壮、稳定。
- 使用 eureka.server.enable-self-preservation = false 禁用自我保护模式。
(7)服务发现microservicecloud-dept-consumer
(7.1)修改microservicecloud-dept-provider的Controller
@RestController @RequestMapping("/dept") public class DeptController { @Autowired private DeptService deptService; @Autowired private DiscoveryClient discoveryClient; @RequestMapping("/discovery") public Object discovery(){ List<String> list = discoveryClient.getServices(); System.out.println("------>" + list); List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("microservicecloud-dept-provider"); for(ServiceInstance srvInst : serviceInstanceList){ System.out.println(srvInst.getServiceId() + "\t" + srvInst.getHost() + "\t"
+ srvInst.getPort() + "\t" + srvInst.getUri()); } return this.discoveryClient; } // 省略其他代码(add/get/list 方法) }
(7.2)修改microservicecloud-dept-provider的主启动类
@SpringBootApplication @EnableDiscoveryClient public class DeptProviderApplication { public static void main(String[] args) { SpringApplication.run(DeptProviderApplication.class, args); } }
(7.3)测试: 先启动Eureka Server, 再启动服务提供者,访问http://localhost:8001/dept/discovery
------>[microservicecloud-dept-provider] MICROSERVICECLOUD-DEPT-PROVIDER 192.168.100.1 8001 http://192.168.100.1:8001

(7.4)修改microservicecloud-dept-consumer
修改application.yml
eureka: client: service-url: defaultZone: http://localhost:7001/eureka/ instance: instance-id: microservice-dept-consumer prefer-ip-address: true
(8)Eureka集群

(8.1)修改Eureka集群三个节点配置文件
eureka:
instance:
hostname: eureka7001.com // 修改宿主机hosts文件: 127.0.0.1 eureka7001.com
client:
register-with-eureka: true
fetch-registry: false
service-url:
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
server:
enable-self-preservation: false
eureka:
instance:
hostname: eureka7002.com
client:
register-with-eureka: true
fetch-registry: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
server:
enable-self-preservation: false
eureka:
instance:
hostname: eureka7003.com
client:
register-with-eureka: true
fetch-registry: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
server:
enable-self-preservation: false
(8.2)修改其他微服务的配置文件
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
浙公网安备 33010602011771号