当前位置: 代码网 > it编程>编程语言>Java > Spring Cloud Eureka服务治理指南

Spring Cloud Eureka服务治理指南

2026年10月10日 • Java •我要评论
一、前言spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监

一、前言

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 会从服务注册表中将该服务节点信息移除。

三、eureka服务端搭建

基于sprinboot基础项目进行搭建。

3.1 引入依赖

    <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 有版本兼容关系,如果引用版本不对应,项目启动会报错。

3.2 修改application.yml

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.instance.hostname指定了eureka服务端的ip;
  • eureka.client.register-with-eureka表示是否将服务注册到eureka服务端,由于自身就是eureka服务端,所以设置为false;
  • eureka.client.fetch-registry表示是否从eureka服务端获取服务信息,因为这里只搭建了一个eureka服务端,并不需要从别的eureka服务端同步服务信息,所以这里设置为false;
  • eureka.client.serviceurl.defaultzone指定eureka服务端的地址,默认值为http://localhost:8761/eureka。

3.3 eureka配置

下面我们总结一下在eureka中常用的配置选项及代表的含义:

配置含义默认值
eureka.client.enabled是否启用eureka clienttrue
eureka.client.register-with-eureka表示是否将自己注册到eureka servertrue
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配置类的源码。

3.4 修改启动类

在启动类上添加@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 注册服务的地址。

四、eureka服务集群搭建

4.1 基础系统配置

由于使用一台机器,使用两个名称还需要修改 c:\windows\system32\drivers\etc 下的 host 文件,添加如下配置:

127.0.0.1 localhost eureka01 eureka02

4.2 application-xxx.yml

在上面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: false

application-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

4.3 新增启动参数

服务名字实例名称实例id端口服务启动参数
eurekaserverapplication-eureka01-9001eureka-servereureka-server19001spring.profiles.active=eureka01
eurekaserverapplication-eureka02-9002eureka-servereureka-server29002spring.profiles.active=eureka02

如下图所示:


4.4 启动两个服务

访问http://localhost:9001/,

http://localhost:9002/

五、客户端搭建

基于springboot基础搭建

5.1 依赖引入

    <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>

5.2 修改application.yml

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客户端的功能更为直观(即向服务端注册服务并定时从服务端获取服务缓存到本地)。

5.3 修改启动类

在启动类上添加@enableeurekaclient注解,表明这是一个eureka客户端

@enableeurekaclient
@springbootapplication
public class userserverapplication {
    public static void main(string[] args) {
        springapplication.run(userserverapplication.class, args);
    }
}

至此,准备工作完成,启动项目完成后,浏览器访问 eureka 监管界面,查看 eureka 服务监控界面,如下图:

5.4 日志分析

可以从控制台中看到注册成功的消息

[  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 。

6.1 项目概况

我们再创建三个 spring boot 项目,一个名为 user-server ,用于提供接口服务,另一个名为 user-web,用于调用 user-server 接口获取数据与浏览器交互。在创建一个 common-api ,用户保存客户端和服务端共有的一些类。

项目名称服务实例端口描述
eureka-servereureka01/eureka029001/9002注册中心(eureka 服务端集群)
common-api无无客户端和服务端共有的一些类
user-serveruser-server8764服务提供者(eureka 客户端)
user-webuser-web8765服务消费者,与浏览器端交互(eureka 客户端)

6.2 common-api 共享代码

6.2.1 引入依赖

        <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>

6.2.2 创建user实体

@getter
@setter
@allargsconstructor
@noargsconstructor
public class user {
    int id;
    string name;
    string passwd;
}

6.2.2 配置resttemplate

配置一个resttemplate bean,然后加上@loadbalanced注解来开启负载均衡

@configuration
public class restconfiguration {
    @bean
    @loadbalanced
    public resttemplate getresttemplate() {
        return new resttemplate();
    }
}

6.3 user-server 服务提供者

6.3.2 引入依赖

    <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>

6.3.2 application.yml

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/

6.3.3 创建service

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);
    }

}

6.3.3 创建controller

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);
    }

}

6.3.4 修改启动类

在启动类上添加@enableeurekaclient注解,表明这是一个eureka客户端

@enableeurekaclient
@springbootapplication
public class userserverapplication {
    public static void main(string[] args) {
        springapplication.run(userserverapplication.class, args);
    }
}

6.4 user-web 服务消费者

6.4.1 依赖引入

同user-server。

6.4.2 配置application.yml

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/

6.4.2 创建controller

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);
    }
}

6.4.2 修改启动类

在启动类上添加@enableeurekaclient注解,表明这是一个eureka客户端.

6.4 测试

6.4.1 启动项目

1.先启动eureka-server集群模式,参考上面集群服务4.4。

2.启动user-server。

3.启动user-web。

6.4.2 测试

访问user-web:http://localhost:8765/user/get/5

结果如下:

至此,eureka 的服务注册和发现演示完毕。

本系列的后续文章会基于该案例进行介绍和实战演练。

七、eureka-server添加认证

出于安全的考虑,我们可能会对eureka服务端添加用户认证的功能。

7.1 引入依赖

        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-security</artifactid>
        </dependency>

7.2 修改application.yml

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/  # 注册中心访问地址

7.3 增加安全认证类

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格式登录。

7.4 客户端改造

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/

7.5 测试

打开http://localhost:9000/页面将弹出验证窗口,输入用户名和密码后即可访问。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

赞 (0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com