
目录一. 什么是服务提供者与服务消费者二. Eureka注册中心简单介绍三. Eureka注册中心的作用四. 搭建Eureka注册中心4.1 第一步创建微服务项目引入 EurekaServer 依赖4.2 第二步启动类添加 EnableEurekaServer 注解开启 Eureka 注册中心功能4.3 第三步在 EurekaServer 模块中编写 application.yml 文件五. Eureka注册中心实现服务注册5.1 第一步引入 EurekaServer 客户端依赖5.2 第二步在对应业务模块中编写 application.yml 文件六. Eureka是AP还是CP6.1 什么是CAP6.2 Eureka是AP。6.3 Eureka是如何保证AP的6.4 什么是Eureka的自我保护模式这两天开始了我的Java实习生活今天2023年6月27日因为大部分实习生还没有到公司应主管要求给我们几个来得早的实习生分配了一个小任务让我们趁这几天自己搭建做一个小型微服务分布式小系统所以自己也是边学边整理将遇到的问题及知识点整理概括方便日后复习观看。相比说起了微服务大多数在校生或许会觉得他遥不可及或者觉得它比较难。但是现在绝大多数互联网企业几乎都在使用分布式系统。而在微服务框架中SpringCloud 是绝大多数企业最为广泛使用的一个微服务框架所以学习和了解 SpringCloud 对我们来说非常重要对于我们以后面试找工作也是一个很大的加分项。OK下面开始正文一. 什么是服务提供者与服务消费者我们需要知道微服务就是把一个项目拆分成很多功能模块。举例一个电商项目我们可以把它拆分成多个模块比如用户模块商家模块等等。各个模块中只负责自己的那一部分功能别的功能无需关心。当一个模块需要另一个模块中的某个功能时我们只需要让被调用的模块暴露自己的业务接口即可调用者称为服务消费者被调用者称为服务提供者。但是这都只是相对而言的比如说服务A调用了服务B服务B又调用了服务C这时B又是什么角色呢很明显服务B相对于服务A来说是服务提供者服务B相对于服务C来说是服务消费者。因此总结上面所举的例子我们可以得出以下结论1服务提供者暴露接口给其他微服务调用。2服务消费者调用其他微服务提供的接口。3提供者与消费者是相对而言的。4一个服务既可以是提供者又可以是消费者。二. Eureka注册中心简单介绍看下面两张图片order-service是我们微服务项目中的一个订单模块里面含有一个查询订单信息的方法user-service是我们微服务项目中的一个用户模块里面包含了一个查询用户信息的方法。假设现在某位用户要查询某条订单信息而订单信息中又包含了用户信息那么order-service订单模块和user-service用户模块这两个模块之间一定是有调用关系的。但是由于我们已经将他们拆分成了独立的模块它不像单体项目那样是无法直接进行调用的微服务项目中的远程调用大多是以发送http请求的方式来调用其他业务模块的方法但现在问题又来了我们已经对微服务做了拆分从理论上讲我们的订单模块根本就不知道用户模块的存在更无从谈起调用用户模块中的方法了。而且我们如果对user-service模块再做一个集群现在有三个user-service模块order-service又是怎么知道该调用哪一个user-service模块呢这里就需要说到我们的重点了它就是Eureka注册中心看下图当我们加入了eureka注册中心之后(这里eureka注册中心也是一个微服务模块只是没有业务方法但也需要独立出来)在Eureka模块中的pom.xml文件中引入Eureka服务端依赖然后在每个微服务项目中引入Eureka客户端依赖重启项目。它就会把这个分布式项目中所有的模块都记录下来都登记一下名字因为上面我们说到了每一个模块都既有可能是服务提供者也有可能是服务消费者我们将他们全部都登记下来这样当某个模块需要调用另一个模块时它只需要向eureka要就行了看看eureka中有没有。如图中所示order-service从eureka-service中拉取出自己需要的信息即可。这里还有一个问题不知道各位想到了没有假设order-service挑中了localhost8081端口的user-service但是localhost8081端口的user-service业务出现了故障无法对外正常服务怎么办这里就要提到Eureka的另一个功能心跳监控当一个模块被注册到eureka注册中心之后它每隔30秒就会向eureka注册中心发送一次请求好比是心脏跳动每隔30秒跳动一次来向eureka证明自己还在正常运作没有出现故障。如下图所示当一个功能模块没有向eureka发送心跳请求时eureka就会认为它出现故障了然后会将它从注册列表中提出如下图所示假设localhost8083服务出现故障挂掉了此时eureka-service中就会剔除localhost8083这样出现故障的业务就不会被其他业务调用避免了将错误扩大化。三. Eureka注册中心的作用四. 搭建Eureka注册中心上面理论讲解完毕下面我们开始进行实战实际操作配置EurekaServer服务端搭建EurekaServer分为三步4.1 第一步创建微服务项目引入 EurekaServer 依赖!--eureka服务端-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-netflix-eureka-server/artifactId /dependency4.2 第二步启动类添加 EnableEurekaServer 注解开启 Eureka 注册中心功能4.3 第三步在 EurekaServer 模块中编写 application.yml 文件server: port: 10086 # 服务端口 spring: application: name: eurekaserver # eureka的服务名称 eureka: client: service-url: # eureka的地址信息 defaultZone: http://localhost:10086/eureka这里简单说一下配置是干什么的server.port 是配置Eureka的服务端门口spring.application.name 是给我们的这个模块的微服务起名称eureka.client.service-url 要配置我们的Eureka信息因为Eureka本身也是微服务的一部分所以要把自己也注册到微服务中去这里我只写了一个Eureka但实际上我们会建立一个Eureka集群然后集群之间互相注册。完成上述三步我们即可启动启动成功如下所示在ider中当启动成功之后我们点击左侧EurekaServer后面的端口10086或者在自己的浏览器网址输入localhost:10086,即可跳转至对应页面我们点进去看一下可以有一部分人会看不懂啊这里只看我红线圈出来的部分即可那句英语翻译过来就是“注册到EurekaServer”的实例。这里可能会有人有疑问什么是实例一个服务每给它部署一个它就是一个实例EurekaServer会记录所有的实例但现在我们只部署了一个EurekaServer没有部署别的实例所以上面显示只有一个实例如上图中所示Application就是服务的实例名称。Status就是服务的IP地址和端口。五. Eureka注册中心实现服务注册OK上面我们已经将EurekaServer配置完成接下来我们实现服务注册关于服务配置只需要两步就够了。刚才我们配置EurekaServer引入的依赖是EurekaServer的服务端接下来我们注册需要引入EurekaServer的客户端引入的依赖与刚才略有差别各位小伙伴要注意5.1 第一步引入 EurekaServer 客户端依赖!--eureka客户端依赖-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-netflix-eureka-client/artifactId /dependency5.2 第二步在对应业务模块中编写 application.yml 文件内容如下所示spring: application: name: userservice eureka: client: service-url: # eureka的地址信息 defaultZone: http://127.0.0.1:10086/eureka配置成功如图所示打开自己电脑的浏览器输入localhost:10086查看我们可以得到如下图片中的情况可以看到user-service和eureka-service已经启动成功了。同理我们也可以按照同样的方法启动order-service第一步向order-service项目中添加依赖!--eureka客户端依赖-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-netflix-eureka-client/artifactId /dependency第二步编写order-service业务模块的application.yml文件这里我就不展示了。完成上述两步之后启动order-service模块打开浏览器输入localhost:10086查看得到如下结果可以看到order-service模块和user-service模块都已经启动成功了。但这里大家要注意其实每个模块的服务实力都是一个列表正常情况下都不止一个但我这里只列举了一个那么我也来试着展示一下列表的情况吧很简单我们来看只需要在已经启动某个模块上单击右键点击复制配置这里我下载了中文补丁正常情况下为 Copy Configuration点击了 Copy Configuration 之后,就会出现下面这个框框、这里修改一下名称不要和刚才的一样避免冲突还有一个需要修改的就是虚拟机选项这里填写为 -Dserver.port8082被复制的模块端口号为8081所以新复制的不能与被复制的端口号一样否则会端口冲突这里需要修改我修改的是8082其实改成什么都可以只要是一个空闲端口。修改后如下图所示点击应用点击确认然后启动这个复制的模块打开浏览器输入localhost:10086即可看到下图种情况这时我们可以清楚的看到USERSERVICE后面是两个端口分别是8081和8082。六. Eureka是AP还是CP6.1 什么是CAPCAP原则又称CAP定理指的是在一个分布式系统中一致性Consistency、可用性Availability、分区容错性Partition tolerance。在实际运作过程中通常这三者很难无法同时达到由于网络硬件肯定会出现延迟丢包等问题但是在分布式系统中我们必须保证部分网络通信问题不会导致整个服务器集群瘫痪另外即使分成了多个区当网络故障消除的时候我们依然可以保证数据一致性所以我们必须保证分区容错性。至于剩下的一致性和可用性我们则需要二选一鱼和熊掌不可兼得假设我们选择一致性那我们就不能让用户访问无法进行数据同步的机器毕竟该机器上的数据和其他正常机器上的不一致但是这样我们就丢弃了可用性违背了一致性Consistency的要求只满足可用性和分区容错即AP假设我们选择可用性那我们就可以让用户访问无法进行数据同步的服务器虽然保证了可用性但是我们无法保证数据一致性。违背了可用性Availability的要求只满足一致性和分区容错即CP6.2 Eureka是AP。Eureka在设计时就优先保证可用性。Eureka的AP结构选择了高可用和分区容错性。假如我们Eureka服务中某个节点服务宕机了依然可以向系统提供服务不过它的数据就不能保证是同步的了失去了C属性。Eureka就是一个AP架构的例子当Eureka客户端心跳消失的时候那Eureka服务端就会启动自我保护机制不会剔除该EurekaClient客户端的服务依然可以提供需求所以Eureka是AP机制。6.3 Eureka是如何保证AP的eureka在设计时的分区容错保证了eureka各个节点都是平等的只要不是所有节点都挂掉eureka就可以正常注册与使用几个节点挂掉不会影响正常节点的工作剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败则会自动切换至其它节点只要有一台Eureka还在就能保证注册服务可用保证可用性只不过查到的信息可能不是最新的不保证强一致性。6.4 什么是Eureka的自我保护模式eureka server自我保护模式指的是如服务长时间没有收到心跳导致未能及时续约会等待修复而不是服务剔除是一种针对网络异常波动的安全措施能够保证服务的高可用。自我保护模式情况下如果该服务长时间未能收到心跳而导致服务过期eureka server仍然能够接收新的服务注册和查询但不会同步到其他节点上当前节点依然可用网络稳定后新注册的信息会被同步到其他节点中。