接上篇,上篇我们实现了一个 Eureka Server 的服务功能,并且能够运行起来作为我们的注册中心。
此篇我们主要关心两个问题:
- 如何将我们的注册中心(Eureka Server)服务运行在我们指定的地方呢?
- 如何将我们的通用服务注册到我们的注册中心(Eureka Server)?
一、Eureka Server 打包及运行
1.1 Eureka Server 打包
上篇中,我们在 IDEA 中运行了我们的 Eureka Server 服务,但是这显然不适合线上环境,因为我们的大多数服务都是运行在 Linux 服务器上,并且绝大多数情况下,我们都是使用无界面的命令行模式进行操作。
因此,这里介绍一个简单打包和运行的方式。
- maven 编译打包
方法一、IDEA maven 打包
Run -> Edit Configuration -> + -> Maven
"Name" 处为此配置起一个名字,用于区分不同配置的打包,无命名要求。"Command line" 处填写 "clean package" 然后点击 "OK"
运行 Maven 编译打包
看到控制台的日志输出有错误信息," 'repositories.repository.id' must be unique" 原因是 pom.xml 中配置了两个重复 id 的 repository,删除一个,然后再运行编译打包。
编译打包成功后,可以在项目的系统目录中的 target 目录下找到已经打包好的 jar 包
方法二、使用 maven 命令行打包
找到项目的系统文件夹根目录。比如,我的项目的系统目录位于 D:\ProgramData\workspace\eclipse-workspace\default\eureka
。从文件系统进入该目录,在该目录的地址样输入 cmd
并回车,可以看到我们已经打开了一个 CMD 命令行窗口并且进入了 D:\ProgramData\workspace\eclipse-workspace\default\eureka
的工作目录。然后在此命令窗口中运行如下命令(或者点击 IDEA 中下方的 Terminal 窗口也同理)
mvn clean package
注:
- 默认情况下,我们打包生成的程序包是 .jar 文件
- 使用 maven 命令行打包的方式需要你的操作系统环境中安装了自定义的 maven 程序,并配置了环境变量。而 在 IDEA 中直接使用 maven 打包则无此要求,因为 IDEA 内置了 maven 程序。此处不额外赘述 maven 的安装与配置,如果你不会 maven 的安装与配置,直接百度或者直接使用方法一打包即可。
1.2 Eureka Server 服务运行
找到我们打包生成的 .jar 文件,你可以把它拷贝到任何你想要放的目录,当然也可以放到服务器的文件目录中,然后执行如下命令即可运行
java -jar eureka-0.0.1-SNAPSHOT.jar
注:
- 如果需要使用后台运行我们的服务,请百度搜索对应平台的后台运行即可,在此不作赘述。
二、Eureka Client
2.1 创建一个 Eureka Client 服务
创建一个 Eureka Client 服务的过程与创建 Eureka Server 服务的过程十分相似。在此,作简要说明
"File" -> "New" -> "Project" -> "Spring Initializr" -> 填写项目信息 -> 选择组件 -> 填写包名及项目路径(默认)-> "finish"
(如果在 "Spring Initializr" 的下一步出现了错误,请将下方 Default: https://start.string.io
改为 Custom: http://start.string.io
)
至此,一个 Eureka Client 的架子就搭起来了。
2.2 项目配置及注意
- 删除多余目录
如上一篇中所说,将 mvnwp 相关目录删除
- pom.xml 配置
在我写这篇文章这天,Spring 发布了 Finchley 的正式版本,但由于我们的 Eureka Server 使用的是 Finchley.RC2 版本,因此,我们尽量保持服务端与客户端版本一致。可以都使用 RELEASE 版本或者 RC2 版本(此处,我使用 RC2 版本,因为本地有缓存不用再下载了... 另外记得添加 repositories)
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jiangzhuolin</groupId>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RC2</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>
</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
注: 如需要开发一个 Client 端面,基础的 dependecy 部分请尽量保持与如上的 dependecy 一致。
- 项目配置
(1) @EnableDiscoveryClient/@EnableEurekaClient
要使我们的项目能够成为一个 Eureka Client,需要给我们的启动入口类添加一个 @EnableDiscoveryClient 注解
package com.jiangzhuolin.eurekaclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
注:
- @EnableDiscoveryClient 与 @EnableEurekaClient 这两个注解在最新的 spring cloud 版本中已经完全分离了,其中 EnableDiscoveryClient 是基于 spring-cloud-commons 组件的,而 EnableDiscoveryClient 是基于 spring-cloud-netflix 组件,经我分析源码以及测试来看,二者在使用 Eureka Server 注册中心时没有区别。而网上部分人说的 EnableDiscoveryClient 可以在使用其他注册中心时也可用,而 EnableEurekaClient 则只针对 Eureka Server 注册中心 时有效。此处待验证,源码地址如下所示:
(2) application.yml 配置
将 resources 下自动生成的 application.properties 改为 application.yml 并添加如下配置
spring:
application:
name: client-test
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
其中:http://localhost:8000/eureka/
对应我们的 Eureka Server 的地址。
2.3 项目运行
(1) 运行方式一: IDEA 中直接运行
右键 EurekaClientApplication 类 -> "Run 'EurekaClientApplication...'" 或者 "Run" -> "Run EurekaClientApplication"
IDEA 中运行类的方式很多,此处仅列举此两种。
(2) 运行方式二: 命令行运行打包文件
项目的打包与运行方式与此文前面的打包与运行的过程和方法如出一辙。因此,不做详述,请参考前文。
三、总结
此文分享了如何编译打包我们的项目,如何创建一个Eureka Client 项目,如何配置一个 Eureka Client 项目以便能将 Eureka Client 注册到我们的 Eureka Server 注册中心。
问题:此处,有的同学可能会发现一个问题。我们的 Eureka Server 是我们的服务注册中心,用于注册服务,发现服务等功能。但当前我们的 Eureka Server 只有一个服务,这种情况下如果出现了某些问题,比如服务异常停止,服务器宕机... 都有可能导致我们注册中心出现问题而不能使用。此时我们只能干瞪眼???
针对这种情况,前面那些淌水探坑的人肯定已经发现这个问题了,而这个问题的解决方法就是为 Eureka Server 服务搭建一个高可用的服务集群,至于具体的实现方式,请听下回分解!!!