注册中心 —— SpringCloud Netflix Eureka

Eureka 简介

Eureka 是一个基于 REST 的服务发现组件,SpringCloud 将它集成在其子项目 spring-cloud-netflix 中,以实现 SpringCloud 的服务注册与发现,同时提供了负载均衡、故障转移等能力,目前 Eureka2.0 已经不再维护,故不推荐使用

Eureka 有两种角色组件:

  • Eureka Server:服务注册中心组件,提供了服务的注册与发现的接口
  • Eureka Client:各种微服务,把自身的服务实例注册到 Eureka Server 中,即服务提供者,也可通过 Eureka Server 获取服务列表,消费服务,即服务消费者

Eureka 的核心概念如下:

  1. 服务注册:在服务启动时,Eureka Client 会将自己的信息注册到 Eureka Server,Eureka Server 在收到信息后,会将数据信息存储在一个双层结构的 Map 中,其中,第一层存储的 Key 是服务的名称,第二层存储的 Key 是具体服务实例的名称(同一微服务节点可能会有多个实例)
  2. 服务同步:在 Eurcka Server 集群中,当一个 Eureka Client 向其中一个 Eureka Server 注册服务时,该 Eureka Server 会向集群中的其他 Eureka Server 转发这个 Eureka Client 的注册信息,从而实现 Eurcka Server 之间的服务同步
  3. 服务续约:Eureka Client 在注册中心完成注册时,会维护一个续约请求来持续发送信息给该 Eureka Server 表示其正常运行,当 Eureka Server 长时间收不到续约请求时,会将该服务实例从服务列表中剔除
  4. 服务启动:当一个 Eureka Server 初始化或重启时,本地注册服务为空。Eureka Server 首先调用 syncUp() 从别的服务节点获取所有的注册服务,然后执行 Register 操作,完成初始化,从而同步所有服务信息
  5. 服务下线:当服务实例正常关闭时,Eureka Client 会给 Eureka Server 发送一个服务下线的消息,Eureka Server 在收到信息后,会将该服务实例的状态设置为下线,并将该服务下线的信息传播给其他服务实例
  6. 服务发现:当一个 Eureka Client 依赖另一个 Eureka Client 时,这个 Eureka Client 作为服务消费者会发送一个信息节注册中心,请求获取注册的服务清单,注册中心会维护一份只读服务清单返回给服务消费者

搭建 Eureka 注册中心

创建 eureka-server 项目,引入依赖,本项目基于 SpringBoot 2.3.1,SpringCloud Hoxton.SR12

<dependencies>
    
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    ...
<dependencies>

在启动类上添加 @EnaleEurekaServer 注解,启用 Euerka 注册中心功能

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

在配置文件添加 Eureka 服务端的配置

server:
  port: 8001 # 指定运行端口

spring:
  application:
    name: eureka-server # 指定服务名称

eureka:
  instance:
    hostname: localhost # 指定主机名称
  client:
    fetch-registry: false # 指定能否从注册中心获取服务
    register-with-eureka: false # 指定是否将服务注册到注册中心

运行 main 方法启动服务,在浏览器中访问 http://localhost:8001/ 便可以看到 Eureka 注册中心的界面

创建 eureka-client 项目,引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

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

在启动类上添加 @EnableDiscoveryClient 注解,表明是一个 Eureka 客户端

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {

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

在配置文件添加 Eureka 客户端的配置

server:
  port: 8101 # 指定运行端口

spring:
  application:
    name: eureka-client # 指定服务名称

eureka:
  client:
    fetch-registry: true # 指定能否从注册中心获取服务
    register-with-eureka: true # 指定是否将服务注册到注册中心
    service-url:
      defaultZone: http://localhost:8001/eureka

定义接口

@RestController
public class DiscoveryController {

  @Autowired
  private DiscoveryClient discoveryClient;

  @Value("$(server.port)")
  private String port;

  @GetMapping("/serviceProducer")
  public Map serviceProducer() {
    //1:服务提供者的信息
    String services ="Services:" + discoveryClient.getServices() + " port :" + port;
    //2:服务提供者返回的数据
    Map result = new HashMap();
    result.put("serviceProducer", services);
    result.put("time", System.currentTimeMillis());
    return result;
  }
}

运行 main 方法,启动 eureka-client 项目,刷新 http://localhost:8001/ 页面,即可看到 cureka-client 已经注入 Eurcka 服务

再搭建一个 eureka-client 项目作为消费者,搭建过程与之前一样,使用 RestTemplate 调用服务

@Autowired
private RestTemplate restTemplate;

public String service() {
  return restTemplate.getForEntity("http://EUREKA-CLIENT/serviceProducer", String.class).getBody();
}

以上代码定义了一个名为 service 的服务,通过 RestTemplate 调用远程服务,EUREKA-CLIENT 为服务提供者的实例名称,serviceProducer 为服务映射的地址

也可以基于 Feign 调用服务

@FeignClient("EUREKA-CLIENT")
public interface Servers {
  @RequestMapping (value ="/serviceProducer", method = RequestMethod.GET)
  Map serviceProducer();
}

搭建 Eureka 注册中心集群

由于所有服务都会注册到注册中心,服务之间的调用都是通过从注册中心获取服务列表来调用的。注册中心一旦宕机,所有服务调用都会出现问题,因此需要多个注册中心组成集群来提供服务

创建两个 eureka-server 项目,eureka-server-1 项目的配置文件如下:

server:
  port: 8002 # 指定运行端口

spring:
  application:
    name: eureka-server-1 # 指定服务名称

eureka:
  instance:
    hostname: localhost # 指定主机名称
  client:
    fetch-registry: true # 指定能否从注册中心获取服务
    register-with-eureka: true # 指定是否将服务注册到注册中心
    service-url:
      defaultZone: http://localhost:8003/eureka/

eureka-server-2 项目的配置文件如下:

server:
  port: 8003 # 指定运行端口

spring:
  application:
    name: eureka-server-1 # 指定服务名称

eureka:
  instance:
    hostname: localhost # 指定主机名称
  client:
    fetch-registry: true # 指定能否从注册中心获取服务
    register-with-eureka: true # 指定是否将服务注册到注册中心
    service-url:
      defaultZone: http://localhost:8002/eureka/

通过两个注册中心互相注册,搭建注册中心的双节点集群。分别启动项目,查看 http://localhost:8001/http://localhost:8002/,可以看到两个注册中心已经分别注册了


posted @ 2023-08-13 12:17  低吟不作语  阅读(95)  评论(0编辑  收藏  举报