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

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

文章目录

  • 一、服务消费者和服务提供者
  • 二、Eureka简介与原理
    • 2.1、服务远程调用带来的问题
    • 2.2、Eureka的原理
  • 三、Eureka服务环境搭建
  • 四、Eureka服务注册
  • 五、Eureka服务发现

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

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

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

举个简单的例子

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

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

《SpringCloud》笔记四:注册中心——Eureka组件_第1张图片

二、Eureka简介与原理

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

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

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

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

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

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

《SpringCloud》笔记四:注册中心——Eureka组件_第2张图片

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

《SpringCloud》笔记四:注册中心——Eureka组件_第3张图片

《SpringCloud》笔记四:注册中心——Eureka组件_第4张图片

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

2.2、Eureka的原理

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

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

《SpringCloud》笔记四:注册中心——Eureka组件_第5张图片

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

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

《SpringCloud》笔记四:注册中心——Eureka组件_第6张图片

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

《SpringCloud》笔记四:注册中心——Eureka组件_第7张图片

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

《SpringCloud》笔记四:注册中心——Eureka组件_第8张图片

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

《SpringCloud》笔记四:注册中心——Eureka组件_第9张图片
对于哪些已经挂掉的服务实例,那么Eureka就会将它从列表中剔除,这个时候服务消费者再次向Eureka-server拉取服务实例列表的时候,就不会获取到哪些已经挂掉的服务实例了。

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

《SpringCloud》笔记四:注册中心——Eureka组件_第10张图片

三、Eureka服务环境搭建

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

《SpringCloud》笔记四:注册中心——Eureka组件_第11张图片
《SpringCloud》笔记四:注册中心——Eureka组件_第12张图片

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

《SpringCloud》笔记四:注册中心——Eureka组件_第13张图片

<dependencies>
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
    dependency>
dependencies>

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

创建相关包、文件和类

《SpringCloud》笔记四:注册中心——Eureka组件_第14张图片

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-serverapplication.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服务了。

《SpringCloud》笔记四:注册中心——Eureka组件_第15张图片
启动的eureka-server服务成功

在这里插入图片描述

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

《SpringCloud》笔记四:注册中心——Eureka组件_第16张图片

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

在这里插入图片描述

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

《SpringCloud》笔记四:注册中心——Eureka组件_第17张图片

《SpringCloud》笔记四:注册中心——Eureka组件_第18张图片

四、Eureka服务注册

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

user-service的注册

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

在这里插入图片描述

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>

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

《SpringCloud》笔记四:注册中心——Eureka组件_第19张图片

然后进入UserApplication.java文件

《SpringCloud》笔记四:注册中心——Eureka组件_第20张图片

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

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

《SpringCloud》笔记四:注册中心——Eureka组件_第21张图片

五、Eureka服务发现

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

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

《SpringCloud》笔记四:注册中心——Eureka组件_第22张图片

《SpringCloud》笔记四:注册中心——Eureka组件_第23张图片

《SpringCloud》笔记四:注册中心——Eureka组件_第24张图片

《SpringCloud》笔记四:注册中心——Eureka组件_第25张图片

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

《SpringCloud》笔记四:注册中心——Eureka组件_第26张图片
现在order-service要访问多个实例的user-service,所以要给order-service配置上负载均衡,如下

《SpringCloud》笔记四:注册中心——Eureka组件_第27张图片

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

《SpringCloud》笔记四:注册中心——Eureka组件_第28张图片
重新运行order-service项目

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

我们多试几个

《SpringCloud》笔记四:注册中心——Eureka组件_第29张图片
从101 试到 106,我们看看结果都是正常的

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

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

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

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

你可能感兴趣的:(#,SpringCloud,eureka,java,springCloud,微服务)