83人参与 • 2026-10-10 • Java
spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。
本篇介绍 spring cloud 入门系列中的 eureka,实现快速入门。
eureka 是 netflix 的子模块,它是一个基于 rest 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
服务注册和发现对于微服务架构而言,是非常重要的。有了服务发现和注册,只需要使用服务的标识符就可以访问到服务,而不需要修改服务调用的配置文件。该功能类似于 dubbo 的注册中心,比如 zookeeper。
eureka 采用了 cs 的设计架构。eureka server 作为服务注册功能的服务端,它是服务注册中心。而系统中其他微服务则使用 eureka 的客户端连接到 eureka server 并维持心跳连接。
其运行原理如下图:

由图可知,eureka 的运行原理和 dubbo 大同小异, eureka 包含两个组件: eureka server 和 eureka client。
eureka server 提供服务的注册服务。各个服务节点启动后会在 eureka server 中注册服务,eureka server 中的服务注册表会存储所有可用的服务节点信息。
eureka client 是一个 java 客户端,用于简化 eureka server 的交互,客户端同时也具备一个内置的、使用轮询负载算法的负载均衡器。在应用启动后,向 eureka server 发送心跳(默认周期 30 秒)。如果 eureka server 在多个心跳周期内没有接收到某个节点的心跳,eureka server 会从服务注册表中将该服务节点信息移除。
基于sprinboot基础项目进行搭建。
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>hoxton.sr8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-server</artifactid>
</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>注意:spring boot 与 springcloud 有版本兼容关系,如果引用版本不对应,项目启动会报错。
server:
port: 9000
spring:
application:
name: eureka-server
eureka:
instance:
hostname: wno704 # eureka 实例名称
instance-id: eureka-server
prefer-ip-address: off
client:
register-with-eureka: true # 是否向注册中心注册自己
fetch-registry: false # 是否检索服务
service-url:
defaultzone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 注册中心访问地址上面配置了服务的端口为8080,剩下几个为eureka配置:
下面我们总结一下在eureka中常用的配置选项及代表的含义:
| 配置 | 含义 | 默认值 |
|---|---|---|
| eureka.client.enabled | 是否启用eureka client | true |
| eureka.client.register-with-eureka | 表示是否将自己注册到eureka server | true |
| eureka.client.fetch-registry | 表示是否从eureka server获取注册的服务信息 | true |
| eureka.client.serviceurl.defaultzone | 配置eureka server地址,用于注册服务和获取服务 | http://localhost:8761/eureka |
| eureka.client.registry-fetch-interval-seconds | 默认值为30秒,即每30秒去eureka server上获取服务并缓存 | 30 |
| eureka.instance.lease-renewal-interval-in-seconds | 向eureka server发送心跳的间隔时间,单位为秒,用于服务续约 | 30 |
| eureka.instance.lease-expiration-duration-in-seconds | 定义服务失效时间,即eureka server检测到eureka client木有心跳后(客户端意外下线)多少秒将其剔除 | 90 |
| eureka.server.enable-self-preservation | 用于开启eureka server自我保护功能 | true |
| eureka.client.instance-info-replication-interval-seconds | 更新实例信息的变化到eureka服务端的间隔时间,单位为秒 | 30 |
| eureka.client.eureka-service-url-poll-interval-seconds | 轮询eureka服务端地址更改的间隔时间,单位为秒。 | 300 |
| eureka.instance.prefer-ip-address | 表示使用ip进行配置为不是域名 | false |
| eureka.client.healthcheck.enabled | 默认erueka server是通过心跳来检测eureka client的健康状况的,通过置为true改变eeureka server对客户端健康检测的方式,改用actuator的/health端点来检测。 | false |
eureka还有许多别的配置,具体可以参考eurekaclientconfigbean,eurekaserverconfigbean和eurekainstanceconfigbean配置类的源码。
在启动类上添加@enableeurekaserver注解,表明这是一个eureka服务端
@enableeurekaserver
@springbootapplication
public class eurekaserverapplication {
public static void main(string[] args) {
springapplication.run(eurekaserverapplication.class, args);
}
}
至此,准备工作完成,启动项目完成后,浏览器访问 http://localhost:9000 ,查看 eureka 服务监控界面,如下图:

