所有课程的学习及相关资料都是源自b站黑马程序员
感谢黑马程序员给予我们新手的无私帮助,感谢!!!
黑马程序员-----yyds
开始之间我们需要先了解两个比较简单的概念
假设现在有三个服务,分别是服务A、服务B、服务C
1、我们说为其他服务提供接口的服务称为服务提供者。
2、使用其他服务接口的服务称为服务消费者。
3、一个服务是消费者还是提供者是相对另一个服务而言的。
举个简单的例子
现在有一个服务链:服务A调用服务B,服务B调用服务C。
那么可以很明显的得出结论
记得在上个笔记已经说过,可以看出,所有的URL映射都是通过硬编码来实现的,也就是说每个URL需要程序员亲自写在代码里面,服务少还可以接受,但是如果服务达到了恐怖的集群环境,单单靠人力这已经是一个非常大的工作量了,而且及其不容易维护,这也是远程调用所带来的问题之一。
而且硬编码还会引发另一个,我们说过,一个微服务是不一定只存在一个实例,就像一个类不可能只存在一个实例一样,那可能就有人问,一个实例不是很好吗,整那么多维护起来不是更麻烦吗。
但是烦请你们想一想,如果这个服务实例挂了怎么办,那岂不是说这个服务无法为其他服务提供服务接口,然后让程序员发布更新公告,等夜深人静的时候去修服务器?
别开玩笑了,这样子岂不是更累,而且给用户的体验是及其不好的。而多实例可以为我们预防这种突发情况,如果服务A的实例1挂了,但是我们还有实例2,照样可以继续进行,这个时候我们想什么时候修实例都可以。
而且多实例也可以满足负载均衡的条件,防止一个实例承受过大的并发请求,提高响应速度。
回到我们的主题,那这和硬编码又有什么关系呢。我们再看看我们写的代码
你会发现我们把端口写死了,如果8081端口的实例挂了怎么办,我们又要去修改代码?我们又怎么做到多实例端口的读取呢?我们又要怎么监控知道哪个端口实例挂了?我们要怎么做到实例切换和负载均衡呢?
所有的这些问题,SpringCloud为我们提供了一个组件——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拉取服务实例列表的时候,就不会获取到哪些已经挂掉的服务实例了。
最后,我们将上面遗留的问题解决一下:
在原有的大项目上再创建一个module项目,这个项目名字就叫eureka-server
找到我们新创建的eureka-server项目,点击里面的pom.xml
我们引入eureka-server的相关maven依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
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服务了。
接着在浏览器里面输入:localhost:10086
回车,我们就可以看到eureka的主页面了。
我们可以看到注册到eureka的实例是空列表,这个时候我们可以试试将eureka-server自己配置上去
修改下面的结果为true后重新运行,刷新页面就可以看到结果了
服务注册和上面的eureka的注册功能类似,我们可以尝试将user-service与order-service注册上去
user-service的注册
进入它的pom.xml文件里面,加入下面的依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
进入它的application.yml文件,我们加入下面的信息
然后进入UserApplication.java文件
对于order-service的配置也是同理,只不过需要将order-service内的application.yml文件里面的name修改为:orderservcie
刷新eureka的实例列表,发现已经注册上来了
我们希望order-service可以基于user-service的应用名称进行拉取所有相关的实例列表。
我们需要配置一下user-service的内容,可以多实例运行
刷新浏览器就可以看到两个实例了
现在order-service要访问多个实例的user-service,所以要给order-service配置上负载均衡,如下
最后,我们就需要修改我们写死的IP和端口, 因为现在全程都由eureka接管了,我们只需要写入注册在eureka的服务名称就可以了,如下文件
打开浏览器,现在我们重新访问以前请求获取订单数据的URL
我们多试几个
其实看这六次的访问日志可以看出,每个实例都承受了三次访问,所以可以猜测springCloud里面的默认负载均衡模式是轮询
那具体是什么需要后期看源码
这期的eureka笔记就写到这里
共勉
给个三连不过分吧,感谢~