服务治理java
SpringCloud Eureka是SpringCloud Netflix微服务套件的一部分,它基于Netflix Eureka作了二次封装,主要完成微服务的服务治理功能,SpringCloud经过为Eureka增长了SpringBoot自动化配置,只须要简单的依赖和配置就可完成Eureka整合搭建。node
服务治理能够说是微服务中作核心的模块,主要负责服务的自动化注册与发现,在最初开始构建微服务的时候,可能服务并不会不少,咱们能够经过一些静态配置进行相互调用,可是随着业务的更新迭代,会愈来愈复杂,就会发现静态配置已经难以知足咱们的需求了,咱们的集群、服务位置、服务命名均可能发生变化,若是是人工进行维护的话将消耗不少的人力,为了解决微服务中的服务实例维护问题,产生了大量的服务治理的框架,这些框架都围绕服务注册和发现及服务实例的自动化管理。web
话很少说上代码,搭建一个单机的Eureka,首先须要建立SpringBoot项目,建立SpringBoot这里就不讲解了,不会能够看一下我搭建SpringBoot的文章,下图为目录:spring
导入Eureka相关依赖信息,SpringBoot我用的是1.5.3-RELEASE版本:安全
1 <parent> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-parent</artifactId> 4 <version>1.5.3.RELEASE</version> 5 </parent> 6 7 <properties> 8 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 9 <java.version>1.8</java.version> 10 <spring.cloud.version>Dalston.SR2</spring.cloud.version> 11 </properties> 12 13 <dependencyManagement> 14 <dependencies> 15 <dependency> 16 <groupId>org.springframework.cloud</groupId> 17 <artifactId>spring-cloud-dependencies</artifactId> 18 <version>${spring.cloud.version}</version> 19 <type>pom</type> 20 <scope>import</scope> 21 </dependency> 22 </dependencies> 23 </dependencyManagement> 24 25 <dependencies> 26 <dependency> 27 <groupId>org.springframework.cloud</groupId> 28 <artifactId>spring-cloud-starter-eureka-server</artifactId> 29 </dependency> 30 <dependency> 31 <groupId>org.springframework.boot</groupId> 32 <artifactId>spring-boot-starter-actuator</artifactId> 33 </dependency> 34 </dependencies>
EurekaServer.java代码以下,也就是EurekaServer启动入口:网络
1 package cloud.eureka.server; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.boot.web.support.SpringBootServletInitializer; 6 import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; 7 8 @SpringBootApplication 9 @EnableEurekaServer 10 public class EurekaServer extends SpringBootServletInitializer { 11 public static void main(String[] args) { 12 SpringApplication.run(EurekaServer.class, args); 13 } 14 }
核心部分application.yml:app
#公共配置信息 server: port: 9901 spring: application: name: eureka-server profiles: active: node1 eureka: instance: prefer-ip-address: true instance-id: ${spring.cloud.client.ipAddress}:${server.port} server: enableSelfPreservation: true #关闭保护机制,以确保注册中心能够将不可用的实例剔除.(注意:自我保护模式是一种应对网络异常的安全保护措施,使用自我保护模式,可让Eureka集群更加的健壮、稳定) evictionIntervalTimerInMs: 5000 #eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒 client: registerWithEureka: true fetchRegistry: true #用---分割不一样的环境对应的配置信息(YML以"---"做为文档分割符,以"..."做为结束标志) --- spring: profiles: node1 eureka: client: serviceUrl: defaultZone: http://10.200.159.22:${server.port:9902}/eureka/ ...
搭建结束,是否是很简单想火烧眉毛的运行一下了:框架
运行方式:maven
1.IDE直接配置启动类spring-boot
2.maven install以后执行java -jar eureka-server.jar --spring.profiles.active=node1&
3.mvn spring-boot:run -Dspring.profiles.active=node1
启动以后访问测试地址:http://注册中心IP:端口,访问以后就会出现下面的界面
注册成功以后,一块儿来看下原理:
服务注册:
服务提供在启动时候会发送一个REST请求将本身注册到Eureka Server,同时会带上自身的元数据信息(主机、端口、URL等),Eureka接收到REST请求以后,将元数据信息存储到一个双层Map中,第一层的Key是服务名,第二层的Key是服务的实例名,在服务注册的时候须要确认一下eureka.client.register-with-eureka=true参数是否正确,若是为false则不启动注册操做。
服务同步:
服务提供者将本身注册到不一样的服务注册中心上,也就是说他们的信息被两个服务注册中心所维护,因为服务注册中心之间因相互注册为服务,当服务提供者发送注册请求到其中一个服务注册中心的时候,它会将该请求转发给集群中相连的其余注册中心,从而实现注册中心之间的服务同步。
服务续约:
注册成功以后,服务提供者会维护一个心跳来持续告诉Eureka Server “我还活着”,防止Eureka的失效剔除将该服务实例从服务列表中排出出去。
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90
服务下线:
系统运行中必然会面临关闭和重启服务的某个实例状况,在服务关闭期间咱们天然不但愿客户端能够继续调用关闭的实例,因此在客户端程序中,当服务实例进行正常关闭操做的时候,会触发一个服务下线的REST请求给Eureka,告诉它“我要下线了”,服务端接受到请求以后将状态置为DOWN,而且把该事件传播出去。
服务失效剔除:
有些时候,微服务并不必定是正常下线的,可能内存溢出、网络故障等问题的出现不能让微服务正常使用,可是服务注册中心并无收到服务下线的请求,为了将这些出问题的微服务实例从服务列表中剔除掉,Eureka在启动的时候会建立一个定时任务,默认每隔60秒将清单中默认90秒没有服务续约的微服务剔除。
自我保护:
Eureka在运行期间会统计服务发送心跳失败的比例在15分钟内是否低于85%,若是出现低于的状况,Eureka就会将当前的实例信息保护起来,让这些实例不会过时。可是,在保护的这段期间若是出现问题,客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的状况,因此客户端必需要有容错机制,好比请求重试、断路由等。
以后会讲解如何搭建Eureka集群,敬请期待。。。