欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloudEureka服务发现的集成、配置和部署(1):Eureka服务端

程序员文章站 2022-06-12 19:19:09
...

准备工作

操作系统:Ubuntu 18.04

集成开发环境:MyEcclipse

中间件:Tomcat9

Java:jdk1.8

架构:SpringBoot 2.3.1 + SpringCloudEureka 2.2.3

传送门:

老树开新花:在MyEclipse环境中配置和使用SpringBoot——前言和准备

老树开新花:在MyEclipse环境中配置和使用SpringBoot——第一个SpringBoot工程

老树开新花:在MyEclipse环境中配置和使用SpringBoot——连接数据库

老树开新花:在MyEclipse环境中配置和使用SpringBoot——Log4j日志

依赖

SpringBoot对Eureka做好很好的集成。使用Eureka只需引入以下的依赖即可:

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

由于Eureka服务端自身也可以作为客户端来对自己进行注册和服务治理,因此Eureka server依赖会自动将Eureka client资源包一起引入到项目中。

Eureka服务端配置

完成对依赖的引入后,接下来就是对Eureka 服务端进行简单的配置了。

首先,由于Eureka被纳入了SpringCloud的范畴,因此,我们需要配置服务端的ip地址:

eureka.instance.hostname=127.0.0.1

然后我们可以借用SpringBoot配置项中的服务端口号配置:

server.port=6080

然后,我们就能指定Eureka服务的作用范围:

eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/freezingSpringBootEurekaServer/

本质上,上述这一配置项所涉及到的概念主要用于服务覆盖范围比较广的应用场景,例如互联网环境,或是跨地区的企业级应用。在这些场景中,我们必须要了解Eureka中“Region”和“Zone”两个概念。我们可以把“Region”简单理解为物理上的地区划分,本身“region”这个单词也有行政区划的含义;而“Zone”可以理解为在同一个地区下的不同服务区域。

但是在今天,这不是我们所要重点关注的问题,暂且跳过吧。接下来的一项配置也可以忽略,因为它不是强制必须的配置项。它指定了服务过期下线的时间,单位是毫秒:

eureka.server.evictionIntervalTimerInMs=60000

最后,因为Eureka服务允许自己把自己也作为一个客户端进行注册和托管,但这在应用的架构和管理上并非明智之举,因此可以选择禁用:

eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false

好了,到这里为止,Eureka服务端的整体配置看起来会像是这样:

#指定服务端口
server.port=6080

#Eureka服务端配置
eureka.instance.hostname=127.0.0.1

#此处是eureka服务端的配置,该配置仅为eureka服务端的上下文。若是客户端配置,还需要在上下文之后加上请求路径“/eureka”
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/freezingSpringBootEurekaServer/

#Eureka驱逐下线时间。单位为毫秒。默认为60秒。
eureka.server.evictionIntervalTimerInMs=60000

#禁止Eureka服务把自己也作为客户端注册和发现
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false

有一点必须要说明清楚,在上述的配置项当中,我们在“eureka.client.serviceUrl.defaultZone”的配置中,除了基本的ip地址和端口号以外,还额外配置了Eureka的web服务上下文。

影响服务的上下文的要素非常多,例如SpringBoot基本配置中是否对服务本身的上下文进行了指定,或是在单独发布到web中间件的时候是否包含了上下文路径,甚至是war包解压后在Tomcat中的目录名称等。因此,这一点非常重要。

下文中,我们会将Eureka服务程序单独打包为war,然后独立部署到Tomcat中,因此,上下文在此处至关重要。

另一个特别需要注意的是,无论Eureka服务在发布后,是否含有web上下文路径,在Eureka客户端(服务提供者和消费者模型)连接Eurakau服务端的时候,都需要指定一个固定的请求上下文“/eureka”。举例来说。

如下的一个Eureka服务的完整路径,包含有一个web上下文:

http://127.0.0.1:6080/aEurekaServer

那么,在Eureka客户端想要连接到该服务端时,必须还要加上一个固定的请求上下文“/eureka”:

http://127.0.0.1:6080/aEurekaServer/eureka

而如果Eureka服务端基于SpringBoot整体打包发布,并且SpringBoot又没有专门单独配置web上下文,那么Eureka服务端路径可能是这样的:

http://127.0.0.1:6080

而在这种情况下,Eureka客户端在连接服务时,使用的将是如下的地址:

http://127.0.0.1:6080/eureka

之所以要强调以上两点注意事项,是因为网络上有非常多的有关Eureka的教程文章或视频,因为立足在SpringBoot的基础之上,而SpringBoot的默认基础配置又是不带有web上下文的,因此该问题非常容易会被无意识地忽略掉。

发布

为了能够模拟生产环境,我们选择将Eureka服务端单独打包为war文件,然后在tomcat中进行独立部署。为了能够理清Eureka服务端和客户端的相互关系,我们先修改tomcat的端口配置,将端口修改为“6080”,这与application.properties文件中所标记的SpringBoot服务端口保持一致:

<Connector 
    port="6080" 
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="6043" />

在测试时,为了避免在统一台计算机上开启多个Tomcat时,其它的端口会被占用,因此,其实需要将Tomcat所有的端口配置全部做好调整。在此就不做赘述了。

启动Tommcat:

SpringCloudEureka服务发现的集成、配置和部署(1):Eureka服务端

启动成功之后,我们可以打开浏览器,在地址栏中输入以下的地址:

http://localhost:6080/freezingSpringBootEurekaServer/

这样就能看到Eureka自带的面板:

SpringCloudEureka服务发现的集成、配置和部署(1):Eureka服务端

由于目前只配置并且发布了Eureka服务端,因此我们在面板中的“Instance currently registered with Eureka”一项中看不到任何已经注册了的实例。

在回过头来查看一下各项配置,在生产环境中,我们必须要确认服务的ip地址、端口和web上下文各项保持一致。

在application.properties中,上下文指定为“freezingSpringBootEurekaServer”,端口指定为“6080”:

SpringCloudEureka服务发现的集成、配置和部署(1):Eureka服务端

在Tomcat中,端口号也经过了调整:

SpringCloudEureka服务发现的集成、配置和部署(1):Eureka服务端

另外,因为配置单独为Tomcat配置端口和上下文映射,因此Eureka服务在单独打包和发布到Tomcat下是,其文件夹的名称也需要与配置中的上下文保持一致:

SpringCloudEureka服务发现的集成、配置和部署(1):Eureka服务端

好了,至此Eureka服务已经做好了准备,可以投入开发和使用了。