【Spring Cloud】 Eureka 服务注册与发现

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

目录

 

前言

原理解析

  一、Eureka的地位

  二、C-S设计架构

三、架构图

四、三大角色

搭建Eureka环境

一、新建 Eureka Server 的 Module microservicecloud-eureka-7001

二、新建 Eureka Provider Module  microservicecloud-provider-dept-8001

启动项目验证

Eureka 中完善服务信息

一、修改注册服务的名称

 二、actuator 与注册微服务信息完善

 三、Eureka 自我保护

小结


前言

   Eureka是Spring Cloud 全家桶中的一个技术组件。是Netflix的一个子模块,也是核心模块之一。

   它是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册和发现,只需要使用服务的标识符,就可以访问服务,而不需要修改服务调用的配置文件了。功能类似于dubbo的注册中心,比如Zookeeper。

原理解析

  一、Eureka的地位

  Spring Cloud封装了Netflix公司开发的Eureka模块来实现服务注册和发现。 

  二、C-S设计架构

1.Eureka Server:   Eureka采用了C-S的设计架构,Eureka作为服务注册功能的服务器,是服务注册中心。

2.系统中的其他微服务 :使用Eureka的客户端Eureka Client连接到Eureka Server并维持心跳连接。这样系统的维护人员可以通过Eureka Server监控系统中各个微服务是否正常运行。Spring Cloud的一些其他模块(zuul)可以通过Eureka Server发现系统中其他微服务,并执行相关的逻辑。

三、架构图

左边图是Eureka的架构图,对比右边zookeeper的架构图。

image.pngimage.png

Eureka包含两个组件:Eureka Server和Eureka Client

1.Eureka Server 提供服务注册服务

   各个节点启动后,会在Eureka Server中进行注册,Eureka Server中的服务注册表会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

2.Eureka Client 

   是一个java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表把这个服务节点移除(默认90秒)

四、三大角色

  •   Eureka Server  提供服务注册与发现
  •   Eureka Provider (Eureka Client) 服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到
  •   Eureka Consumer(Eureka Client) 服务消费方从Eureka获取注册服务列表,从而能够消费服务。

搭建Eureka环境

    需要建立一个maven项目,在idea或eclipse环境下都可以,建立一个项目microservicecloud,之后进行下面的操作,在pom.xml文件中,引入相应的依赖

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.atguigu.springcloud</groupId>
	<artifactId>microservicecloud</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>


	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
		<junit.version>4.12</junit.version>
		<log4j.version>1.2.17</log4j.version>
		<lombok.version>1.16.18</lombok.version>
	</properties>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.SR1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>1.5.9.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>mysql</groupId>
				<artifactId>mysql-connector-java</artifactId>
				<version>5.0.4</version>
			</dependency>
			<dependency>
				<groupId>com.alibaba</groupId>
				<artifactId>druid</artifactId>
				<version>1.0.31</version>
			</dependency>
			<dependency>
				<groupId>org.mybatis.spring.boot</groupId>
				<artifactId>mybatis-spring-boot-starter</artifactId>
				<version>1.3.0</version>
			</dependency>
			<dependency>
				<groupId>ch.qos.logback</groupId>
				<artifactId>logback-core</artifactId>
				<version>1.2.3</version>
			</dependency>
			<dependency>
				<groupId>junit</groupId>
				<artifactId>junit</artifactId>
				<version>${junit.version}</version>
				<scope>test</scope>
			</dependency>
			<dependency>
				<groupId>log4j</groupId>
				<artifactId>log4j</artifactId>
				<version>${log4j.version}</version>
			</dependency>
		</dependencies>
	</dependencyManagement>
	

</project>

一、新建 Eureka Server 的 Module microservicecloud-eureka-7001

1.引入依赖

<dependencies>
		<!--eureka-server服务端 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka-server</artifactId>
		</dependency>
		<!-- 修改后立即生效,热部署 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
	</dependencies>

