【微服务】Eureka注册中心
文章目录
- 前置导入
- Eureka的结构和作用
- 搭建eureka-server
- 创建eureka-server服务
- 引入eureka依赖
- 编写启动类
- 编写配置文件
- 启动服务
- 总结
- 服务注册
- 引入依赖
- 配置文件
- 启动多个user-service实例
- 服务发现
- 引入依赖
- 配置文件
- 服务拉取和负载均衡
前置导入
我们在前文的案例中,我们采取如下的方式发送http请求:
我们将user-service的ip地址和端口硬编码在了代码当中,这样的写法是有一定问题的。我们在公司开发中,可能会面临多个环境,开发环境、测试环境等等,每一次环境的变更可能服务的地址也会发生变化,使用硬编码显然是不明智的选择。
假如我们的服务提供者user-service部署了多个实例形成一个集群,如图:
显然在这种情况下,我们的硬编码也是不明智的。
既然不能使用硬编码,我们不由得思考以下的问题:
- order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
- 有多个user-service实例地址,order-service调用时该如何选择?
- order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?
Eureka的结构和作用
以上的问题都可以使用注册中心Eureke解决。
在Eureka架构中,微服务角色有两类:
- EurekaServer:服务端,注册中心
- 记录服务信息
- 心跳监控
- EurekaClient:客户端
- Provider:服务提供者,例如案例中的user-service
- 注册自己的信息到EurekaServer
- 每隔30s向EurekaServer发送心跳
- consumer:服务消费者,例如案例中的order-service
- 根据服务名称从EurekaServer拉取服务列表
- 基于服务列表做负载均衡,选中一个微服务后发起远程调用
- Provider:服务提供者,例如案例中的user-service
回答之前的各个问题。
问题1:order-service如何得知user-service实例地址?
获取地址信息的流程如下:
- user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端)。这个叫服务注册
- eureka-server保存服务名称到服务实例地址列表的映射关系
- order-service根据服务名称,拉取实例地址列表。这个叫服务发现或服务拉取
问题2:order-service如何从多个user-service实例中选择具体的实例?
- order-service从实例列表中利用负载均衡算法选中一个实例地址
- 向该实例地址发起远程调用
问题3:order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?
- user-service会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳
- 当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除
- order-service拉取服务时,就能将故障实例排除了
- 例如8083现在宕机了:
注意:一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端
接下来我们进行三个方面的实践去体验Eureka注册中心:
搭建eureka-server
首先注册中心服务端:eureka-server,这必须是一个独立的微服务
创建eureka-server服务
在cloud-demo父工程下,创建一个子模块:
填写模块信息:
然后填写服务信息:
引入eureka依赖
引入SpringCloud为eureka提供的starter依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
编写启动类
给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;@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}
编写配置文件
编写一个application.yml文件,内容如下:
server:port: 10086
spring:application:name: eureka-server
eureka:client:service-url: defaultZone: http://127.0.0.1:10086/eureka
这里的name和地址是为了做服务的注册而准备的
name配置的是微服务名称,因为每个服务注册的时候都要带上名字。
defaultZone配置的是微服务的地址
euraka自身就是一个微服务,他自己也要进行注册。这是为了以后Eureka集群之间进行通信用的。比方说我启动了三个Eureka,那么三个Eureka之间会相互做注册,这样他们就可以做数据交流了。这个时候的defaultZone会配置集群的多个地址,多个之间使用逗号隔开。
eureka.client.service-url
指定eureka服务端的注册地址 (Eureka Server的分区地址)
这个是客户端使用的,告诉客户端服务的地址(让其知道去哪注册啊)
eureka.client.service-url 是个map,可以指定多个,有个默认的defaultZone
eureka.client.service-url.defaultZone=http://local.register.com:${server.port}/eureka/
defaultZone是key, http://local.register.com:${server.port}/eureka/是value
这里的defaultZone中配置的地址有一个/eureka后缀,但是我们访问的时候是没有这个后缀的,这是因为在eureka server的实现中存在一个web请求过滤器,其url模式就是【/eureka/*】。
启动服务
启动微服务,然后在浏览器访问:http://127.0.0.1:10086
看到下面结果应该是成功了:
我们进来之后重点关注一个地方:
这里显示的是注册到Eureka的实例
注意:这里的地址前半部分显示的是主机名,你可以把它理解为哦localhost
总结
服务注册
下面,我们将user-service注册到eureka-server中去。
引入依赖
在user-service的pom文件中,引入下面的eureka-client依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件
在user-service中,修改application.yml文件,添加服务名称、eureka地址:
spring:application:name: userservice
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka
启动多个user-service实例
为了演示一个服务有多个实例的场景,我们添加一个SpringBoot的启动配置,再启动一个user-service。
首先,复制原来的user-service启动配置:
然后,在弹出的窗口中,填写信息:
现在,SpringBoot窗口会出现两个user-service启动配置:
不过,第一个是8081端口,第二个是8082端口。
启动两个user-service实例:
查看eureka-server管理页面:
服务发现
下面,我们将order-service的逻辑修改:向eureka-server拉取user-service的信息,实现服务发现。
引入依赖
之前说过,服务发现、服务注册统一都封装在eureka-client依赖,因此这一步与服务注册时一致。
在order-service的pom文件中,引入下面的eureka-client依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件
服务发现也需要知道eureka地址,因此第二步与服务注册一致,都是配置eureka信息:
在order-service中,修改application.yml文件,添加服务名称、eureka地址:
spring:application:name: orderservice
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka
服务拉取和负载均衡
最后,我们要去eureka-server中拉取user-service服务的实例列表,并且实现负载均衡。
不过这些动作不用我们去做,只需要添加一些注解即可。
在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解:
修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务名代替ip、端口:
spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。
我们使用postman测试一下:
注意:使用Service启动服务集群的时候,即使显示已经启动好了,还是会存在一些延迟。
【微服务】Eureka注册中心相关推荐
- 为什么redis在陌陌上使用的这么广泛?当NoSQL数据库,微服务的注册中心,RPC的调用协议都能用
前言 说到redis,可能大家的脑海中蹦出的关键词是:NoSQL.KV.高性能.缓存等.但今天的文章从另一个角度--微服务来展开. 这篇文章的起因也是源自一次面试经历,在面试一位来自陌陌的候选人(就是 ...
- 微服务:注册中心的作用
1.为什么需要服务注册中心 微服务时代的服务管理 在微服务时代,我们所有的服务都被劲量拆分成最小的粒度,原先所有的服务都在混在1个server里,现在就被按照功能或者对象拆分成N个服务模块,这样做的好 ...
- 微服务:注册中心ZooKeeper、Eureka、Consul 、Nacos对比
前言 服务注册中心本质上是为了解耦服务提供者和服务消费者.对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的.更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数 ...
- 微服务之注册中心Nacos
Nacos是什么? Nacos是阿里巴巴的产品,选择是SpringCloud中的一个组件,比Eureka组件功能更加丰富. 一个项目要想成为微服务项目体系的一部分必须将当前项目的信息注册到Nacos. ...
- .Net Core with 微服务 - Consul 注册中心
上一次我们介绍了 Ocelot 网关的基本用法.这次我们开始介绍服务注册发现组件 Consul 的简单使用方法. 服务注册发现 首先先让我们回顾下服务注册发现的概念. 在实施微服务之后,我们的调用都变 ...
- 布道微服务_10注册中心与RPC框架的选型
文章目录 开源注册中心 Nacos 其他 关注的问题 高可用性 数据一致性 CAP 三者不能被同时满足 选型经验 RPC框架选型 gRPC Thrift 开源注册中心 Nacos 毫无疑问,现在就选N ...
- 微服务 Nacos 注册中心 基础配置
官网: https://nacos.io/zh-cn/ 需要下载Nacos服务端程序,并运行bin目录下的startup.cmd,运行参数 运行前,必须设置JAVA_HOME环境变量,如: C:\Pr ...
- 高可用Eureka注册中心配置说明(双机部署)
目 录 1. 高可用EureKa注册中心示意图 2. Eureka实例相互注册配置 3. 微服务注册到Eureka配置 4. 启动步骤及配置成功检查 5. 说明事项 1. 高可用EureKa注册中心 ...
- .NET Core with 微服务 - Consul 配置中心
上一次我们介绍了Elastic APM组件.这一次我们继续介绍微服务相关组件配置中心的使用方法.本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大,还是让我爱不起来.因为 ...
- (转)微服务_创建一个简单的Eureka注册中心
原文地址:https://www.cnblogs.com/lplshermie/p/9105329.html 微服务和分布式已经成了一种极其普遍的技术,为了跟上时代的步伐,最近开始着手学习Spring ...
最新文章
- vs2010没有 最近使用的项目和解决方案
- 延迟开学不停学|网易云信在线教育解决方案为“空中课堂”保驾护航
- ITK:通过镜像填充图像
- cuckoo hash
- 转,Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数
- eclipse git:Transport Error: Cannot get remote repository refs. invalid advertisement of
- BOA+CGI+SQLite 随笔
- java与python数据结构对比
- ELK下Logstash性能调优
- 【形状检测】基于matlab Hough变换形状检测【含Matlab源码 468期】
- 电视盒子装android,智能电视能不能装安卓应用市场,怎么安装
- AD转换实验c语言原理图,我的AD/DA转换单片机实验,含原理图和源码
- 大年三十问候导师的后果
- MATLAB对数坐标图和统计图(semilogy/loglog)
- 高德地图导航,不显示地图只有语音
- 什么是智能家电?消费者不知判定标准
- html显示文件夹图片,Html读取本地文件夹下图片并显示
- 麻雀虽小,五脏俱全-Sqlite
- Jquery导出页面表格table的内容为Excel,PDF,DOC格式
- matlab 函数提取某一项,Matlab——常用函数使用总结(部分直接从mathwork中提取并不断更新),的,用法,摘自,持续...
热门文章
- Cadence OrCAD Capture 自顶而下的设计流程
- ios framework 开发 之 实战 一,合并失败了
- mac Vue项目解决内存溢出
- 机器人正运动学(8)—— DH坐标系建立技巧
- 【树状数组or线段树】中山纪念中学暑期游Day5——开花
- CodeSmith 4.1.2 破解收藏
- 科大奥瑞物理实验——拉曼光谱实验
- QT 生成.so动态库默认生成.so .so.1 .so.1.0 .so.1.0.0
- 渐入佳境-2月份英语总结
- 微信小程序使用计时器