原文链接
前言
在前文使用Consul作为微服务的注册中心,我们较为详细地介绍了使用consul
的相关内容和参数。其中提及到没有使用Eureka
的原因是新版Eureka
不再官方开源维护,已经进入闭源状态。但是1.x
的版本还是有社区在相对积极维护的,虽然大概率不会再有大的更新,但是基于现有架构而言,作为中小型项目的注册中心还是绰绰有余的,而且个人的观点,在所有注册中心中,Eureka
基本上是用的最舒服的,可以认为是一个opinionated
的框架
服务端
我们这里仍然是中间件的常用逻辑,先去dockerhub
看有没有官方的服务端镜像,没有的话我们自己构建,上传到dockerhub
,之后就用自己的。这里Eureka
没有官方的镜像,所以我们需要手动构建下
参考spring cloud netflix server document,我们这里创建一个Eureka
项目,依然基于JDK17
、Spring3
、Cloud4
的大版本,引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>4.1.1</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
然后添加注解@EnableEurekaServer
到main
:
@SpringBootApplication
@EnableEurekaServer
class EurekaApplication
fun main(args: Array<String>) {
runApplication<EurekaApplication>(*args)
}
最后做一下简单配置:
server:
port: 5525
spring:
application:
name: eureka
eureka:
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:${server.port}/eureka
server:
waitTimeInMsWhenSyncEmpty: 0
management:
endpoints:
web:
exposure:
include: "*"
这样最基本的一个注册中心的服务就构建完成了,小伙伴们启动后就可以直接在http://localhost:5525
观察到服务的用户界面了,然后我们需要将服务放到容器中,简单写个Dockerfile
,将包放入容器内构建
FROM astercass/jdk17-simple:latest
LABEL author="astercass@qq.com"
WORKDIR /usr/src/apps
ADD eureka.jar /usr/src/apps
RUN mkdir log && mkdir config
ENTRYPOINT ["java","-jar","/usr/src/apps/eureka.jar","--logging.file.path=/usr/src/apps/log", "--spring.config.location=classpath:/,/usr/src/apps/config/" ,"--spring.profiles.active=prod"]
然后将其构建后传入dockerhub
,最后使用docker-compose.yml
重新拉下来
version: "3.9"
services:
eureka:
image: 'astercass/eureka-server:1.0.0'
hostname: 'eureka'
container_name: 'eureka'
restart: always
ports:
- "15525:5525"
volumes:
- /root/docker/eureka/log:/usr/src/apps/log
- /root/docker/eureka/config:/usr/src/apps/config
最后在/usr/src/apps/config/
配置生产环境的配置启动即可完成服务端的容器构建,相关的配置参数参考源码EurekaInstanceConfigBean.java、EurekaInstanceConfigBean.java以及EurekaServerConfigBean.java相关介绍
客户端
引包:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>${version}</version>
</dependency>
对于客户端来说,配置也非常简单,最简化的配置只需要配置服务端地址即可:
eureka:
client:
serviceUrl:
defaultZone: http://212.129.245.243:55525/eureka
可以通过eureka.client.enable
方便地启用/禁用eureka
以用于单元测试,默认使用spring.application.name
以及server.port
注册到eureka
,可以通过源码EurekaInstanceConfigBean.java、EurekaInstanceConfigBean.java获取更多参数解释,比如使用eureka.instance.appname
覆盖spring.application.name
值、使用eureka.instance.instanceId
自定义注册id
等
至此一个简单易用的注册中心就构建完成了,当然这里没有包括安全性校核以及高可用以及群组划分相关处理,这方面小伙伴们可以根据业务需求,自行修改客户端、服务端配置文件即可
注册项目调用
这里其实就和其他注册中心的后续处理一样了,这里简单提一嘴。注册服务到注册中心,注册中心存储对应关系,客户端定时通过appname
从注册中心获取对应关系,缓存到本地然后使用该appname
注册的地址进行调用。当注册多个相同服务的时,启用负载均衡。当某个服务挂掉之后,将该实例踢出服务组等等
在代码层面上,可以使用openfeign
或者gateway
实现,如果是openfeign
一般在类名注解上配置appname
,如果是网关那么一般在配置文件中配置即可
关于注册和挂掉之后的删除较为缓慢的问题,可以参考Documentation: changing Eureka renewal frequency WILL break the self-preservation feature of the server通过evictionIntervalTimerInMs
、leaseRenewalIntervalInSeconds
等参数,减少服务端注册服务DOWN
后删除间隔时间,客户端拉取最新注册间隔时间等方式提高项目可用性