前言
spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。
SpringCloud的注册发现机制
Spring Cloud提供了一种称为服务注册发现(Service Discovery)的机制,以便在分布式系统中管理和发现服务实例。默认情况下,Spring Cloud使用Netflix Eureka作为服务注册发现的解决方案,但也支持其他的注册发现实现,如Consul、Zookeeper等。
在Spring Cloud中,服务注册发现的流程如下:
-
服务注册:在服务启动时,服务实例会向注册中心注册自己的信息(如服务名、IP地址、端口号等)。注册中心是一个独立的服务,用于管理所有已注册的服务实例。
-
服务发现:其他服务可以通过向注册中心查询来获取可用的服务列表。注册中心会维护所有已注册服务的信息,并提供查询接口供其他服务使用。
-
负载均衡:服务消费者可以通过负载均衡的方式从服务列表中选择一个可用的服务实例进行访问。Spring Cloud提供了负载均衡的能力,可以根据配置规则选择合适的服务提供者。
-
实例更新与剔除:服务实例在启动和关闭时需要通知注册中心,以便其他服务及时更新服务列表。注册中心会定期检查已注册的服务实例的可用性,如果某个实例长时间未响应或关闭了,注册中心会将其从服务列表中剔除。
操作流程
1.修改父项目的pom
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.blb</groupId>
<artifactId>springcloud_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud_demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>8</java.version>
<spring.cloud-version>Hoxton.SR8</spring.cloud-version>
</properties><!--固定SpringCloud依赖版本-->
<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>
2.创建Eureka服务器项目
修改Eureka模块的pom文件
<parent>
<groupId>com.blb</groupId>
<artifactId>springcloud_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent><dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
修改Eureka服务器模块的配置文件
server.port=8000
# 服务器域名
eureka.instance.hostname=127.0.0.1
# 设置不拉取服务清单
eureka.client.fetch-registry=false
# 设置不注册当前服务
eureka.client.register-with-eureka=false
# 定义注册服务的地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
3. 配置Eureka客户端
修改pom文件,继承父项目并且引入客户端依赖
<parent>
<groupId>com.blb</groupId>
<artifactId>springcloud_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent><dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
修改Eureka客户端模块的配置文件
# 服务名称
spring.application.name=xxxx
# 设置拉取服务清单
eureka.client.fetch-registry=true
# 设置注册当前服务
eureka.client.register-with-eureka=true
# 定义注册服务的地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8000/eureka
在启动类上加@EnableEurekaClient
在RestTemplate配置类方法上加@LoadBalanced
调用服务时修改
Eureka自我保护机制
心跳机制:客户端注册到Eureka服务器后,每隔30s发送心跳包给服务器,如果90s没有发送心跳包,服务器就会把客户端从服务清单剔除
自我保护机制:网络可能出现波动,Eureka服务器发现15分钟内所有客户端正常心跳比例低于85%,Eureka就会把服务清单保护起来不剔除,网络恢复正常后,服务调用就能正常执行。
开发阶段可以关闭自我保护机制,上线阶段一般都要开启
# 关闭自我保护机制
eureka.server.enable-self-preservation=false
总结
通过服务注册发现机制,Spring Cloud可以实现服务之间的动态协调和调用。服务提供者可以独立于服务消费者,使得系统具有较好的弹性和可扩展性。