通过该网址可以查看注册中心注册服务的相关信息。当前还没有服务注册,因此没有服务信息。
补充:http://localhost:9000 是 eureka 监管界面访问地址,而 http://localhost:9000/eureka/ eureka 注册服务的地址。
由于使用一台机器,使用两个名称还需要修改 c:\windows\system32\drivers\etc 下的 host 文件,添加如下配置:
127.0.0.1 localhost eureka01 eureka02
在上面eureka服务新建 application-eureka01.yml,application-eureka02.yml,具体配置内容如下:
application-eureka01.yml
server:
port: 9001
spring:
application:
name: eureka-server
eureka:
instance:
hostname: eureka01
instance-id: eureka-server1
prefer-ip-address: off
client:
register-with-eureka: true
fetch-registry: false
service-url:
defaultzone: http://eureka02:9002/eureka/
server:
enable-self-preservation: falseapplication-eureka02.yml
server:
port: 9002
spring:
application:
name: eureka-server
eureka:
instance:
hostname: eureka02
instance-id: eureka-server2
prefer-ip-address: off
client:
register-with-eureka: true
fetch-registry: false
service-url:
defaultzone: http://eureka01:9001/eureka/
server:
enable-self-preservation: false| 服务名字 | 实例名称 | 实例id | 端口 | 服务启动参数 |
|---|---|---|---|---|
| eurekaserverapplication-eureka01-9001 | eureka-server | eureka-server1 | 9001 | spring.profiles.active=eureka01 |
| eurekaserverapplication-eureka02-9002 | eureka-server | eureka-server2 | 9002 | spring.profiles.active=eureka02 |
如下图所示:


访问http://localhost:9001/,

http://localhost:9002/

基于springboot基础搭建
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>hoxton.sr8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
</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>server:
port: 8764
spring:
application:
name: user-server
eureka:
instance:
instance-id: user-server
prefer-ip-address: off
client:
register-with-eureka: true # 是否向注册中心注册自己
fetch-registry: true # 是否检索服务
service-url:
defaultzone: http://eureka01:9001/eureka/,http://eureka02:9002/eureka/如果eureka-server是单节点
defaultzone: http://127.0.0.1:8761/eureka/
eureka.client.register-with-eureka和eureka.client.fetch-registry上面已经解释了其意思,虽然这两个配置的默认值就是true,但这里还是显式配置下,使eureka客户端的功能更为直观(即向服务端注册服务并定时从服务端获取服务缓存到本地)。
在启动类上添加@enableeurekaclient注解,表明这是一个eureka客户端
@enableeurekaclient
@springbootapplication
public class userserverapplication {
public static void main(string[] args) {
springapplication.run(userserverapplication.class, args);
}
}
至此,准备工作完成,启动项目完成后,浏览器访问 eureka 监管界面,查看 eureka 服务监控界面,如下图:

