阅读 153

服务治理框架Eureka使用与简单理解

服务治理是分布式架构和微服务架构的核心功能,Eureka在Spring Cloud中负责服务注册和服务发现的组件。

服务架构流程分析

(1)通常我们会在应用中依赖Eureka Client,项目启动之后Eureka Client会向Eureka Server发送自己的信息进行注册

(2)注册成功之后,Eureka Client会向Eureka Server发送心跳来进行续约,否则将在90s内从服务器注册表中删除客户端信息

(3)Eureka Client定期从Eureka Server拉取服务注册表。

(4)应用下线会通知Eureka Server 移除相关信息,移除之后通知客户端更新服务信息。

总结归纳一下,Eureka的作用主要是包括:服务的注册,拉取,心跳,剔除等

Eureka服务端

(1)首先我们创建一个Spring Cloud 项目,然后项目中要添加依赖spring-cloud-starter-netflix-eureka-server。

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
复制代码

(2)我们要在启动类上添加@EnableEurekaServer 开启Eureka自动装配功能

@EnableEurekaServer
@SpringBootApplication
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

}
复制代码

(3)在配置文件中添加Eureka相关的配置

# 表示不对自己进行注册
eureka.client.register-with-eureka=false
# 表示是否从Eureka Server中获取Eureka的注册表信息
eureka.client.fetch-registry=false
复制代码

(4) 启动服务访问localhost:8080,可以正常访问Eureka页面,Eureka一般使用端口8761,我们可以增加

server.port=8761
复制代码

Eureka的服务注册与服务发现

(1)我们在pom.xml中加入maven依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
复制代码

(2) 因为服务的注册与发现是支持被动生效,我们可以不用加@EnableDiscoveryClient注解

(3) 配置上应用名称,端口,以及服务注册地址

spring.application.name=spring-cloud-provider
server.port=8081
# 表示服务注册的地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
复制代码

(4)服务启动之后,我们访问Eureka页面可以看到服务已经正常注册上去,我们可以使用以下配置进行id的自定义化显示。

eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
复制代码

(5)通过同样的方法创建消费者,消费者可以通过以下方法获取服务列表

@Autowired
private DiscoveryClient discoveryClient;

@GetMapping("getServices")
public List<ServiceInstance> getServices(){
  return discoveryClient.getServices()
          .stream()
          .map(sid -> discoveryClient.getInstances(sid))
          .collect(Collectors.toList())
          .stream()
          .flatMap(Collection::stream)
          .collect(Collectors.toList());
}
复制代码

Eureka的自我保护机制

当出现网络故障的时候,所有的服务与Eureka Server之间无法正常通信,Eureka Server收不到续约的信息,一段时间后将会移除没有续约的实例,这个时候即使是正常的服务也会被移除掉。自我保护机制就是为了避免因为网络分区故障而导致的服务不可以用而出现的。

如果不开启自我保护机制,当一个服务出现故障,无法续约的时候,Eureka Server会移除没有续约的服务,这个时候消费者无法拉取到服务提供者的信息,即使服务提供者是存活的也无法正常发起调用。

如果开启了自我保护机制,当一个服务出现故障,无法续约的时候,Eureka Server不会移除该实例,如果这个时候服务确实是下线了,这个时候由于没有移除信息,服务调用会出错。

这说明自我保护机制有利也有弊,但是实际在生产环境还是建议开启的,如果报错我们可以通过Ribbon进行重试。

总结

主要是对Eureka的简单使用和简单理解,Eureka的一些原理部分尚未涉及比如说注册表在Eureka的具体存储形势,比如说Eureka集群中数据的同步,比如说Eureka自我保护机制的实现原理等等

文章分类
后端
文章标签