0


微服务组件之Eureka

前言

Eureka是Netflix开发的服务发现的框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。而在我们尝试用的过程中,主要是用这个组件实现服务调用、负载均衡、容错等,实现服务发现与注册。

1.服务的调用关系

在我们学习Eureka组件之前,我们首先要明白,在服务调用的关系中,会有两个不同的角色:

  • 服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其他微服务)
  • 服务消费者:一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口)

在上一篇微服务的服务拆分及远程调用的案例中,是order-service模块在调用user-service的接口,所以我们可以明白user-service和order-service两个模块之间的角色关系,如下图:

但是,服务提供者与服务消费者之间的角色是否是一定不变的呢?在回答这个问题之前,我们先看另外一个问题。

如果服务A调用了服务B,而服务B又调用了服务C,那么服务B的角色是什么?

  • 对于A调用B的业务而言:A是服务消费者,B是服务提供者
  • 对于B调用C的业务而言:B是服务消费者,C是服务提供者

那么对于上面的第一个问题,我们也可以解答出来了。服务提供者和服务消费者之间的角色不是固定不变的,而是相对于业务而言变化的。因此,服务B既可以是服务提供者,也可以是服务消费者。

2. Eureka的原理分析

在了解Eureka的工作原理之前,我们先来思考几个问题。假如我们的服务提供者user-service部署了多个实例,如下图:

那么

  1. 单实例的时候order-service可以用具体的地址来实现,多实例的时候,order-service该如何知道user-service实例的IP地址和端口?
  2. 有多个user-service实例地址,order-service调用的时候该如何选择?
  3. order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

2.1 Eureka的机构和作用

上述的三个问题想要解决,都需要用到SpringCloud中的注册中心,其中最广为人知的注册中心就是Eureka,其结构如下:

上面的图将Eureka的作用展现的很清楚,我们也可以很容易回答之前的三个问题了。

问题1:单实例的时候order-service可以用具体的地址来实现,多实例的时候,order-service该如何知道user-service实例的IP地址和端口?

Eureka获取地址信息的流程如下:

  • user-service服务实例启动后,就会将自己的信息注册到eureka-service(Eureka服务端)。这个叫服务注册
  • eureka-server会保存注册的服务名称到服务实例地址列表的映射关系
  • order-service根据服务名称,拉取实例地址列表。这个叫服务发现或服务拉取

问题2: 有多个user-service实例地址,order-service调用的时候该如何选择?

  • order-service从实例列表中利用负载均衡算法选中一个实例地址
  • 向该实例地址发起远程调用

问题3: order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

  • user-service会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳
  • 当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除
  • order-service拉取服务时,就能将故障实例排除了

注意:一个微服务,既可以服务提供者,又可以是服务消费者,因为eureka将服务注册、服务发现等功能统一封装到了eureka-clien端。

2.2 总结

在Eureka架构中,微服务角色分为两类:EurekaServer(服务端,注册中心)和EurekaClient(客户端),在EurekaClient中又分为Provider(服务提供者)和Consumer(服务消费者)。服务提供者会在启动时,将自己的信息注册到EurekaServer,然后每隔30秒向EurekaServer发送心跳;服务消费者会根据服务名称从EurekaServer拉取服务列表,基于服务列表做负载均衡,选中一个微服务后发起远程调用。

3. 动手实践Eureka功能

根据上面的介绍,我们知道要实现Eureka的功能,主要是分为三步,如下图:

3.1 搭建EurekaServer

注意:首先注册中心服务端:eureka-server,这必须是一个独立的微服务。

3.1.1 创建eureka-server服务

在cloud-demo(这是我的项目名称,你们可以根据自己的实际情况来实现,也可以用前两篇我的代码demo来实现)父工程下,创建一个子模块:

填写子模块信息:

这里需要注意的是,组ID是父类的组ID,下面的工件ID是你的模块名称,这里是可以自动生成,但是如果没有生成的话,自己注意填写一下,别写错了。

3.1.2 引入eureka依赖

引入SpringCloud为eureka提供的starter依赖:

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

这里用到的包是,springCloud下的starter,因为这是springBoot自动装配的包,他已经把eureka的所有配置都准备好了,所以我们可以直接拿来就用,另外我这里并没有加eureka的版本号,是因为我的父工程已经把所有的依赖都准备好了,如果你的父工程没有管理这里部分,你可能需要加上版本号。最后,如果你用的是我提供的demo案例,你可以去父类的pom文件去看,他的版本号来源于spring-cloud-commons-dependencies:

3.1.3 编写启动类

给eureka-server服务编写一个启动类,一定要添加@EnableEurekaServer注解,开启eureka的注册中心功能:

package cn.itcast.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}
3.1.4 编写配置文件

编写一个application.yml文件,内容如下:

server:
  port: 10000
spring:
  application:
    name: eurekaserver
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10000/eureka
3.1.5 启动服务

启动eureka服务,你可以直接点击服务后面的端口号,也可以在浏览http://127.0.0.1:10000

PS:如果你的服务后面没有显示端口号,你可以看看下面这篇文章IDEA(十)2022版本 Services中服务窗口不显示端口号解决

eureka启动成功之后,你可以看到:

3.2 服务注册(user-service)

下面,我们将user-service注册到eureka-server中去:

3.2.1 引入依赖

在user-service的pom文件中,引入下面的eureka-client依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.2.2 配置文件

在user-service中,修改application.yml文件,添加服务名称、eureka服务端地址:

spring:
  application:
    name: userservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10000/eureka

这一步配置完了之后,我们就可以启动user-service了。

PS:在这里配置服务名称的时候注意,你的配置文件如果已经出现了spring的情况下,你直接复制会冲突标红,你可以直接把服务名称加在你原先的spring配置的最后。

3.2.3 启动多个user-service实例

为了演示一个服务多个实例的场景,我们添加一个SpringBoot的启动配置,在启动一个user-service。

首先,复制原来的user-service启动配置:

然后,在弹出的窗口中填写信息:

现在,SpringBoot的服务(service)窗口会出现两个user-service启动配置:

不过,一个是我们之前就启动的端口号为8081的服务,一个是我们刚配置好的,端口号为8082的服务。

启动两个实例:

查看eureka-server管理页面:

3.3 服务发现(order-service)

下面,我们将order-service的逻辑修改:向eureka-server拉取user-service的信息,实现服务发现。

3.3.1 引入依赖

上面有提到,在EurekaClient中又分为Provider(服务提供者)和Consumer(服务消费者),所以服务发现、服务注册统一都是封装在eureka-client依赖,因此这一步与user-service(服务注册)引入依赖时一样。

在order-service的pom文件中,引入下面的eureka-client依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.3.2 配置文件

服务发现也需要知道eureka地址,因此第二步也与user-service(服务注册)一致,都是配置eureka信息:

spring:
  application:
    name: orderservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10000/eureka
3.3.3 服务拉取和负载均衡

最后,我们要去eureka-server中拉取user-service服务的实例列表,并且实现负载均衡。

不过这些动作都不需要我们自己去做,加一些注解即可。

在order-server的启动类OrderApplication中,给RestTemplate这个Bean添加一个@LoadBanlanced(负载均衡)注解

修改order-service服务中cn.itcast.order.service包下的OrderService类中的queryOrderById方法 。修改访问user服务的url路径,用服务名代替ip、端口号:

spring会自动帮我们从eureka-server端,根据userservice这个服务名称,获取实力列表,而后完成负载均衡。

3.4 负载均衡测试

在我们cloud-demo的所有服务都改造完成之后启动,我们可以在eureka的服务界面看见:

下面我们调用一下orderservice的查询方法,看看他是否去调用了userservice服务:

user的信息正常返回,可以看到服务没有问题。

我在这个接口总共调用了8次,在后台的打印日志可以看到8081实例被调用了四次:

8082也被调用了四次:

由此可见,服务的拉取和负载均衡都实现了。

3.5 总结

实现Eureka功能一共分为三步:搭建EurekaServer服务注册服务发现

搭建EurekaServer中又分为三步:

  • 引入eureka-server依赖
  • 添加@EnableEurekaServer注解
  • 在配置文件(application.yml)中配置eureka地址

服务注册中又分为两步:

  • 引入eureka-client依赖
  • 在配置文件(application.yml)中配置本服务的名称和eureka的地址

服务发现中又分为四步:

  • 引入eureka-client依赖(跟服务注册第一步一样)
  • 在配置文件(application.yml)中配置本服务的名称和eureka的地址
  • 给RestTemplate添加@LoadBanlanced(负载均衡)注解
  • 修改调用逻辑,用服务提供者的服务名称远程调用
标签: 微服务 eureka

本文转载自: https://blog.csdn.net/biyifengfei/article/details/140067119
版权归原作者 我欲扶摇九万里 所有, 如有侵权,请联系我们删除。

“微服务组件之Eureka”的评论:

还没有评论