zoukankan      html  css  js  c++  java
  • SpringCloud-服务的注册与发现(Eureka)

    SpringCloud 简介

    SpringCloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。SpringCloud是基于SpringBoot的。
    服务注册发现Eureka
    Eureka,是Netfix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行AWS域中的中间服务层,以达到负载均衡和中间层服务故障转移的目的。Spring Cloud将它集成在其他子项目spring-cloud-netflix中,以实现spring cloud服务发现功能

    Eureka原理

    AWS中的几个概念
    Region:AWS云服务在全球不同的地方都有数据中心,比如北美、南美和欧洲亚洲等。与此对应,根据地理位置我们把某个地区的基础设施服务集合称为一个区域。不同区域之间是相互独立的。说白了就类似于不同地方的机房。
    Available Zone:基于容灾背景提出,简单而言,就是相同region区域不同的机房

    服务注册到Eureka
    每30s发送心跳监测重新进行租约,如果客户端不能多次更新租约,它将在90s内从服务器注册中心移除。
    注册信息和更新会被复制到其他Eureka节点,来自任何区域的客户端可以查找到注册中心信息,每30s发生一次复制来定位他们的服务,并进行远程调用
    客户端还可以缓存一些服务实例信息,所以即使Eureka全挂掉,客户端也是可以定位到服务地址的

    项目搭建

    先创建一个maven主工程

     

    下一步

    填写GroupId、ArtifactId,下一步

    选择maven路径,选择settings, maven配置文件,下一步

    填写项目名称、项目所在路径,Finish
    配置一下私服,pom中加入

    <repositories>
      <repository>
        <id>nexus</id>
        <name>nexus</name>
        <url>http://localhost:8081/repository/maven-public/</url>
        <releases>
          <enabled>true</enabled>
        </releases>
        <snapshots>
          <enabled>true</enabled>
        </snapshots>
      </repository>
    </repositories>
    
    <pluginRepositories>
      <pluginRepository>
        <id>nexus</id>
        <name>nexus</name>
        <url>http://localhost:8081/repository/maven-public/</url>
        <releases>
          <enabled>true</enabled>
        </releases>
        <snapshots>
          <enabled>true</enabled>
        </snapshots>
      </pluginRepository>
    </pluginRepositories>

    然后创建两个model工程:一个model工程作为服务注册中心,即Eureka Server,另一个作为Eureka Client

    先来创建注册中心

    下一步

    下一步

    选择1.5.13版本的SpringBoot,下一步

    注册中心创建完成,pom文件如下

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.SpringCloud.eureka</groupId>
      <artifactId>eureka-registry</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
      <name>eureka-registry</name>
      <description>Demo project for Spring Boot</description>
      <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>1.5.13.RELEASE</version>
         <relativePath/> <!-- lookup parent from repository -->
      </parent>
      <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <java.version>1.8</java.version>
         <spring-cloud.version>Edgware.SR3</spring-cloud.version>
      </properties>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
         </dependency>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-security</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></project>

    在启动类上加入eureka注解如下,表明此应用是eureka的注册中心

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

    启动一个服务注册中心,只需要一个注解@EnableEurekaServer,这个注解需要在springboot工程的启动application类加上
    Eureka是一个高可用组件,他没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下eureka server也是一个eureka client,必须要指定一个server。Eureka server的配置文件application.yml如下

    #可以加入安全校验,设置对应的用户名密码即可,pom中需要引入相应的包
    security:
      basic:
        enabled: true
      user:
        name: admin
        password: 123456
    
    server:
      port: 8761
    eureka:
      instance:
        hostname: localhost
      client:
        register-with-eureka: false
        fetch-registry: false
      service-url:
        defaultZone: http://localhost:8761/eureka
        #defaultZone: http://user:password@localhost:8761/eureka

    通过eureka.client.registerWithEureka: false 和fetchRegistry: false来表明自己是一个eureka server
    在父级项目pom中引入module,如下

    <modules>
 
        <module>eureka-registry</module>

    </modules>

    启动后界面如下

    创建Eureka Client

    完成,pom如下

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
    
       <groupId>com.SpringCloud.eureka</groupId>
       <artifactId>eureka-client</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <packaging>jar</packaging>
    
       <name>eureka-client</name>
       <description>eureka-client-description</description>
    
       <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>1.5.13.RELEASE</version>
          <relativePath/> <!-- lookup parent from repository -->
       </parent>
    
       <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
          <java.version>1.8</java.version>
          <spring-cloud.version>Edgware.SR3</spring-cloud.version>
       </properties>
    
       <dependencies>
          <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-eureka</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>
    
    
    </project>
    

    在项目启动类上加注解,如下

    @RestController
    @EnableEurekaClient
    @SpringBootApplication
    public class EurekaClientApplication {
    
       public static void main(String[] args) {
          SpringApplication.run(EurekaClientApplication.class, args);
       }
    
       @Value("${server.port}")
       String port;
    
       @GetMapping("/hello")
       public String helloEureka(String name){
          return "hello,eureka:" + name + ", i am from port:" + port;
       }
    }

    加上@EnableEurekaClient表明自己是eureka client

    application.yml如下

    spring:
      application:
        name: eureka-client
    server:
      port: 8762
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/

    设置应用名称,服务端口,注册中心地址,spring.application.name这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name。
    在父级项目用引入module,如下

    <modules>
  
        <module>eureka-registry</module>
 
        <module>eureka-client</module>
    
