SpringCloud——Eureka服务注册和发现

1、SpringCloud和Dubbo

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

content Dubbo SpringCloud
服务注册中心 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没有提供不少解决方案,但他也能够整合第三方的项目来实现。git

2、Demo

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

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

一、服务注册中心

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,注意名称只能是这个,否则不会被识别。spring

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

 

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

  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 就会显示: 
这里写图片描述

二、服务提供者

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等。

相关文章
相关标签/搜索