Spring Cloud之Eureka服务器

Eureka是什么

Eureka是Netflix开发的一个基于 REST 的服务开源服务注册与发现组件,而Spring Cloud又对Eureka进行了封装,简化开发。

关于Eureka2.0不再开源,官方Wiki描述是:

The existing open source work on eureka 2.0 is discontinued. The code base and artifacts that were released as part of the existing repository of work on the 2.x branch is considered use at your own risk.

Eureka 1.x is a core part of Netflix’s service discovery system and is still an active project.

其实,我们也无需担心Eureka2.0是否会不再开源,首先Eureka1.x功能已经比较完善,另外服务注册与发现组件,还是有很多替代产品的,比如Zookeeper和Consul。即使真走到了那一步,Spring Cloud官方也会提供解决方案的。

为什么要使用Eureka

顾名思义,服务注册与发现,就是每个微服务接口将自己的相关信息注册到Eureka服务器上,其他接口如果想调用某个服务,直接去Eureka上面获取对应的服务信息,然后进行远程调用。

在微服务大行其道的今天,一个项目甚至被拆成了几十、几百甚至上千个微服务;而一个功能,也可能调用了十几、几十个微服务接口,立即体现出注册中心的优势。Eureak的架构图:Eureak架构图

第一个Eureka例子

在父模块spring-cloud中,我们引入Spring Boot和Spring Cloud相关依赖:

<properties>
    <java.version>1.8</java.version>
    <tomcat.version>8.5.13</tomcat.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.cloud.version>Dalston.SR5</spring.cloud.version>
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <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>

在子模块spring-cloud-eureka中引入Eureak Server的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
</dependencies>

在application.yml中添加Eureka相关配置:

spring:
  application:
    name: spring-cloud-eureka

server:
  port: 8081

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false #是否注册自己
    fetch-registry: false #是否获取eureka上的注册信息
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ 
      #eureka服务注册与获取的地址,多个用逗号隔开

项目的启动:

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

项目启动成功后,访问http://localhost:8081/即可看到Eureka提供的界面。但是现在还没有任何服务注册到这个Eureka服务器上。

如果你的项目启动报错了,那么可能是Spring Boot和Spring Cloud之间版本不匹配。

这里列出了两者之间的版本匹配:版本匹配

Eureka集群

既然所有的服务都注册到Eureka Server上面,那肯定不能因为Eureka Server不可用,导致整个系统不可用。所以,Eureka Server必须要做高可用。

Eureka集群,就是Eureka Server之间互相同步注册上来的服务信息,保证集群中只要有一台Eureka Server可用,那么整个系统就不会崩溃。

首先我们把application.yml中部分配置注释掉,这些配置需要在不同profile中单独的配置:

spring:
  application:
    name: spring-cloud-eureka
eureka:
  client:
    register-with-eureka: true #是否注册自己
    fetch-registry: true #是否获取eureka上的注册信息

注意这里的register-with-eurekafetch-registry设为true了。如果设是false,在Eureka的Instances currently registered with Eureka里面是不可见的,并且会一直存在于unavailable-replicas中。

application-peer1.yml的配置:

server:
  port: 8081

eureka:
  environment: peer1
  instance:
    hostname: peer1
  client:
    service-url:
      defaultZone: http://peer2:8082/eureka/,http://peer3:8083/eureka/

application-peer2.yml的配置:

server:
  port: 8082

eureka:
  environment: peer2
  instance:
    hostname: peer2
  client:
    service-url:
      defaultZone: http://peer1:8081/eureka/,http://peer3:8083/eureka/

application-peer3.yml的配置:

server:
  port: 8082

eureka:
  environment: peer2
  instance:
    hostname: peer2
  client:
    service-url:
      defaultZone: http://peer1:8081/eureka/,http://peer3:8083/eureka/

另外,如果是windows环境,需要修改C:\Windows\System32\drivers\etc\hosts文件(linux环境修改/etc/hosts),增加peer1、peer2、peer3与127.0.0.1的映射。

127.0.0.1 peer1
127.0.0.1 peer2
127.0.0.1 peer3

Eureka集群之间默认通过hostname去访问的,如果你配置eureka.instance.hostname=localhost或者是eureka.instance.hostname=${spring.cloud.client.ipAddress},其他Eureka Server会一直存在于unavailable-replicas列表里面,最终导致Eureka触发自我保护机制。

分别启动三台Eureka Server:

java -jar spring-cloud-eureka.jar --spring.profiles.active=peer1
java -jar spring-cloud-eureka.jar --spring.profiles.active=peer2
java -jar spring-cloud-eureka.jar --spring.profiles.active=peer3

最终效果如图:eureka集群

图中SPRING-CLOUD-EUREKA里面的地址都很长,注册名默认是“IP名:应用名:端口名”,即:

${spring.cloud.client.ipAddress}:${spring.application.name}:${spring.application.instance_id:${server.port}}

如果想修改实例名,比如applicaiont-peer1.yml中,只需要增加一行配置:

eureka:
    instance-id: peer1

修改后的结果如图:eureka集群

赞(0) 打赏
未经允许不得转载:当归笔记 » Spring Cloud之Eureka服务器
分享到:

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用,就打赏一下作者吧~

支付宝扫一扫打赏

微信扫一扫打赏