【SpringCloud微服务笔记06】服务注册与发现框架Eureka

目录

一、什么是服务注册发现

二、Eureka简介

2.1 Eureka的工作原理

2.2 服务消费者与服务提供者

三、搭建Eureka服务端

3.1 使用SpringCloud官网的IO创建Eureka Server项目

3.2 解压,导入IDEA

3.3、在启动类中添加注解@EnableEurekaServer

3.4 修改文件后缀名,配置eureka信息

3.5、Eureka server启动测试

 四、搭建Eureka客户端

4.1 创建过程同server类似

4.2 添加注解(同Eureka server)

 4.3 修改文件后缀名,配置eureka信息

五、启动实例

六、搭建Eureka高可用集群

        6.1 修改hosts文件,添加主机映射

        6.2 Eureka Server 的高可用

         6.3 Eureka Client

        6.4 启动集群测试



一、什么是服务注册发现

我们先来看下什么是服务注册与服务发现?

服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consul)。

服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。

可以理解为:

  1. //服务注册

  2. NameServer->register(newServer); 

  3. //服务发现

  4. NameServer->getAllServer();

二、Eureka简介

        Eureka是Netflix公司开发的服务注册与发现框架,SpringCloud将Eureka集成到子项目Spring-Cloud-Netflix中实现服务注册与发现功能,

2.1 Eureka的工作原理

        SpringCloud框架下的服务注与发现框架Eureka包含两个组件,分别是Eureka Server和Eureka Client 

  • Eureka Server:服务注册发现服务器,也称为服务注册中心,各个服务启动后,会在Eureka Server中进行注册,这样Eureka Server 的服务注册表中将会存储所有可用服务节点的信息。
  • Eureka Client :也称为服务,作为一个Java客户端,用于简化与Eureka Server的交互。Eureka Client内置一个使用轮询负载算法的负载均衡器。服务启动后,Eureka Client 将会向Eureka Server发送心跳更新服务,如果Eureka Server 在多个心跳周期内(默认90秒)没有接收到某个服务的心跳,Eureka Server 就将会从服务注册表中把这些服务节点移除

为了方便我们去理解,如图例所示:

        

如图例所示,Eureka Client注册在Eureka Server ,Eureka Client 中的服务是通过REST方法调用的。并且Eureka Client还具有缓存功能,它能够从Eureka Server 查询到当前注册的服务信息并缓存在本地。这样即使Eureka Server宕机,Eureka Client也依然可以利用缓存中的信息调用服务。

2.2 服务消费者与服务提供者

        Eureka Client存在两种角色,分别是服务消费者和服务提供者

  • 服务消费者:用于获取Eureka Server注册的服务清单,并且该服务清单默认每隔30秒更新一侧。服务消费者获取到服务清单后,能够根据自己的需求决定调用哪个服务,默认采用轮询方式调用,从而实现Eureka Client的负载均衡。
  • 服务提供者:Eureka Client 启动后,服务提供者会通过REST请求将自己注册在Eureka Server中,并维护一个心跳进行 服务续约,告诉Eureka Server自己还”存在,防止被Eureka Sever 将该服务从服务列表中剔除。

   

        服务提供者和服务消费者都会将自己的信息通过REST的形式提交给Eureka Server 服务消费者注册后,还会获取一份服务注册列表,其中包含了所有向Eureka Server注册的服务信息。服务消费者就会根据服务提供者的IP地址,通过HTTP远程调用服务提供者的服务。

        注:服务提供者和消费者,即一个服务既可以是提供者也可以是消费者。

三、搭建Eureka服务端

3.1 使用SpringCloud官网的IO创建Eureka Server项目

 点击下方的GENERTATE,得到一个下载好的以.zip结尾的压缩包

3.2 解压,导入IDEA

 创建完后的工程的pom.xml文件如下:

<?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.7.10</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>2021.0.6</spring-cloud.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</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>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

3.3、在启动类中添加注解@EnableEurekaServer

添加@EnableEurekaServer这句注解

3.4 修改文件后缀名,配置eureka信息

        eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下erureka server也是一个eureka client ,必须要指定一个 server。将application.approperties文件修改为application.yml为文件,并添加下列信息

server:
  port: 7000    #配置端口号
spring:
  application:
    name: eureka-server     #指定用户名
eureka:
  client:
    fetch-registry: false  #是否向eureka server注册
    fetch-with-eureka: false #是否从eureka server中拉取信息
    service-url:
      defaultZone: http://localhost:${server.port}/eureka #可以使用${}获取yml中配置的值
  instance:
    hostname:  localhost 

