写在前面
在前面学习了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单机版的介绍就到此为止。