Spring Cloud Eureka服务注册中心

本指南将用Netflix Eureka做为服务注册中心(Service Registration and Discovery),详细介绍Eureka搭建服务注册中心的过程。

服务注册中心在分布式服务架构中非常有用,它支持客户端负载均衡,在不借助DNS的情况下将服务提供者与调用者解耦。

接下将创建一个Netflix Eureka服务注册中心,然后使用Spring Boot构建一个客户端应用,该应用在注册中心注册自己,并使用注册中心解析(自己的)主机。

Spring Cloud环境依赖

JDK 1.8或更高版本

Gradle 4+ 或 Maven 3.2+

使用Eureka构建服务注册中心

首先创建一个Spring Boot应用作为服务注册中心,然后使用Spring Cloud的@EnableEurekaServer注解构建注册中心服务。这是一个普通的Spring Boot应用程序,添加了一个@EnableEurekaServer注释以启用服务注册功能。

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaServiceApplication {

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

当注册中心启动时,可以注册多个实例,为了集中注意力可以禁用注册中心的日志。默认情况下,注册中心也会尝试注册自己,因此需要禁用。

在/src/main/resources/application.properties文件中添加以下配置属性:

--properties--server.port=8761

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF

注册服务和客户端

现在使用Sprint Boot创建一个客户端应用程序,为了简单将此应用做为服务进行注册,同时使用它对服务进行调用。

使用Spring Cloud DiscoveryClient查询注册中心,以获得主机(自己)和端口。 通过添加@EnableDiscoveryClient注解就能实现Netflix Eureka DiscoveryClient。因为Spring Cloud 对DiscoveryClient进行了抽象,所以,@EnableDiscoveryClient同样适用于Hashicorp的Consul或Apache Zookeeper。

/src/main/java/hello/EurekaClientApplication.java
package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {

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

@RestController
class ServiceInstanceRestController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/service-instances/{applicationName}")
    public List<ServiceInstance> serviceInstancesByApplicationName(
            @PathVariable String applicationName) {
        return this.discoveryClient.getInstances(applicationName);
    }
}

无论选择哪种实现,都需要在配置文件spring.application.name属性中指定应用名称,以便在服务注册中心使用。这个属性在Spring Cloud中会经常用到,在服务配置的早期阶段此属性用于引导服务。
/src/main/resources/bootstrap.properties会在src/main/resources/application.properties之前被应用发现。

/src/main/resources/bootstrap.properties
--properties--spring.application.name=a-bootiful-client

客户端在ServiceInstanceRestController中定义了一个Spring MVC REST端点,它可以返回注册中心所有ServiceInstance实例。

Eureka服务注册中心测试

首先,启动eurek服务中心,然后,启动eurek客户端,以测试端到端的调用。eurek客户端在注册中心注册自己大约需要一分钟,并从注册中心获取实例列表来刷新自己。