Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,均可以用Spring Boot的开发风格作到一键启动和部署。Spring Cloud并无重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,经过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。java
Eureka是Netflix开源的服务发现组件,自己是基于Rest的服务,它包含服务端和客户端两部分;在SpringCloud中将它集成在其中,从而实现了微服务的发现与注册;
- Eureka的GitHub:https://github.com/Netflix/Eureka
git
Eureka Server
- 服务端-没有存储,内存保持,每服务实例须要发送心跳去续约
- 客户端-在内存中缓存着eureka的注册信息,所以没必要每请求到eureka查找服务
- eureka之间会作注册服务同步,从而保证状态一致,客户端只需访问一个eureka
Service Provider
- 会向Eureka Server作Register(服务注册)、Renew(服务续约)、Cancel(服务下线)等操做
Service Consumer
- 会向Eureka Server获取注册服务列表,并消费服务github
在pom.xml中加入如下依赖:web
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在配置文件application.xml中添加如下配置:spring
server.port=8781 #表示是否将本身注册在EurekaServer上,默认为true。因为当前应用就是EurekaServer,因此置为false eureka.client.register-with-eureka=false #表示表示是否从EurekaServer获取注册信息,默认为true。单节点不须要同步其余的EurekaServer节点的数据 eureka.client.fetch-registry=false #设置Eureka的地址 eureka.client.service-url.defaultZone=http://localhost:8781/eureka
添加启动类,并加上启动Eureka注解:缓存
@SpringBootApplication @EnableEurekaServer public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
启动项目,打开http://localhost:8781/,以下:网络
在pom.xml中加入依赖:架构
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<dependencies>
<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>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在配置文件application.xml加入要注入的配置中心的url等配置:app
server.port=8782 #对该应用另起别名 spring.application.name=client-8782 #注入目标,配置服务中心url,与服务端的配置保持一致 eureka.client.service-url.defaultZone=http://localhost:8781/eureka/
建立客户端启动类ClientApplication.java,并加入客户端被发现注解:负载均衡
@SpringBootApplication @EnableDiscoveryClient public class ClientApplication { public static void main(String[] args) { SpringApplication.run(ClientApplication.class, args); } }
启动应用,接着打开以前Eureka的注册页面http://localhost:8781/,以下:
发现刚刚启动的客户端已经注册在了服务端了。
当我将客户端关闭后,再次打开Eureka的注册页面,发现有一串红字:
这是由于Eureka进入了自我保护机制,默认状况下,若是EurekaServer在必定时间内没有接收到某个微服务实例的心跳时,EurekaServer将会注销该实例(默认90s)。可是当网络发生故障时,微服务与EurekaServer之间没法通讯,这样就会很危险了,由于微服务自己是很健康的,此时就不该该注销这个微服务,而Eureka经过自我保护机制来预防这种状况,当网络健康后,该EurekaServer节点就会自动退出自我保护模式;
这时再次将客户端微服务启动,刷新服务注册中心会发现,自我保护状态已取消。
综上所述,咱们能够看出来Eureka的两个组件EurekaServer和EurekaClient的做用:
综上,Eureka经过心跳检查、客户端缓存等机制,提升了系统的灵活性、可伸缩性和可用性,因此做为一个微服务架构,须要一个服务注册中心来统筹管理服务;
复制上面server项目,分别命名:eureka-keepalived-server-1,eureka-keepalived-server2;
复制上面client项目,命名为:eureka-keepalived-client;
修改hosts文件:
127.0.0.1 localhost server1 server2
修改application.properties配置文件(注意须要将eureka.client.register-with-eureka、eureka.client.fetch-registry注释掉):
eureka-keepalived-server-1的配置文件:
server.port=8781 spring.application.name=eureka-server-1 spring.profiles.active=server1 #eureka.client.register-with-eureka=false #eureka.client.fetch-registry=false #指定主机名 eureka.instance.hostname=server1 #设置EurekaServer的地址,将自身注册到Server2 eureka.client.service-url.defaultZone=http://server2:8782/eureka
eureka-keepalived-server-2的配置文件:
server.port=8782 spring.application.name=eureka-server-2 #指定hostname spring.profiles.active=server2 #eureka.client.register-with-eureka=false #eureka.client.fetch-registry=false #指定主机名 eureka.instance.hostname=server2 #设置EurekaServer的地址,将本身注册在Server2上 eureka.client.service-url.defaultZone=http://server1:8781/eureka
eureka-keepalived-client的配置文件:
server.port=8783 #对该应用另起别名 spring.application.name=client-8783 #注入目标,配置服务中心url,与服务端的配置保持一致,这里能够写多个,以“,”分隔,如http://server1:8781/eureka/,http://server2:8782/eureka/ eureka.client.service-url.defaultZone=http://server1:8781/eureka/
分别启动两个服务端server二、server1,访问,server1:8781/,server2:8782/,以下:
启动客户端,发现客户端分别在两个服务端都有相应的注册,而咱们的客户端实际只指定了一个Server;
至此,完成了Eureka的高可用;
示例代码:https://gitee.com/lfalex/springcloud-example.git
参考书籍:《SpringCloud与Docker微服务架构实战》周力著