2.配置启动项

    建立一个包,在包下面创建Java类 EurekaServer7001_App,并添加相应的注解@EnableEurekaServer @SpringBootApplication

@SpringBootApplication
@EnableEurekaServer // EurekaServer服务器端启动类,接受其它微服务注册进来
@EnableDiscoveryClient //服务发现
public class EurekaServer7001_App
{
	public static void main(String[] args)
	{

		SpringApplication.run(EurekaServer7001_App.class, args);
	}
}

3.配置application.yml文件

server: 
  port: 7001
 
eureka: 
  instance:
    hostname: eureka7001 #eureka服务端的实例名称
  client: 
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://localhost:${server.port}      
   # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
       
  server:  
    # enable-self-preservation: false # 关闭自我保护模式
    eviction-interval-timer-in-ms: 3000

二、新建 Eureka Provider Module  microservicecloud-provider-dept-8001

1.引入依赖 

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

2.启动类 添加注解

@SpringBootApplication
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
public class DeptProvider8001_App
{
	public static void main(String[] args)
	{
		SpringApplication.run(DeptProvider8001_App.class, args);
	}
}

3.配置文件application.yml

eureka:
  client: #客户端注册进eureka服务列表内
    service-url:
      defaultZone: http://localhost:7001/eureka     
  instance:
    instance-id: microservicecloud-dept8001
    prefer-ip-address: true     #访问路径可以显示IP地址
    lease-renewal-interval-in-seconds: 30000
    lease-expiration-duration-in-seconds: 90000

启动项目验证

Eureka Consumer module创建类似 Eureka Provider。先测试服务注册和发现功能:

1.启动 Eureka Server端  microservicecloud-eureka-7001,如下所示

2.启动 Eureka Client端  microservicecloud-provider-dept-8001,如下所示 

Eureka 中完善服务信息

一、修改注册服务的名称

image.png

image.png

 二、actuator 与注册微服务信息完善

1.微服务info内容详细信息修改

(1)本服务pom文件添加依赖:

<!-- actuator监控信息完善 -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-actuator</artifactId>
	</dependency>

(2) 父工程pom文件添加

<build>
		<finalName>microservicecloud</finalName>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<configuration>
					<delimiters>
						<delimit>$</delimit>
					</delimiters>
				</configuration>
			</plugin>
		</plugins>
	</build>	

(3)本服务的application.yml文件修改

info: 
  app.name: atguigu-microservicecloud
  company.name: www.atguigu.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$

(4)效果图 

 三、Eureka 自我保护

image.png

 原因:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存。

image.png

具体的配置如下,在Eureka服务端,禁用Eureka的自我保护模式。

 

设置心跳检测,及时踢出实际未注册的服务 

1.Eureka Server端

在文件application.yml中,添加最下面的两个属性server下面的,关闭自我保护模式

eureka: 
  instance:
    hostname: eureka7002.com #eureka服务端的实例名称
  client: 
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url: 
      defaultZone: http://${eureka.instance.hostname}:${server.port}       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
    

  server:  # 关闭自我保护模式
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 3000

2.Eureka Client 端

在文件application.yml中,添加最下面的两个属性lease开头的

eureka:
  client: #客户端注册进eureka服务列表内
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
  instance:
    instance-id: microservicecloud-dept8001
    prefer-ip-address: true     #访问路径可以显示IP地址
    lease-renewal-interval-in-seconds: 5 # 租约续订间隔时间(默认30秒),如下所示每间隔 5s 向服务端发送一次心跳,证明自己依然"存活"
    lease-expiration-duration-in-seconds: 10 # 租约到期时间(默认90秒),如下所示,告诉服务端如果我 10s 之内没有给你发心跳,就代表我"死"了,将我踢出掉

小结

最后简单对比一下Zookeeper与Eureka:

Zookeeper 保证CP

Eureka 保证AP 

image.png

猜你喜欢

转载自blog.csdn.net/m18633778874/article/details/93875752