</modules>

    启动client项目,发现已经注册到注册中心,端口为8762如下图

    此时在浏览器请求

    http://localhost:8762/hello

    补充:

    eureka.client.allow-redirects:是否允许重定向Eureka客户端请求到其他或者备份服务器,默认为fasle
    eureka.client.eureka-connection-idle-timeout-seconds:HTTP连接到eureka服务器可以在关闭之前保持空闲的时间(几秒钟)。
    eureka.client.eureka-server-connect-timeout-seconds:表示连接Eureka服务器,等待多长时间算超时
    eureka.client.eureka-server-port: Eureka Server端口
    eureka.client.eureka-server-d-n-s-name:获取要查询的DNS名称以获得eureka服务器的列表。
    eureka.client.eureka-server-read-timeout-seconds:示在从eureka服务器读取数据之前需要等待多长时间(以秒为单位)
    eureka.client.eureka-server-total-connections:从eureka客户端到所有eureka服务器的所允许连接总数。
    eureka.client.eureka-server-total-connections-per-host:设置每一个主机所允许的到Eureka Server连接的数量
    eureka.client.fetch-registry: 是否允许客户端向Eureka 注册表获取信息,一般服务器为设置为false,客户端设置为true
    eureka.client.register-with-eureka:是否允许向Eureka Server注册信息,默认true,如果是服务器端,应该设置为false
    eureka.client.fetch-remote-regions-registry:逗号分隔的区域列表,用于获取eureka注册信息
    eureka.client.g-zip-content:从服务器端获取数据是否需要压缩
    eureka.client.prefer-same-zone-eureka: 是否优先使选择相同Zone的实例,默认为true
    eureka.client.registry-fetch-interval-seconds:多长时间从Eureka Server注册表获取一次数据,默认30s
    eureka.client.service-url:可用区域映射,列出完全合格的url与eureka服务器通信。每个值可以是一个URL,也可以是一个逗号分隔的替代位置列表。
    eureka.dashboard.enabled: 是否启用Eureka首页,默认为true
    eureka.dashboard.path: 默认为/
    eureka.instance.appname:在eureka注册的应用程序的名称。
    eureka.instance.app-group-name:在eureka注册的应用程序的组名称
    eureka.instance.health-check-url: 健康检查绝对路径
    eureka.instance.health-check-url-path:健康检查相对路径
    eureka.instance.hostname:设置主机名
    eureka.instance.instance-id:设置注册实例的id
    eureka.instance.lease-expiration-duration-in-seconds:设置多长时间意味着租约到期,默认90
    eureka.instance.lease-renewal-interval-in-seconds:表示Eureka客户端需要发送心跳到eureka服务器的频率(以秒为单位),以表明它仍然存在。指定的期间内如果没有收到心跳leaseExpirationDurationInSeconds
    eureka.instance.metadata-map:可以设置元数据
    eureka.instance.prefer-ip-address: 实例名以IP,但是建议hostname,默认为false

  • 相关阅读:
    Win10下Anaconda命令行相关操作
    【问题解决】module 'cv2.cv2' has no attribute 'face'
    LeetCode 53. 最大子序和
    从尾到头打印链表
    字符串逆序
    交换俩字符串
    LeetCode 147. 对链表进行插入排序
    LeetCode 面试题 02.08. 环路检测
    LeetCode 92. 反转链表 II
    LeetCode 143. 重排链表
  • 原文地址:https://www.cnblogs.com/EnzoDin/p/9247082.html
Copyright © 2011-2022 走看看