赞
踩
在微服务架构中,服务注册与发现是核心组件之一。Spring Cloud提供了多种服务注册于发现的实现方式,例如Eureka、Consul、Zookeeper。
服务注册:将服务所在主机、端口、版本号、通信协议等信息登记到注册中心上;
服务发现:服务消费者向注册中心请求已经登记的服务列表,然后得到某个服务的主机、端口号、版本号、通信协议等信息,从而实现对具体服务的调用。
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)、P(分区容错性)。
由于分区容错性在分布式系统中是必须要保证的,因此我们只能在A和C之间进行权衡,ZooKeeper保证的是CP,Eureka保证的是AP。
在ZooKeeper中,当master节点因为网络故障与其他节点失去联系时,剩余的节点会重新进行leader选举,但问题在于,选举leader需要一定的时间,且选举期间ZooKeeper集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因为网络问题使得ZooKeeper集群失去master节点是大概率事件,虽然服务最终能够恢复,但是在选举期间内导致服务注册长期不可用是难以容忍的。
Eureka优先保证可用性,Eureka各个节点是平等的,某几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册时如果发现连接失败,则会自动切换至其他节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。
所以Eureka在网络故障导致部分节点失去联系的情况下,只要有一个节点可用,那么注册和查询服务就可以正常使用,而不会像zookeeper那样使得整个注册服务瘫痪,Eureka优先保证了可用性。
方式一:手动添加依赖
方式二:Idea自动添加依赖(推荐)
在项目构建中添加模块Model,选择Spring
先在下拉框选择Spring Boot的版本,然后在Web中选择Spring Web,在Spring Cloud Discovery中选择Eureka的Client或者Server。
这样,Idea会为我们自己找到和Spring Boot版本对应的Spring Cloud和Eureka版本。
1、添加Spring Boot、Spring Cloud、Eureka Server的相关依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ex</groupId> <artifactId>eurekaCluster-server-7001</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eurekaCluster-server-7001</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>2020.0.0</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
2、配置文件进行配置
# 端口
server.port=7001
# 应用名称,会在Eureka中显示
spring.application.name=eurekaserver-7001
# 注册中心的hostname
eureka.instance.hostname=eureka7002
eureka.instance.non-secure-port=${server.port}
# 是否注册自己的信息到EurekaServer,默认是true
eureka.client.register-with-eureka=false
# 是否拉取其它服务的信息,默认是true
eureka.client.fetch-registry=false
# EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址。
eureka.client.service-url.defaultZone=http://localhost:7001/eureka
3、主入口添加注解 @EnableEurekaServer
启用eureka server
4、启动eureka服务端,浏览器访问 http://localhost:7001,可以看到看到Eureka Server 监控页面。(目前红框为空,之后服务注册进来会看到类似下面的内容)
1、添加Spring Boot、Spring Cloud、Eureka Client的相关依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ex</groupId> <artifactId>eureka-client-provider-8001</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-client-provider-8001</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>2020.0.0</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
2、配置文件中进行相关配置
server.port=8001
#指定该服务的名字,该名称将在服务被调用时使用
spring.application.name=eureka-client-provider
#Eureka配置:服务注册到哪里
eureka.client.service-url.defaultZone=http://localhost:7001/eureka
3、主入口添加注解 @EnableEurekaClient
启用eureka client
4、添加controller类,配合使用@RestController
注解(Eureka是基于REST的)
//作为服务提供者,要是用 RestController 返回json数据
@RestController
public class DeptController {
@GetMapping("/test")
public String testSpringCloud(){
return "Eureka Client 服务提供者";
}
}
5、启动客户端服务提供者
1、添加Spring Boot、Spring Cloud、Eureka Client的相关依赖(同上)
2、配置文件中进行配置
server.port=80
#指定该服务的名字,该名称将在服务被调用时使用
spring.application.name=eureka-client-consumer
#Eureka配置:服务注册到哪里
eureka.client.service-url.defaultZone=http://localhost:7001/eureka
3、主入口添加注解 @EnableEurekaClient
启用eureka client
4、创建一个controller来访问服务提供者的服务
/** * 作为服务消费者,可以返回任何形式的数据,这里使用RestController只是为了测试方便返回json数据 */ @RestController public class TestController { /** * RestTemplate 是一个基于Http协议的工具对象 * 我们可以利用这个对象,以http协议发送请求到指定的web服务器中 * 在springcloud中可以利用这个对象来访问服务提供者 * 这个对象可以new 也可以交给spring来创建(建议交给spring创建-1.配置config 2.@Resource注入对象) */ @GetMapping("/test") public String test() { RestTemplate restTemplate = new RestTemplate(); /** * getForEntity 方法:是一个get方法提交请求,访问web服务器中的某个请求 * 对应着另一个工程中的@GetMapping或者@RequestMapping * 参数1:需要访问的具体请求路径 参数2:本次请求服务器返回的数据类型 参数3:可变长度的Object类型数据,表示本次请求中的url参数数据 * 注意:由于SpringCloud返回的数据类型全部是Rest风格数据,全是String类型的json数据格式,可以根据具体的数据格式来指定返回类型,交给spring,完成封装。 * 返回值:ResponseEntity对象,封装着本次请求后的响应体,可以从该对象中获得本次请求的状态码、头文件信息、响应数据 */ // 直接通过http访问 //ResponseEntity<String> result = restTemplate.getForEntity("http://localhost:8001/test", String.class); // 通过注册中心发现服务并访问服务:EUREKA-CLIENT-PROVIDER就是服务的名称(不区分大小写) ResponseEntity<String> result = restTemplate.getForEntity("http://EUREKA-CLIENT-PROVIDER/test", String.class); System.out.println(result.getStatusCode()); //200 OK System.out.println(result.getHeaders()); //[Content-Type:"text/plain;charset=UTF-8", Content-Length:"17", Date:"Thu, 21 Jan 2021 07:03:03 GMT", Keep-Alive:"timeout=60", Connection:"keep-alive"] String body = result.getBody(); return "hello, Eureka Client 服务消费----" + body; } }
5、启动服务消费者
6、访问 http://localhost:80/test
可以看到网页输出:
hello, Eureka Client 服务消费----Eureka Client 服务提供者
1、项目结构(1个消费者、2个服务提供者、3个注册中心)
2、修改本机host文件
3、修改配置文件
Eureka Server:
# 指定服务注册中心的位置
eureka.client.service-url.defaultZone=http://eureka7001:7001/eureka,http://eureka7002:7002/eureka,http://eureka7003:7003/eureka
Eureka Client:(服务提供者和消费者)
#Eureka配置:服务注册到哪里
#同时指定多个注册地址,springcloud底层算法会选择将数据注册到某一个注册中心
eureka.client.service-url.defaultZone=http://eureka7001:7001/eureka,http://eureka7002:7002/eureka,http://eureka7003:7003/eureka
4、启动项目,先启动Eureka Server集群,再启动Eureka Client。
5、在浏览器访问 http://eureka7001:7001、http://eureka7002:7002、http://eureka7003:7003
# 自我保护模式:关闭以后当服务不能正常向注册中心提交心跳信息时,在指定的时间点以后注册中心就会将这个服务移除掉;开启以后当服务不能正常提交自己的心跳也不会将服务移除;默认是true
eureka.server.enable-self-preservation=false
# 每隔2s向服务端发送一次心跳,证明自己还活着,默认30s
eureka.instance.lease-renewal-interval-in-seconds=2
# 告诉服务端如果我10s之内没有给你发送心跳代表我故障了,把我移除
eureka.instance.lease-expiration-duration-in-seconds=10
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。