zoukankan      html  css  js  c++  java
  • SpringCloud——Eureka服务注册和发现

    一、SpringCloud和Dubbo

    SpringCloud整合了一套较为完整的微服务解决方案框架,而Dubbo只是解决了微服务的几个方面的问题。

    contentDubboSpringCloud
    服务注册中心 zookeeper Spring Cloud Netflix Eureka
    服务调用方式 RPC REST API
    服务网关 Spring Cloud Netflix Zuul
    断路器 不完善 Spring Cloud Netflix Hystrix
    分布式配置 Spring Cloud Config
    服务跟踪 Spring Cloud Sleuth
    消息总线 Spring Cloud Bus
    数据流 Spring Cloud Stream
    批量任务 Spring Cloud Task

    当然,虽然dubbo没有提供很多解决方案,但他也可以整合第三方的项目来实现。

    二、Demo

    今天介绍的服务发现是在SpringCloud的子项目Netflix中,除此之外,他还提供了熔断器、负载均衡、智能路由等,之后会介绍到。

    和往常一样,我们先来实现这个实例,然后再分析。这里,我们需要一个服务注册中心(即下面例子中的eureka-server)和一个服务的提供方(eureka-provider)。

    1、服务注册中心

    1)、引入pom文件

    <!--基于Springboot-->
          <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.0.RELEASE</version> 
            <relativePath/>
        </parent>
    
        <properties>   
            <!--设置字符编码及java版本-->
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <!--增加eureka-server的依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
            </dependency>
            <!--用于测试的,本例可省略-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <!--依赖管理,用于管理spring-cloud的依赖,其中Camden.SR3是版本号-->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Camden.SR3</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>

    2)、配置

    新建application.properties,注意名称只能是这个,不然不会被识别。

    server.port=8761
    #注册中心默认端口就是8761,也可通过下面的方式定义其他端口
    #eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
    eureka.client.registerWithEureka=false
    eureka.client.fetchRegistry=false

      在application.properties配置文件中使用如下配置:

      server.port=8761

      eureka.instance.hostname=localhost

      eureka.client.registerWithEureka=false

      eureka.client.fetchRegistry=false

      eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

      其中server.port配置eureka服务器端口号。Eureka的配置属性都在开源项目spring-cloud-netflix-master中定义(spring boot连文档都没有,只能看源码了),

           在这个项目中有两个类EurekaInstanceConfigBean 和EurekaClientConfigBean,分别含有eureka.instance和eureka.client相关属性的解释和定义。

           从中可以看到,registerWithEureka表示是否注册自身到eureka服务器,因为当前这个应用就是eureka服务器,没必要注册自身,所以这里是false。

           fetchRegistry表示是否从eureka服务器获取注册信息,同上,这里不需要。defaultZone就比较重要了,是设置eureka服务器所在的地址,查询服务和注册服务都需要依赖这个地址。

    3)、启动类

    @EnableEurekaServer  //启动一个服务注册中心提供给其他应用进行对话
    @SpringBootApplication
    public class ServerApplication {
    public static void main(String[] args) {
    //下面两行代码都可以用来启动
     SpringApplication.run(ServerApplication.class, args);
    //new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
    }

    4)、测试

    在浏览器中输入http://localhost:8761 就会显示: 
    这里写图片描述

    2、服务提供者

    1)、pom文件跟注册中心类似,只有eureka有区别:

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

    2)、配置文件

    #应用(服务)名称
    spring.application.name=compute-service  
    server.port=8762
    #注册中心地址
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
    
    

    3)、Java Code

    Controller中,通过DiscoveryClient发现服务。 
    启动类

    @EnableDiscoveryClient  //激活eureka中的DiscoveryClient实现
    @SpringBootApplication
    public class ComputeServiceApplication {
        public static void main(String[] args) {
        new SpringApplicationBuilder(ComputeServiceApplication.class).web(true).run(args);
        }
    }

    4)、测试

    这里写图片描述

    在浏览器中输入http://localhost:8762/hello?name=Sherryhttp://yfywyangsx.hiersun.com:hello-service:8762/hello?name=Sherry

    这里写图片描述 ##

    Spring Cloud中,Eureka常见问题总结。

    指定Eureka的Environment

    
    
    1
    
    
    eureka.environment: 指定环境

    参考文档:https://github.com/Netflix/eureka/wiki/Configuring-Eureka

    指定Eureka的DataCenter

    
    
    1
    
    
    eureka.datacenter: 指定数据中心

    参考文档:https://github.com/Netflix/eureka/wiki/Configuring-Eureka
    文中指出,配置-Deureka.datacenter=cloud,这样eureka将会知道是在AWS云上。

    如何解决Eureka注册服务慢的问题

    使用配置项:

    
    
    1
    
    
    eureka.instance.leaseRenewalIntervalInSeconds

    参考文档:
    http://cloud.spring.io/spring-cloud-static/Camden.SR1/#_why_is_it_so_slow_to_register_a_service
    原文:

    
    
    1
    2
    3
    
    
    Why is it so Slow to Register a Service?
     
    Being an instance also involves a periodic heartbeat to the registry (via the client’s serviceUrl) with default duration 30 seconds. A service is not available for discovery by clients until the instance, the server and the client all have the same metadata in their local cache (so it could take 3 heartbeats). You can change the period using eureka.instance.leaseRenewalIntervalInSeconds and this will speed up the process of getting clients connected to other services. In production it’s probably better to stick with the default because there are some computations internally in the server that make assumptions about the lease renewal period.

    翻译:

    
    
    1
    
    
    作为实例还涉及到与注册中心的周期性心跳,默认持续时间为30秒(通过serviceUrl)。在实例、服务器、客户端都在本地缓存中具有相同的元数据之前,服务不可用于客户端发现(所以可能需要3次心跳)。你可以使用eureka.instance.leaseRenewalIntervalInSeconds 配置,这将加快客户端连接到其他服务的过程。在生产中,最好坚持使用默认值,因为在服务器内部有一些计算,他们对续约做出假设。

    Eureka的自我保护模式

    如果在Eureka Server的首页看到以下这段提示,则说明Eureka已经进入了保护模式。

    
    
    1
    
    
    EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

    保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。

    详见:https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication

    如何解决Eureka Server不踢出已关停的节点的问题

    在开发过程中,我们常常希望Eureka Server能够迅速有效地踢出已关停的节点,但是新手由于Eureka自我保护模式,以及心跳周期长的原因,常常会遇到Eureka Server不踢出已关停的节点的问题。解决方法如下:

    (1) Eureka Server端:配置关闭自我保护,并按需配置Eureka Server清理无效节点的时间间隔。

    
    
    1
    2
    
    
    eureka.server.enable-self-preservation # 设为false,关闭自我保护
    eureka.server.eviction-interval-timer-in-ms # 清理间隔(单位毫秒,默认是60*1000)

    (2) Eureka Client端:配置开启健康检查,并按需配置续约更新时间和到期时间。

    
    
    1
    2
    3
    
    
    eureka.client.healthcheck.enabled # 开启健康检查(需要spring-boot-starter-actuator依赖)
    eureka.instance.lease-renewal-interval-in-seconds # 续约更新时间间隔(默认30秒)
    eureka.instance.lease-expiration-duration-in-seconds # 续约到期时间(默认90秒)

    示例:
    服务器端配置:

    
    
    1
    2
    3
    4
    
    
    eureka:
    server:
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 4000

    客户端配置:

    
    
    1
    2
    3
    4
    5
    6
    7
    
    
    eureka:
    client:
    healthcheck:
    enabled: true
    instance:
    lease-expiration-duration-in-seconds: 30
    lease-renewal-interval-in-seconds: 10

    注意:
    更改Eureka更新频率将打破服务器的自我保护功能,生产环境下不建议自定义这些配置。
    详见:https://github.com/spring-cloud/spring-cloud-netflix/issues/373

    自定义Eureka的Instance ID

    在Spring Cloud中,服务的Instance ID的默认值是${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}} ,也就是机器主机名:应用名称:应用端口 。因此在Eureka Server首页中看到的服务的信息类似如下:itmuch:microservice-provider-user:8000 。如果想要自定义这部分的信息怎么办?

    示例:

    1.  
      eureka:
    2.  
      client:
    3.  
      serviceUrl:
    4.  
      defaultZone: http://localhost:8761/eureka/
    5.  
      instance:
    6.  
      preferIpAddress: true
    7.  
      instance-id: ${spring.cloud.client.ipAddress}:${server.port} # 将Instance ID设置成IP:端口的形式

    Eureka配置最佳实践参考

    https://github.com/spring-cloud/spring-cloud-netflix/issues/203

    注意点:eureka.client.healthcheck.enabled=true配置项必须设置在application.yml中

    eureka.client.healthcheck.enabled=true 只应该在application.yml中设置。如果设置在bootstrap.yml中将会导致一些不良的副作用,例如在Eureka中注册的应用名称是UNKNOWN等。

  • 相关阅读:
    可能是全网最详细的express--middleware
    带你学Node系列之express-CRUD
    简单聊聊ES6-Promise和Async
    Node学习图文教程之express重写留言本案例
    Node.js学习(第四章:初见express)
    彻底弄懂ES6中的Map和Set
    全网最easy的better-scroll实现上拉加载和下拉刷新
    Node中require第三方模块的规则
    canvas实现酷炫气泡效果
    Node.js实现用户评论社区(体验前后端开发的乐趣)
  • 原文地址:https://www.cnblogs.com/jtlgb/p/8532100.html
Copyright © 2011-2022 走看看