服务注册组件——Eureka高可用集群搭建

  • 2019 年 10 月 3 日
  • 筆記

什么是Eureka?

服务注册组件:将微服务注册到Eureka中。

为什么需要服务注册?

微服务开发重点在一个"微"字,大型应用拆分成微型服务,意味着服务的数量不可能少。

服务之间存在调用关系,假设没有服务注册,微服务之间的调用关系就会是这个样子:

1566142251076

微服务的部署可能不会在同一台服务器上,而是需要通过远程调用,然后就涉及到IP地址了。理论上来说,直接通过IP地址直接通信也没有什么问题。 但是如果服务出问题,需要换一台服务器部署,ip地址就需要更改了。同时如果该服务被多个其他服务依赖,那么每一个IP地址都需要重置。

服务注册可以形象的理解为一张表,表的左边写着服务名称,而右侧对应的是IP地址。服务的调用使用名称来替代IP地址,那么当IP地址发生改变,直接修改服务注册中心的名称与IP的映射关系。其他服务由于是用名称来远程调用,所以并不需要更改。

1566142633779

Eureka与Zookeeper的区别

Eureka满足Ap原则,而Zookeeper满足CP原则。

(CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者最多同时满足俩)

Eureka三个角色

Eureka Server 提供服务注册和发现

Service Provider服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到

Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务

消费方与提供方:调用另一个服务称为消费。被另一个服务调用称为提供。

所以,同一个服务可能既是消费方也是提供方。

【注】:Eureka隐藏IP地址的功能体现在整个微服务的内部。

搭建Eureka集群

创建工程

  • 创建文件夹Eureka Cluster,用IDEA打开:

1566144926784

  • 创建msc-eureka-6001,msc-eureka-6002,msc-eureka-6003工程【jdk1.8】,

1566145227822

1566145305544

1566145472114

导入pom依赖

 <parent>          <groupId>org.springframework.boot</groupId>          <artifactId>spring-boot-starter-parent</artifactId>          <version>2.1.7.RELEASE</version>          <relativePath/> <!-- lookup parent from repository -->      </parent>        <properties>          <java.version>1.8</java.version>          <spring-cloud.version>Greenwich.SR2</spring-cloud.version>      </properties>        <dependencies>          <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-test</artifactId>              <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>        <build>          <plugins>              <plugin>                  <groupId>org.springframework.boot</groupId>                  <artifactId>spring-boot-maven-plugin</artifactId>              </plugin>          </plugins>      </build>

配置application.yaml

  • 配置地址映射

C:WindowsSystem32driversetc

1566147466705

1566147557267

msc-eureka-6001,

server:    port: 6001    eureka:    instance:      hostname: eureka6001.com  #eureka服务端的实例名称    client:      register-with-eureka: false   #false表示不向注册中心注册自己。      fetch-registry: false      #false表示自己是注册中心,职责是维护服务,而不是调用服务      service-url:        defaultZone: http://eureka6003.com:6003/eureka/,http://eureka6002.com:6002/eureka/ # 注册到eureka6003和eureka6002里

msc-eureka-6002,

server:    port: 6002    eureka:    instance:      hostname: eureka6002.com  #eureka服务端的实例名称    client:      register-with-eureka: false   #false表示不向注册中心注册自己。      fetch-registry: false      #false表示自己是注册中心,职责是维护服务,而不是调用服务      service-url:        defaultZone: http://eureka6001.com:6001/eureka/,http://eureka6003.com:6003/eureka/

msc-eureka-6003

server:    port: 6003    eureka:    instance:      hostname: eureka6003.com  #eureka服务端的实例名称    client:      register-with-eureka: false   #false表示不向注册中心注册自己。      fetch-registry: false      #false表示自己是注册中心,职责是维护服务,而不是调用服务      service-url:        defaultZone: http://eureka6001.com:6001/eureka/,http://eureka6002.com:6002/eureka/

创建主启动类并添加注解@EnableEurekaServer

package zkrun.top;      import org.springframework.boot.SpringApplication;  import org.springframework.boot.autoconfigure.SpringBootApplication;  import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;    @EnableEurekaServer // EurekaServer服务器端启动类,接受其它微服务注册进来  @SpringBootApplication  public class App_msc_eureka_6001  {      public static void main(String[] args)      {          SpringApplication.run(App_msc_eureka_6001.class, args);      }  }

启动Eureka集群

1566148589864

访问任意一个端口,都会显示另外两个Eureka服务

1566148651864

创建注册服务测试Eureka集群的高可用性

  • 新建工程msc-provider-5001

  • 导入pom依赖

     <parent>          <groupId>org.springframework.boot</groupId>          <artifactId>spring-boot-starter-parent</artifactId>          <version>2.1.7.RELEASE</version>          <relativePath/> <!-- lookup parent from repository -->      </parent>        <properties>          <java.version>1.8</java.version>          <spring-cloud.version>Greenwich.SR2</spring-cloud.version>      </properties>        <dependencies>          <dependency>              <groupId>org.springframework.cloud</groupId>              <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>          </dependency>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-test</artifactId>              <scope>test</scope>          </dependency>            <dependency>              <groupId>org.springframework.cloud</groupId>              <artifactId>spring-cloud-starter-config</artifactId>          </dependency>  <!--        Eureka客户端启动需要依赖web模块-->          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-web</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>        <build>          <plugins>              <plugin>                  <groupId>org.springframework.boot</groupId>                  <artifactId>spring-boot-maven-plugin</artifactId>              </plugin>          </plugins>      </build>

  • 配置application.yaml
server:    port: 5001  spring:    application:      name: msc-provider  #应用名称  eureka:    client:      service-url:        defaultZone: http://eureka6001.com:6001/eureka/,http://eureka6002.com:6002/eureka/,http://eureka6003.com:6003/eureka/    instance:      instance-id: msc-provider-5001      prefer-ip-address: true     #访问路径可以显示IP地址

  • 创建主启动类添加注解@EnableEurekaClient
package zkrun.top;      import org.springframework.boot.SpringApplication;  import org.springframework.boot.autoconfigure.SpringBootApplication;  import org.springframework.cloud.netflix.eureka.EnableEurekaClient;    @SpringBootApplication  @EnableEurekaClient  public class App_msc_provider_5001  {      public static void main(String[] args)      {          SpringApplication.run(App_msc_provider_5001.class, args);      }  }  

1566150379362

  • 测试Eureka集群高可用

手动停掉eureka6001,

1566150405399

eureka6001无法访问:

1566150455835

6002和6003仍然提供注册服务:

1566150489889

1566150527456


小结:

  • 三个Eureka和注册服务都没有继承父工程,其pom依赖都是独立的。其中注册服务依赖spring-boot-starter-web。今后在设计父工程的pom时,应该考虑到每个子工程的依赖。
  • 与Eureka同级别的服务注册组件还有Zookeeper,Consul等。根据具体的应用场景和组件的优势来决定技术选取是软件开发更应该注意的。(除了Eureka之外,同级别的其他组件也需要了解)

代码参考:https://github.com/HCJ-shadow/Eureka-Cluster