SpringCloud使用Eureka作为服务治理中心
前言
我们在进行开发分布式架构的系统时,有一个不可或缺的工具那就是服务治理组件,我们可以通过它来实现服务的注册、发布和调用,可以理解为它维护着我们所有服务的花名册。目前主流的服务治理中心有Zookeeper
、Eureka
、Nacos
等,本篇博客这里我想和大家介绍一下服务治理组件—Eureka
的原理和使用。
Nacos的使用可以参考我的博客:Nacos服务治理中心和配置中心
正文
Eureka
Eureka是一项基于REST
的服务,主要在AWS
云中用于定位服务,以实现负载均衡和中间层服务器的故障转移。它是微服务框架中最核心和最基础的模块,它主要用来实现微服务实例的自动化注册与发现。
Eureka由2个部分组成:服务端发现组件 和 客户端发现组件:
- 客户端通过注解的方式嵌入程序中,服务器和客户端之间会进行周期性心跳检测 ,如果心跳不存在时,该服务节点会从服务注册表中移除。并且我们要知道
Eureka
的心跳检测是基于SpringBoot Actuator
来实现的 - 各个服务节点 通过注册中心得注册信息以
Rest
方式来实现调用。
Eureka的三种角色:服务注册中心、服务提供者、服务消费者,事实上一个结点既可以是服务提供者 、也可以是服务消费者。
SpringCloud使用Eureka作为服务治理中心
Eureka Server 的搭建
Maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
</parent>
<dependencies>
<!--除去springboot自带的日志-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- log4j -->
<!--添加log4j2的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!--spring boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!--加入Spring Cloud 的Dalston版本的配置依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
application.properties:配置文件
server.port=8761
###eureka配置
eureka.instance.hostname=localhost
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=80
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${ eureka.instance.hostname}:${ server.port}/eureka/
eureka.server.enable-self-preservation=false
各配置项说明:
eureka.instance.hostname
:应用实例主机名,一般结合linux
的hostname
中配置映射关系。eureka.client.registry-fetch-interval-seconds
:表示eureka client
间隔多久去拉取服务注册信息,默认为30秒,对于api-gateway
,如果要迅速获取服务注册状态,可以缩小该值,比如5秒eureka.instance.lease-expiration-duration-in-seconds
:表示eureka server
至上一次收到client
的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance
。eureka.client.register-with-eureka
:禁止自己当做服务注册,当单节点eureka server
时选择false
。eureka.client.fetch-registry
:表示是否从eureka server
获取注册的服务信息,当单节点eureka server
时选择false
。eureka.client.service-url.defaultZone
:eureka
服务器的地址,如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。eureka.server.enable-self-preservation
,是否允许开启自我保护模式,缺省:true
,当eureka
服务器在短时间内丢失过多客户端时,自我保护模式可使服务端不再删除失去连接的客户端。在开发调试过程中选择false
,避免客户端节点重新启动后无法被刷新。
更多参数可参考:https://www.cnblogs.com/zyon/p/11023750.html
SpringCloudGovernanceApp:启动类
@Slf4j
@EnableEurekaServer //这个注解实现服务器端
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class})
public class SpringCloudGovernanceApp extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SpringCloudGovernanceApp.class);
}
public static void main(String[] args) {
SpringApplication.run(SpringCloudGovernanceApp.class, args);
log.info("======服务已经启动========");
}
}
验证
启动项目后:访问Eureka的控制台 http://127.0.0.1:8761/
Eureka Client的搭建
Maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
</parent>
<dependencies>
<!--除去springboot自带的日志-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- log4j -->
<!--添加log4j2的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!--spring boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!--加入Spring Cloud 的Dalston版本的配置依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
application.properties:配置文件
server.port=8080
spring.application.name=springcloud-demo-producer
#eureka
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/
eureka.client.availability-zones.localhost=http://localhost:8761/eureka/,http://localhost:8762/eureka/
eureka.client.registry-fetch-interval-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=80
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.prefer-ip-address=true
各配置项说明:
eureka.client.service-url.defaultZone
:eureka
服务器的地址,如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。eureka.client.availability-zones.localhost
:在多机房的时候启动,比如服务A调用服务B,可以实现A服务优先访问同机房的服务B,避免跨机房影响访问时间。eureka.client.registry-fetch-interval-seconds
:表示eureka client
间隔多久去拉取服务注册信息,默认为30秒,对于api-gateway
,如果要迅速获取服务注册状态,可以缩小该值,比如5秒。eureka.instance.lease-expiration-duration-in-seconds
:表示eureka server
至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance
。eureka.instance.lease-renewal-interval-in-seconds
:表示eureka client
发送心跳给server端的频率。eureka.instance.prefer-ip-address
:就可以将IP注册到eureka server
上,而如果不配置就是机器的主机名。这样可以实现通过公网实现服务调用。
更多参数可参考:https://www.cnblogs.com/zyon/p/11023750.html
SpringCloudProducerApp:启动类
@Slf4j
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class},scanBasePackages = "com.luo")
@EnableDiscoveryClient
@EnableEurekaClient
@EnableCircuitBreaker
public class SpringCloudProducerApp extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SpringCloudProducerApp.class);
}
public static void main(String[] args) {
SpringApplication.run(SpringCloudProducerApp.class, args);
log.info("======服务已经启动========");
}
}
验证
启动项目后:刷新Eureka的控制台 http://127.0.0.1:8761/