0%

微服务实战——SpringCloud下的服务发现与注册组件Eureka集成

聊聊服务发现注册

服务多,迭代快是微服务的明显特征。那么在快速小版本迭代业务时,如果按照传统的方式发布更新服务,手动的修改一些服务与服务之间的调用关系是非常麻烦且累人的。一个典型的场景可能是,一个微服务升级迭代之后,硬件环境发生改变(IP等的变化)。传统的做法是修改与其有调用关系的微服务调用地址然后一个个重启。这显然是非常麻烦又容易出错的。而服务发现与注册就是帮你把上述一系列的工作给封装好实现自动发现注册的服务去更新。集体为所有的微服务启动时都去注册中心登记,不管是调用者还是服务提供者,都通过注册中心完成服务的发现。这样就大大提升了我们实际工作中的效率问题。

当前流行的服务发现与注册组件

当前世面的服务注册发现框架很多,比较常见的有Zookeeper、SpringCloudEureka、Consul、Etcd等。这里只做简单介绍。具体还以实际场景做出选择。

  • Zookeeper
    相信大家对它绝对不会陌生了,非常老牌子的分布式协调服务框架。由Google开源并且是Hadoop和Hbase的重要组件,提供了数据-发布订阅、负载均衡、分布式同步等功能。其内部为命名空间拥有一个树状的内存模型,其中各节点被称为znode。每个znode包含一个路径和与之相关的元数据。
  • Consul
    由HashiCorp基于Go语言开发的支持多数据中心分布式高可用的服务发布和注册服务框架,采用Raft算法保证服务的一致性。详细可查看其官网(这里也有Consul与其他类似产品的对比哦)
  • Etcd
    由CoreOS团队发起并开源的项目,Go语言实现,本质上是高可用的分部署K-V数据库。常用做解决服务发现问题。Kubernetes就是使用它作为其数据后端的。
  • Eureka
    由Netflix开源,并被Pivatal集成到SpringCloud中,可以和SpringCloud无缝对接。基于RestfulAPI开发的服务注册与发现组件。但是目前Eureka仅开源到1.x版本,后续版本已经不再开源。

上述组件的比较

Zookeeper Eureka Consul Etcd 功能
keepalive 客户主动报心跳 服务状态,内存,磁盘等 连接心跳 健康检查
N Y Y N 多数据中心
Y Y Y Y SpringCloud集成
ACL NA ACL/https Https 安全
客户端 Java/Http Http/dns Http/grpc 客户端接口
CP AP CA CP CAP
Paxos 定制P2P Raft Raft 一致性协议
Y N Y Y KV存储

项目搭建

  • 先附上GitHub地址

  • 具体步骤

    • 使用IDEA创建Maven项目,输入groupID等信息,名称为spring-cloud-demo,选择pom类型
      create1

    • 主pom文件配置如下

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
          <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.5.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
      </parent>

      <groupId>cn.kxtop.blog</groupId>
      <artifactId>spring-cloud-demo</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>spring-cloud-demo</name>
      <description>Demo project for Spring Boot</description>

      <properties>
      <java.version>1.8</java.version>
      <spring-cloud.version>Finchley.SR1</spring-cloud.version>
      </properties>

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

      <dependencies>
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      </dependency>

      <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
      </dependency>

      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
      <exclusion>
      <groupId>org.junit.vintage</groupId>
      <artifactId>junit-vintage-engine</artifactId>
      </exclusion>
      </exclusions>
      </dependency>

      </dependencies>

      <build>
      <plugins>
      <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      </plugins>
      </build>
      </project>
    • 接下来创建model,packing选择jar,parent选择刚刚创建好的Spring-cloud-demo主项目。model名为eureka

    • eureka pom文件。这里主要引入了Eureka的服务提供者(Eureka Server)依赖

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      <parent>
      <artifactId>spring-cloud-demo</artifactId>
      <groupId>cn.kxtop.blog</groupId>
      <version>0.0.1-SNAPSHOT</version>
      </parent>
      <modelVersion>4.0.0</modelVersion>

      <artifactId>eureka</artifactId>

      <dependencies>
      <!-- eureka server -->
      <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </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>
      </dependencies>

      <build>
      <plugins>
      <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      </plugins>
      </build>
    • 在resources目录下创建application.properties配置文件

      1
      2
      3
      4
      5
      6
      7
      8
      # Eureka支持集群间互相注册,这里为了方便只搭建一台,生产环境中请搭建集群并修改	eureka.client.registerWithEureka = false eureka.client.fetchRegistry = false配置
      spring.application.name = eureka-registry
      logging.level.org.spring.framework.security=INFO
      eureka.instance.prefer-ip-address = true
      eureka.client.registerWithEureka = false
      eureka.client.fetchRegistry = false
      eureka.server.waitTimeInMsWhenSyncEmpty = 0
      server.port = 8761
    • 创建启动类,包名为package cn.kxtop.blog.registry

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

      @EnableEurekaServer
      @SpringBootApplication
      public class EurekaApplication {

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

      }
    • 配置完成,启动main方法。至此SpringCloud集成Eureka就完成了。最后可访问 localhost:8761查看。
      file

最后

下一篇,测试创建业务项目并测试Eureka服务注册与发现。

伸出你发财的小手~