3.5、Eureka server启动测试

通过启动类进行启动,项目一切正常的情况下会控制台开头显示如下信息:

此时通过打开浏览器访问htttp://localhost:7000是有界面的,显示如下:

Eureka

测试成功!!!

 四、搭建Eureka客户端

当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。Eureka客户端有服务消费者和服务提供者两种,因此应该创建两个

4.1 创建过程同server类似

同样的方法创建provider和consumer

注意自己使用的jdk版本,并且一定要用maven创建 ,Spring boot越低越好,但一定同Eureka server相匹配!

创建完pom.xml如下:

<?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.7.10</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo-provider</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo-provider</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>2021.0.6</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>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</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>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

4.2 添加注解(同Eureka server)

向启动类中添加注解@EnableEurekaClient

 4.3 修改文件后缀名,配置eureka信息

同Eureka Server修改文件后缀名,由于客户端包含消费者和提供者,所以应添加如下信息:

Eureka-consumer配置

server:
  port: 7002
spring:
  application:
    name: eureka-consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7000/eureka
  instance:
    prefer-ip-address: true
    hostname:  localhost    #???

Eureka-provider配置

server:
  port: 7006
spring:
  application:
    name: eureka-provider
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7000/eureka
  instance:
    hostname:  localhost  

五、启动实例

上次的测试只是验证Eureka server端是否配置成功,这次是总的验证

分别启动Eureka Server ,Eureka Client(服务提供者,服务消费者)

访问http://localhost:7000,效果如下:

由图可见多了consumer和provider两个,实例启动成功!

六、搭建Eureka高可用集群

        之所以进行eureka集群的搭建,在于我们平时的生产环境中,很难保证单节点的eureka服务能提供百分百不间断的服务,如果eureka无响应了,整个项目应用都会出现问题,因此要保证eureka随时都能提供服务的情况下,最好的方式就是采用eureka的集群模式,也就是搭建eureka的高可用,在eureka的集群模式下,多个eureka server之间可以同步注册服务,因此,在一个eureka宕掉的情况下,仍然可以提供服务注册和服务发现的能力,从而达到注册中心的高可用。

  Eureka高可用集群图解如下:

6.1 修改hosts文件,添加主机映射

hosts文件位置:C:\Windows\System32\drivers\etc\hosts

127.0.0.1 server1
127.0.0.1 server2

6.2 Eureka Server 的高可用

参见上述eureka服务端的搭建,生成两个Eureka Server项目,将它们的项目名称分别命名为demo-server ,demo-server-another,其中application.yml文件配置如下:

demo-server:

server:
  port: 7000    #配置端口号
spring:
  application:
    name: eureka-server     #指定用户名
eureka:
  client:
    fetch-registry: false  #是否向eureka注册
    fetch-with-eureka: false
    service-url:
      defaultZone: http://server2:7006/eureka
  instance:
    hostname:  server1   

eureka-server-another:

server:
  port: 7006    #配置端口号
spring:
  application:
    name: eureka-server-another     #指定用户名
eureka:
  client:
    fetch-registry: false  #是否向eureka注册
    fetch-with-eureka: false
    service-url:
      defaultZone: http://server1:7000/eureka
  instance:
    hostname:  server2

 
6.3 Eureka Client

参见上述eureka客户端的搭建,生成三个Eureka Client,将它们的项目名称分别命名为eureka-provider ,eureka-provider-another,eureka-consumer 其中application.yml文件的配置如下:


Eureka-provider

server:
  port: 7002    #配置端口号
spring:
  application:
    name: eureka-provider     #指定用户名
eureka:
  client:
    fetch-registry: false  #是否向eureka注册
    fetch-with-eureka: false
    service-url:
      defaultZone: http://localhost:7000/eureka

 Eureka-provider-another

server:
  port: 7007    #配置端口号
spring:
  application:
    name: eureka-provider-another     #指定用户名
eureka:
  client:
    fetch-registry: false  #是否向eureka注册
    fetch-with-eureka: false
    service-url:
      defaultZone: http://localhost:7006/eureka

Eureka-consumer

server:
  port: 7008    #配置端口号
spring:
  application:
    name: eureka-consumer     #指定用户名
eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      defaultZone:
         http://server1:7000/eureka,http://server2:7006/eureka

6.4 启动集群测试

依次启动Eureka Server,两个服务提供者,一个服务消费者,无论访问哪个Eureka Server注册实例都是一样,其效果如下:

 测试成功 !!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值