文档章节

springcloud eureka (服务注册与发现)

zhu_kai1
 zhu_kai1
发布于 2017/04/21 13:53
字数 1509
阅读 780
收藏 0
  • eureka就是服务注册发现 ,为什么需要用到eureka.

  • 因为在一个完整的系统架构中,任何单点的服务都不能保证不会中断,因此我们需要服务发现机制,在某个节点中断后,其它的节点能够继续提供服务,从而保证整个系统是高可用的。
  • 如何达到高可用的eureka?

  • 需要将eureka配置为对等模式,多个eureka互相注册,防止某个节点挂了,不影响到整个服务的运行
  • server:
      port: 8762
    eureka:
        client:
          register-with-eureka: false
          fetch-registry: false
          serviceUrl:
                defaultZone: http://test:111@localhost:8761/eureka
        server:
            enableSelfPreservation: false
        instance:
          prefer-ip-address: true
    
    #安全认证的配置
    security:
      basic:
        enabled: true
      user:
        name: test
        password: 111
    
    server:
      port: 8761
    eureka:
        client:
          register-with-eureka: false
          fetch-registry: false
          serviceUrl:
                defaultZone: http://test:111@localhost:8762/eureka
        server:
            enableSelfPreservation: false
        instance:
          prefer-ip-address: true
    
    #安全认证的配置
    security:
      basic:
        enabled: true
      user:
        name: test
        password: 111
    

    对Eureka服务的身份验证

  • 如果其中一个eureka.client.serviceUrl.defaultZone的url已经把凭证嵌入到它里面,那么HTTP基本的身份验证将会被自动添加到你的eureka客户端(curl风格,如 http://user:password@localhost:8761/eureka)。 
  • 创建“注册与发现服务”

  • 创建一个基础的Spring Boot工程,并在pom.xml中引入需要的以下依赖内容:
  • <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.1.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <java.version>1.7</java.version>
        </properties>
    
    
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <!-- eureka support -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>
    
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Brixton.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>

    通过@EnableEurekaServer注解启动一个服务注册中心提供给其他应用进行对话。这一步非常的简单,只需要在一个普通的Spring Boot应用中添加这个注解就能开启此功能,比如下面的例子:

  • @EnableEurekaServer //启动一个服务注册中心提供给其他应用进行对话
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class,args);
        }
    }

    在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,只需要在application.properties中问增加如下配置:

    server.port=8761
    eureka.client.register-with-eureka=false
    eureka.client.fetch-registry=false
    eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

    如何查看eureka是否启动成功?

  • 在浏览器中输入eureka部署的机器的IP地址以及端口号,就可以查看有哪些服务已注册。
  • 创建注册与发现客户端

  • 首先,创建一个基本的Spring Boot应用,在pom.xml中,加入如下配置:
  • <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
        <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-eureka</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
    	    <groupId>org.springframework.cloud</groupId>
    	    <artifactId>spring-cloud-dependencies</artifactId>
    	    <version>Brixton.RELEASE</version>
    	    <type>pom</type>
    	    <scope>import</scope>
    	</dependency>
        </dependencies>
    </dependencyManagement>

    然后在启动类上加@EnableEurekaClient注解,该注解能激活Eureka中的DiscoveryClient实现。

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

    之后在对应的application.properties文件配置

  • spring.application.name=test
    server.port=8180
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/
    

    通过spring.application.name属性,我们可以指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问

  • eureka.client.serviceUrl.defaultZone属性对应服务注册中心的配置内容,指定服务注册中心的位置,告诉我们该服务注册到哪个eureka上,若是多个eureka的话,中间用逗号隔开。

  • 然后再次在浏览器中输入对应的eureka的地址,就能看到对应的test项目注册在eureka上去了。

  • eureka常见问题总结

  • eureka使用IP注册(Eureka配置instanceId显示IP)
  • eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/
      #关键在于下面2个配置
      instance:
        preferIpAddress: true  
        instance-id: ${spring.cloud.client.ipAddress}:${server.port}
    

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

  • eureka.instance.leaseRenewalIntervalInSeconds
    参考文档:
    http://cloud.spring.io/spring-cloud-static/Camden.SR1/#_why_is_it_so_slow_to_register_a_service
    
    原文:
    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.
    翻译:
    作为实例还涉及到与注册中心的周期性心跳,默认持续时间为30秒(通过serviceUrl)。在实例、服务器、客户端都在本地缓存中具有相同的元数据之前,服务不可用于客户端发现(所以可能需要3次心跳)。你可以使用eureka.instance.leaseRenewalIntervalInSeconds 配置,这将加快客户端连接到其他服务的过程。在生产中,最好坚持使用默认值,因为在服务器内部有一些计算,他们对续约做出假设。
    

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

  • server端:
    eureka.server.enable-self-preservation			(设为false,关闭自我保护主要)
    eureka.server.eviction-interval-timer-in-ms     清理间隔(单位毫秒,默认是60*1000)
    client端:
    eureka.client.healthcheck.enabled = true				开启健康检查(需要spring-boot-starter-actuator依赖)
    eureka.instance.lease-renewal-interval-in-seconds =10	租期更新时间间隔(默认30秒)
    eureka.instance.lease-expiration-duration-in-seconds =30 租期到期时间(默认90秒)
    
    示例:
    服务器端配置:
    eureka:
        server:
            enableSelfPreservation: false
            evictionIntervalTimerInMs: 4000
    客户端配置:
    eureka:
        instance:
            leaseRenewalIntervalInSeconds: 10
            leaseExpirationDurationInSeconds: 30
    注意:
    更改Eureka更新频率将打破服务器的自我保护功能
    参考文档
    https://github.com/spring-cloud/spring-cloud-netflix/issues/373
    

    Eureka Environment的配置

  • eureka.environment: 字符串
    参考文档:
    https://github.com/Netflix/eureka/wiki/Configuring-Eureka
    

    Eureka DataCenter的配置

  • eureka.datacenter: cloud
    https://github.com/Netflix/eureka/wiki/Configuring-Eureka
    这边说:配置-Deureka.datacenter=cloud,这样eureka将会知道是在AWS云上
    

     

