zoukankan      html  css  js  c++  java
  • 服务注册组件——Eureka高可用集群搭建

    什么是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/Noneplus/JavaDev-Note/tree/master/SpringCloud代码

  • 相关阅读:
    aspnet_Membership_SetPassword
    FlipView使用
    结构之法字符串及链表的探索编程之美第3章
    window和linux下svn的使用
    【算法导论第13章】红黑树
    【算法导论】第16章贪心算法
    【算法导论】第15章动态规划
    ubuntu11.04下myeclipse开发环境的搭建(jdk6+tomcat6+myeclipse8.0+mysql)
    【matlab】在vc6.0中调用matlab中的正态分布产生随机数
    gnome/gtk+开发环境搭建
  • 原文地址:https://www.cnblogs.com/noneplus/p/11374883.html
Copyright © 2011-2022 走看看