服务治理
SpringCloud Eureka是SpringCloud Netflix微服务套件的一部分,它基于Netflix Eureka做了二次封装,主要完成微服务的服务治理功能,SpringCloud通过为Eureka增加了SpringBoot自动化配置,只需要简单的依赖和配置就可完成Eureka整合搭建。
服务治理可以说是微服务中做核心的模块,主要负责服务的自动化注册与发现,在最初开始构建微服务的时候,可能服务并不会很多,我们可以通过一些静态配置进行相互调用,但是随着业务的更新迭代,会越来越复杂,就会发现静态配置已经难以满足我们的需求了,我们的集群、服务位置、服务命名都可能发生变化,如果是人工进行维护的话将消耗很多的人力,为了解决微服务中的服务实例维护问题,产生了大量的服务治理的框架,这些框架都围绕服务注册和发现及服务实例的自动化管理。
话不多说上代码,搭建一个单机的Eureka,首先需要创建SpringBoot项目,创建SpringBoot这里就不讲解了,不会可以看一下我搭建SpringBoot的文章,下图为目录:
导入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:
#公共配置信息 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/ ...
搭建结束,是不是很简单想迫不及待的运行一下了:
运行方式:
1.IDE直接配置启动类
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集群,敬请期待。。。