© 著作权归作者所有

zhu_kai1
粉丝 6
博文 34
码字总数 30384
作品 0
私信 提问
加载中

评论(1)

smart152819
smart152819
夜行侠老师录制的:Spring Cloud微服务架构在互联网中应用
由大象分享网出版:
http://www.itjoin.org/course/detail/5934a58c0cf2159b39641f80
夜行侠课程集合:http://www.xuetuwuyou.com/user/29

第1节、Springcloud介绍
第2节、Eureka的使用
第3节、Eureka集群
第4节、restful请求
第5节、restful请求负载均衡
第6节、配置中心
第7节、获取配置中心数据
第8节、配置中心高可用
第9节、消息总线实战
第10节、feign请求内幕
第11节、断路器(Hystrix)
第12节、断路器的监控(Hystrix Dashboard)
第13节、断路器聚合监控(Hystrix Turbine)
第14节、服务调用追踪(Spring Cloud Sleuth)
第15节、Spring Cloud Stream rabbitmq上
第16节、Spring Cloud Stream rabbitmq下
第17节、Spring Cloud Stream kafka实战
第18节、Spring Data Flow Server
第19节、在Spring Data Flow 运行springcloud stream
第20节、Spring cloud task
第21节、Spring cloud task运行在spring data flow上
第22节、课程总结和下回预告
EurekaServer高可用

前言 之前一篇文章文章《服务注册与发现---eureka》介绍了单点EurekaServer。但是实际环境中,这种单点的的模式可能会有很多隐形的问题。比如EurekaServer发生宕机,或者某些意外情况发生,很...

dalaoyang
2018/06/15
0
0
史上最简单的 SpringCloud 教程 | 终章

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://blog.csdn.net/forezp。 https://blog.csdn.net/forezp/article/details/70148833 转载请标明出处...

方志朋
2017/04/12
0
0
Spring Cloud-Eureka Client 原理解析

SpringCloud-Spring Cloud Context SpringCloud-Eureka 服务注册 SpringCloud-Eureka 服务发现 Spring Cloud-Eureka Client 原理解析 SpringCloud-声明式服务调用 Feign SpringCloud-负载均衡......

glmapper
01/11
0
0
SpringCloud使用Prometheus监控(基于Eureka)

本文介绍SpringCloud使用Prometheus,基于Eureka服务发现。 1.Prometheus介绍 在之前写过两篇有关Prometheus使用的文章,如下: 《SpringBoot使用prometheus监控》 《SpringBoot使用SOFA-Lo...

dalaoyang
03/11
0
0
SpringCloud--鸿鹄Cloud分布式微服务云系统

简介 鸿鹄云Cloud是基于SpringCloud来封装的,是一系列框架的有序集合。利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现、注册、配置中心、消息总线、负载均衡、断路器...

itcloud
2018/07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式

//分静态代理和动态代理,区别:是否再编译时知道被被代理的对象 //思想,被代理类将自己的处理交给代理类,代理类可以添加一些新的功能,之后有代理类和客户端交互 https://www.cnblogs.co...

南桥北木
26分钟前
2
0
Spring系列教程七: Spring 整合mybatis的四种方式

一、使用注解实现整合mybatis 项目目录如下 第一步、导入jar包 <build> <resources> <!-- mapper.xml文件在java目录下 --> <resource> ......

我叫小糖主
32分钟前
6
0
阿里P7架构师:这些技术点没搞懂,我劝你不要跳槽!

阿里P7架构师架构师:这些技术点没搞懂,我劝你不要跳槽! 哪些技术点呢? 废话不多说,技术点全在下面这6张图里面了! 1.怎么看源码? 2.分布式 3.微服务 4.性能优化 5.工程化 粉丝福利:一...

别打我会飞
50分钟前
6
0
易错题

父类必须有一个无参构造,不然会报Implicit super constructor Parent() is undefined. Must explicitly invoke another constructor...

architect刘源源
55分钟前
1
0
使用Json4s 将带有Timestamp的对象转json时 变为所在时区

在有Timestamp属性的对象转json时 最后出来的时间会减小8小时,是因为变成了0时区,需要将隐式转换中添加设置本地时区 import org.json4s.{DefaultFormats, Formats}import org.json4s.jac...

可达鸭Go
57分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部