写在前面

在前面学习了Eureka相关的基础知识,接下来将通过一些简单的示例,来学习如何使用Eureka构建注册中心以及进行注册与发现服务。

搭建服务注册中心

为了更好的学习,此处提供两种方式,第一种是基于一个基础的SpringBoot工程来构建,另一种则是直接构建Eureka项目。

基于普通的SpringBoot工程

第一步,创建一个普通的Spring Boot工程。首先需要创建一个普通的SpringBoot工程,工程名称为eureka-server,注意里面一个starter都不需要添加,这样创建成功后pom文件中只引用了一个父starter。

第二步,添加Eureka依赖。工程创建成功之后,需要向pom.xml文件中添加eureka-server依赖,笔者使用的SpringBoot版本是2.3.3,因此所对应的Eureka版本为Hoxton.SR7,请注意SpringBoot版本和Eureka的版本必须一一对应,开发者可以点击 这里进行查阅:

当然了,如果想查阅更为详细的版本对应信息,可以点击 这里

注意此时pom.xml依赖文件中的依赖信息添加,可以参考Spring Cloud Netflix,笔者这里贴一下自己的依赖文件信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.envy</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>

<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR7</spring-cloud.version>
</properties>

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

第三步,启动一个服务注册中心。开发者可以通过在项目启动类上添加@EnableEurekaServer注解进而达到启动一个服务注册中心的目的,如下所示:

1
2
3
4
5
6
7
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}

第四步,配置服务注册中心。开发者可以修改eureka-server项目的application.yml配置文件信息来自定义一些配置。如在默认情况下,该服务注册中心也会将自己作为客户端来尝试注册它自己,因此开发者可以通过增加如下配置来禁用它的客户端注册行为:

1
2
3
4
5
6
7
8
9
10
server:
port: 1111
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

简单解释一下上述配置的含义:

  • server.port=1111表示将该服务注册中心的端口设置为1111;
  • eureka.instance.hostname=localhost表示设置服务注册中心的hostname为localhost;
  • eureka.client.register-with-eureka=false由于目前创建的应用是一个服务注册中心,而不是普通的应用,默认情况下,这个应用会向注册中心(即它自己)注册它自己,这里通过设置为false来禁止这种默认行为;
  • eureka.client.fetch-registry=false由于注册中心的职责就是维护服务实例,它不需要去检索服务,所以也设置为false即可。

下图展示了一些Eureka相关常用的配置信息,开发者可根据需要进行自定义设置:

第五步,启动注册服务中心。在完成了上述配置信息之后,接下来可以启动这个SpringBoot工程,然后在浏览器地址栏中输入http://localhost:1111即可看到如下页面:

如果出现下面的错误,则说明导入eureka-server所依赖的jar包失败,这里提供一种解决办法:

直接构建Eureka项目

前面介绍的都是基于现有的SpringBoot项目来构建Eureka,其实开发者可以直接创建Eureka项目,如下图所示:

这样就快速构建出一个Eureka项目,此时的pom.xml中就自动添加了与当前SpringBoot版本相匹配的SpringCloud版本依赖。其他的操作和前面介绍的一样,因此就不过多介绍。

注册服务提供者

在完成了服务注册中心的搭建之后,接下来尝试往这个服务注册中心注册一个服务提供者了。

第一步,创建一个新的Eureka Client项目。首先创建一个基于SpringBoot的Eureka Client项目,名称为eureka-provider,具体的可以按照下图进行操作:

请注意在上图中必须添加Web依赖和Eureka Discovery Client依赖。此时对应的pom.xml依赖文件信息为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.envy</groupId>
<artifactId>eureka-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-provider</name>
<description>Demo project for Spring Boot</description>

<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR7</spring-cloud.version>
</properties>

<dependencies>
<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>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

这里之所以贴出pom.xml信息,那是因为通常会将现有SpringBoot项目改造成Eureka Client项目,因此这里贴出依赖便于后续改造使用。

第二步,创建应用的入口。由于这是一个web工程,因此可以添加一个Controller,并提供一个访问入口。在项目目录下新建controller包,并在里面新建HelloController文件,其中的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RestController
public class HelloController {
private static final Logger logger = LoggerFactory.getLogger(HelloController.class);

@Autowired
private DiscoveryClient client;

@GetMapping(value = "/hello")
public String index(){
List<ServiceInstance> instances = client.getInstances("hello-service");
for(int i=0;i<instances.size();i++){
logger.info("/hello,host: "+instances.get(i).getHost()+
",service_id: "+instances.get(i).getServiceId());
}
return "hello,world!";
}
}

这里通过新建一个/hello请求,并通过注入DiscoveryClient对象,在日志中将服务相关的信息打印出来。需要注意的是此处的DiscoveryClient对象必须是接口,也就是org.springframework.cloud.client.discovery.DiscoveryClient包内的对象。

第三步,激活Eureka中的DiscoveryClient。在Spring Boot项目的入口类上添加@EnableDiscoveryClient注解,用于激活Eureka中DiscoveryClient实现。因为在前面的HelloController中我们注入了DiscoveryClient对象,它是自动化配置,之后才能实现上述Controller中对服务信息的输出:

1
2
3
4
5
6
7
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}

第四步,配置服务名称和注册中心地址。最后需要在application.yml配置文件中通过spring.application.name属性来为服务命名,如命名为hello-service。接着再通过eureka.client.serviceUrl.defaultZone属性来指定服务注册中心的地址,此处指定为之前构建的服务注册中心地址,如下所示:

1
2
3
4
5
6
7
spring:
application:
name: hello-service
eureka:
client:
service-url:
defaultZone: http://localhost:1111/eureka/

第五步,启动项目。首先启动服务注册中心eureka-server,接着启动客户端eureka-client服务。在hello-service服务控制台中,Tomcat启动后会在com.netflix.discovery.DiscoveryClient对象打印该服务的注册信息,表示服务注册成功:

而此处如果你仔细观察服务注册中心的控制台,可以看到类似于下面的输出,名为hello-service的服务被注册成功了:

当然开发者也可以通过访问Eureka的信息面板,可以看到在Instances currently registered with Eureka一栏中看到服务的注册信息:

由于这里配置了访问接口/hello,因此,开发者可以通过访问http://localhost:8080/hello链接直接向该服务发起请求,此时可以看到在eureka-client项目的控制台输出以下信息:

这些输出内容就是之前我们在HelloController中注入的DiscoveryClient接口对象从服务注册中心获取的服务相关信息。

经过上述操作,一个简易的服务注册中心就搭建完成了,同时也向该服务注册中心注册了一个服务提供者,那么关于Eureka单机版的介绍就到此为止。