可以从控制台中看到注册成功的消息
[ restartedmain] com.netflix.discovery.discoveryclient : registered applications size is zero : true [ restartedmain] com.netflix.discovery.discoveryclient : application version is -1: true [ restartedmain] com.netflix.discovery.discoveryclient : getting all instance registry info from the eureka server [ restartedmain] com.netflix.discovery.discoveryclient : the response status is 200 [ restartedmain] com.netflix.discovery.discoveryclient : starting heartbeat executor: renew interval is: 30 [ restartedmain] c.n.discovery.instanceinforeplicator : instanceinforeplicator ondemand update allowed rate per min is 4 [ restartedmain] com.netflix.discovery.discoveryclient : discovery client initialized at timestamp 1599443104937 with initial instances count: 2 [ restartedmain] o.s.c.n.e.s.eurekaserviceregistry : registering application user-server with eureka with status up [ restartedmain] com.netflix.discovery.discoveryclient : saw local status change event statuschangeevent [timestamp=1599443104940, current=up, previous=starting] [nforeplicator-0] com.netflix.discovery.discoveryclient : discoveryclient_user-server/user-server: registering service... [ restartedmain] o.s.b.w.embedded.tomcat.tomcatwebserver : tomcat started on port(s): 8764 (http) with context path '' [ restartedmain] .s.c.n.e.s.eurekaautoserviceregistration : updating port to 8764 [nforeplicator-0] com.netflix.discovery.discoveryclient : discoveryclient_user-server/user-server - registration status: 204 [ restartedmain] com.wno704.cloud.userserverapplication : started userserverapplication in 10.779 seconds (jvm running for 12.431)
第3,4行输出表示已经成功从eureka服务端获取到了服务;第5行表示发送心跳给eureka服务端,续约(renew)服务;第8到11行表示已经成功将服务注册到了eureka服务端。
了解 eureka 的环境搭建后,我们需要进行实战直观的感受 eureka 的真正作用,这样才能清楚掌握和学习 eureka 。
我们再创建三个 spring boot 项目,一个名为 user-server ,用于提供接口服务,另一个名为 user-web,用于调用 user-server 接口获取数据与浏览器交互。在创建一个 common-api ,用户保存客户端和服务端共有的一些类。
| 项目名称 | 服务实例 | 端口 | 描述 |
|---|---|---|---|
| eureka-server | eureka01/eureka02 | 9001/9002 | 注册中心(eureka 服务端集群) |
| common-api | 无 | 无 | 客户端和服务端共有的一些类 |
| user-server | user-server | 8764 | 服务提供者(eureka 客户端) |
| user-web | user-web | 8765 | 服务消费者,与浏览器端交互(eureka 客户端) |
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<dependency>
<groupid>org.projectlombok</groupid>
<artifactid>lombok</artifactid>
<optional>true</optional>
</dependency>@getter
@setter
@allargsconstructor
@noargsconstructor
public class user {
int id;
string name;
string passwd;
}
配置一个resttemplate bean,然后加上@loadbalanced注解来开启负载均衡
@configuration
public class restconfiguration {
@bean
@loadbalanced
public resttemplate getresttemplate() {
return new resttemplate();
}
}
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>hoxton.sr8</spring-cloud.version>
<common-api.version>0.0.1-snapshot</common-api.version>
</properties>
<dependencies>
<dependency>
<groupid>com.wno704</groupid>
<artifactid>common-api</artifactid>
<version>${common-api.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
</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>server:
port: 8764
spring:
application:
name: user-server
eureka:
instance:
instance-id: user-server
prefer-ip-address: off
client:
register-with-eureka: true # 是否向注册中心注册自己
fetch-registry: true # 是否检索服务
service-url:
defaultzone: http://eureka01:9001/eureka/,http://eureka02:9002/eureka/userservice.java
public interface userservice {
public user getbyid(integer id);
}
实现userservice
userserviceimpl.java
@service
public class userserviceimpl implements userservice {
private static map<integer,user> map;
static {
map = new hashmap<>();
for (int i=1; i<10; i++) {
map.put(i, new user(i,"test" +i , "pwd" + i));
}
}
@override
public user getbyid(integer id) {
return map.get(id);
}
}
usercontroller.java
@restcontroller
@requestmapping("/provider/user")
public class usercontroller {
@autowired
private userservice userservice;
@requestmapping("/get/{id}")
public user get(@pathvariable("id") integer id) {
return this.userservice.getbyid(id);
}
}
在启动类上添加@enableeurekaclient注解,表明这是一个eureka客户端
@enableeurekaclient
@springbootapplication
public class userserverapplication {
public static void main(string[] args) {
springapplication.run(userserverapplication.class, args);
}
}
同user-server。
server:
port: 8765
spring:
application:
name: user-web
eureka:
instance:
instance-id: user-web
prefer-ip-address: off
client:
register-with-eureka: false
fetch-registry: true
service-url:
defaultzone: http://eureka01:9001/eureka/,http://eureka02:9002/eureka/usercontroller.java
@restcontroller
@requestmapping("/user")
public class usercontroller {
@autowired
private resttemplate resttemplate;
@autowired
private discoveryclient client;
@requestmapping("get/{id}")
public user get(@pathvariable("id") integer id) throws exception {
list<serviceinstance> list = this.client.getinstances("user-server");
string uri = "";
for (serviceinstance instance : list) {
if (instance.geturi() != null && !"".equals(instance.geturi())) {
uri = instance.geturi().tostring();
break;
}
}
return resttemplate.getforobject(uri + "/provider/user/get/" + id, user.class);
}
}
在启动类上添加@enableeurekaclient注解,表明这是一个eureka客户端.
1.先启动eureka-server集群模式,参考上面集群服务4.4。
2.启动user-server。
3.启动user-web。
访问user-web:http://localhost:8765/user/get/5
结果如下:

至此,eureka 的服务注册和发现演示完毕。
本系列的后续文章会基于该案例进行介绍和实战演练。
出于安全的考虑,我们可能会对eureka服务端添加用户认证的功能。
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-security</artifactid>
</dependency>server:
port: 9000
spring:
application:
name: eureka-server
security:
user:
name: wno704
password: xxxxxx
eureka:
instance:
hostname: wno704 # eureka 实例名称
instance-id: eureka-server
prefer-ip-address: off
client:
register-with-eureka: true # 是否向注册中心注册自己
fetch-registry: false # 是否检索服务
service-url:
defaultzone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/ # 注册中心访问地址springboot 2.0 以上版本springcloud的丢弃了配置:
security:
basic:
enabled: true所以应该使用以下方式开启
@configuration
@enablewebsecurity
public class websecurityconfig extends websecurityconfigureradapter {
@override
protected void configure(httpsecurity http) throws exception {
http.sessionmanagement().sessioncreationpolicy(sessioncreationpolicy.never);
http.csrf().disable();
http.authorizerequests().anyrequest().authenticated().and().httpbasic();
}
}
注意:为了可以使用http://user:{password}@host:{port}/eureka/这种方式登录,所以必须是httpbasic,如果是form方式,不能使用url格式登录。
eureka服务端配置了密码之后,所有eureka.client.serviceurl.defaultzone的配置也必须配置上用户名和密码,格式为:
eureka.client.serviceurl.defaultzone=http://spring.security.user.name:{spring.security.user.password}@eureka.instance.hostname:{server.port}/eureka/如:
eureka:
instance:
instance-id: user-server
prefer-ip-address: off
client:
register-with-eureka: true # 是否向注册中心注册自己
fetch-registry: true # 是否检索服务
service-url:
defaultzone: http://wno704:19920503@127.0.0.1:9000/eureka/打开http://localhost:9000/页面将弹出验证窗口,输入用户名和密码后即可访问。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论