运行原理:
服务提供者和消费者都注册到Eureka服务器上,浏览器访问消费者地址,消费者会通过Eureka服务器上服务提供者的名字,找到提供者的真实路径,进行调用。高可用时可以搭建几个Eureka服务器,互相注册,复制各自信息。
eureka是注重高可用和分区容错性的,它实现注册发现和故障转移靠的就是:注册表和多级缓存。目的就是为防止当高并发时,读写同时操作注册表时数据同步问题,如果为了数据安全必须加锁,而加锁势必会导致性能问题,所以才考虑了这种多级缓存方案。
1. eureka中维护了注册表和readonly和readwrite缓存,首先消费者和提供者会注册到eureka注册中心里面去,并同步到readwrite缓存里面去。
2. 消费者定时去readonly中拉取注册信息,然后去调用提供者。由于readonly和readwrite同步不是实时的,所以经常会出现刚启动之后,要过几十秒才能访问的情况。
3. 其实eureka后台会有一个线程,定时去同步readonly和readwrite的注册信息,当数据同步完成之后。此时消费者就能从readonly拿到数据去调用提供者。
4. 如果此时提供者挂了,注册表信息没更新、或者消费者还是拿着以前的注册信息去调用,就会出现timeout。
5. eureka为了提高它的容错性,在后台维护了一个线程去更新注册表信息,当它发现提供者长时间没法送过心跳检测,就会删掉这个提供者的注册信息,然后清空整个readwrite缓存。
6. 过了一会,前面提到的那一个后台线程同步readonly和readwrite信息时,就把readonly缓存清空了。
7. 此时消费者去拉取readonly没有信息时、就会去读取readwrite缓存,readwrite也为空,就会去找注册表了,然后把最新的数据同步到readonly和readwrite。
作用:透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何api侵入。
eureka是springcloud的一个子项目,通过rest api来调用。更看重高可用和分区容错性。springcloud对构建微服务架构有一套完整的技术栈; zookeeper只是一个单纯的服务注册组件,通过rpc方式调用。zookeeper更加看重一致性和分区容错性。很难说谁好谁坏,还是根据公司业务做技术选型吧。
案例编写:
一:搭建eureka服务器
1. 导入依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <!-- springcloud依赖 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- eureka服务器依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies>
2. 配置application.xml文件
# 指定默认端口
server:
port: 8761
# eureka默认把自己到服务器注册会报错,这里禁止掉
eureka:
client:
register-with-eureka: false
fetch-registry: false
3. 编写启动类
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication //申明这是一个eureka服务器 @EnableEurekaServer public class ServerApp { public static void main(String[] args) { SpringApplication.run(ServerApp.class, args); //new SpringApplicationBuilder(ServerApp.class).web(true).run(args); } }
4. 测试 (看到这个页面就说明eureka服务器搭建好了,我们可以编写一个项目注册到eureka上面来)
搭建测试工程:
1. 导包
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <!-- springcloud依赖 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- eureka客户端依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies>
2. 编写application.yml配置文件
# 设置服务名称,服务会以这个名字注册到eureka服务器上
spring:
application:
name: myclient
# 设置eureka服务器的注册地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
3. 启动springboot应用,刷新127.0.0.1:8761可以发现我们的服务就已注册上去了。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication //申明eureka客户端 @EnableEurekaClient public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }