《SpringCloud》笔记四:注册中心——Eureka组件

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

所有课程的学习及相关资料都是源自b站黑马程序员 感谢黑马程序员给予我们新手的无私帮助,感谢!!! 黑马程序员-----yyds

@[toc]

一、服务消费者和服务提供者

开始之间我们需要先了解两个比较简单的概念 假设现在有三个服务,分别是服务A、服务B、服务C

1、我们说为其他服务提供接口的服务称为服务提供者。 2、使用其他服务接口的服务称为服务消费者。 3、一个服务是消费者还是提供者是相对另一个服务而言的。

举个简单的例子

现在有一个服务链:服务A调用服务B,服务B调用服务C。 那么可以很明显的得出结论

  • 服务A是 服务消费者
  • 服务C是 服务提供者
  • 服务B相对于服务A而言,是服务提供者,服务B相对于服务C而言,是服务消费者

在这里插入图片描述

二、Eureka简介与原理

2.1、服务远程调用带来的问题

在这里插入图片描述 记得在上个笔记已经说过,可以看出,所有的URL映射都是通过硬编码来实现的,也就是说每个URL需要程序员亲自写在代码里面,服务少还可以接受,但是如果服务达到了恐怖的集群环境,单单靠人力这已经是一个非常大的工作量了,而且及其不容易维护,这也是远程调用所带来的问题之一。

而且硬编码还会引发另一个,我们说过,一个微服务是不一定只存在一个实例,就像一个类不可能只存在一个实例一样,那可能就有人问,一个实例不是很好吗,整那么多维护起来不是更麻烦吗。

但是烦请你们想一想,如果这个服务实例挂了怎么办,那岂不是说这个服务无法为其他服务提供服务接口,然后让程序员发布更新公告,等夜深人静的时候去修服务器?

别开玩笑了,这样子岂不是更累,而且给用户的体验是及其不好的。而多实例可以为我们预防这种突发情况,如果服务A的实例1挂了,但是我们还有实例2,照样可以继续进行,这个时候我们想什么时候修实例都可以。 而且多实例也可以满足负载均衡的条件,防止一个实例承受过大的并发请求,提高响应速度。

回到我们的主题,那这和硬编码又有什么关系呢。我们再看看我们写的代码

在这里插入图片描述

你会发现我们把端口写死了,如果8081端口的实例挂了怎么办,我们又要去修改代码?我们又怎么做到多实例端口的读取呢?我们又要怎么监控知道哪个端口实例挂了?我们要怎么做到实例切换和负载均衡呢?

在这里插入图片描述

在这里插入图片描述

所有的这些问题,SpringCloud为我们提供了一个组件——Eureka,我们习惯地称它为注册中心

2.2、Eureka的原理

1、首先我们要明白,Eureka是分为两种环境的,也就是Eureka-server(服务端),和      Eureka-client(客户端)

2、Eureka-server的作用:记录和管理这些服务及其实例

在这里插入图片描述

在SpringCloud里面引入了Eureka组件后,当user-service的每一个实例启动的时候,就会做一件事情:将自己的信息注册到Eureka-server上,Eureka记录名字和相关IP和端口

当然Eureka-server也会记录服务消费者的每一个实例信息,因为只要是微服务,都有可能在未来成为服务提供者。

在这里插入图片描述

那么这个时候,相对于服务消费者而言,现在我要获取服务提供者的相关IP和端口信息,那么这个时候,服务消费者就不会直接去找服务提供者索要,而是将请求信息发送给Eureka-server,问问它有没有我所需要的服务信息。如果Eureka-server上存在相关的服务实例信息,则将服务状态健康的发送给服务消费者。

在这里插入图片描述

那如果服务消费者发现Eureka-server给它的实例有多个,那它该挑哪一个进行访问呢?这个时候就需要用到负载均衡的原理来进行访问(轮询?随机?...

在这里插入图片描述

那可能这个时候又有人问了,我访问的服务实会不会是已经挂掉的? 其实并不会,因为对于每个属于Eureka-client的微服务实例而言,每一个实例都会隔一定的周期向Eureka-server发送心跳包(一般是30秒),以确保我自己还活着。

在这里插入图片描述 对于哪些已经挂掉的服务实例,那么Eureka就会将它从列表中剔除,这个时候服务消费者再次向Eureka-server拉取服务实例列表的时候,就不会获取到哪些已经挂掉的服务实例了。

最后,我们将上面遗留的问题解决一下:

在这里插入图片描述

三、Eureka服务环境搭建

在原有的大项目上再创建一个module项目,这个项目名字就叫eureka-server

在这里插入图片描述 在这里插入图片描述

找到我们新创建的eureka-server项目,点击里面的pom.xml 我们引入eureka-server的相关maven依赖

在这里插入图片描述

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>
复制代码

第一次下载可能有点慢,耐心稍等一下。

创建相关包、文件和类

在这里插入图片描述

在==EurekaApplication.java==文件下写入如下代码,作为启动类

package cn.itcast.eureka;

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

// 添加 @EnableEurekaServer 作为Eureka-server的开关
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}

复制代码

在==eureka-server==的==application.yml==文件内加入下面内容

server:
  port: 10086 # 服务的端口
spring:
  application:
    name: eurekaserver # 服务名称,也就是微服务的名称
  freemarker:
    prefer-file-system-access: false
eureka:
  client:
    fetch-registry: false # 是否从eureka-server上拉取服务信息
    register-with-eureka: false  # 是否将自己注册到eureka-server上,默认是true,为true是为了以后的eureka集群
    service-url:
      defaultZone: http://localhost:10086/eureka

复制代码

好,那现在就可以启动我们的eureka-server服务了。

在这里插入图片描述 启动的eureka-server服务成功

在这里插入图片描述

接着在浏览器里面输入:localhost:10086 回车,我们就可以看到eureka的主页面了。

在这里插入图片描述

我们可以看到注册到eureka的实例是空列表,这个时候我们可以试试将eureka-server自己配置上去

在这里插入图片描述

修改下面的结果为true后重新运行,刷新页面就可以看到结果了

在这里插入图片描述

在这里插入图片描述

四、Eureka服务注册

服务注册和上面的eureka的注册功能类似,我们可以尝试将user-service与order-service注册上去

user-service的注册

进入它的==pom.xml==文件里面,加入下面的依赖

在这里插入图片描述

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
复制代码

进入它的==application.yml==文件,我们加入下面的信息

在这里插入图片描述

然后进入==UserApplication.java==文件

在这里插入图片描述

对于order-service的配置也是同理,只不过需要将order-service内的application.yml文件里面的name修改为:orderservcie

刷新eureka的实例列表,发现已经注册上来了

在这里插入图片描述

五、Eureka服务发现

我们希望order-service可以基于user-service的应用名称进行拉取所有相关的实例列表。

我们需要配置一下user-service的内容,可以多实例运行

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

刷新浏览器就可以看到两个实例了

在这里插入图片描述 现在order-service要访问多个实例的user-service,所以要给order-service配置上负载均衡,如下

在这里插入图片描述

最后,我们就需要修改我们写死的IP和端口, 因为现在全程都由eureka接管了,我们只需要写入注册在eureka的服务名称就可以了,如下文件

在这里插入图片描述 重新运行order-service项目

打开浏览器,现在我们重新访问以前请求获取订单数据的URL

我们多试几个

在这里插入图片描述 从101 试到 106,我们看看结果都是正常的

其实看这六次的访问日志可以看出,每个实例都承受了三次访问,所以可以猜测springCloud里面的默认负载均衡模式是轮询

那具体是什么需要后期看源码

这期的eureka笔记就写到这里 共勉

给个三连不过分吧,感谢~

猜你喜欢

转载自juejin.im/post/7084802999201038367