java cloud五大神兽_SpringCloud五大神兽之Eureka
注册中心概述
什么是注册中心?
相当于服务之间的‘通讯录’,记录了服务和服务地址之间的映射关系。在分布式架构中服务会注册到这里。当服务需要调用其他服务时,就在注册中心找到其他服务的地址,进行调用
注册中心的主要作用?
注册中心一般有以下的功能:
服务发现
服务注册/反注册:保存服务提供者和调用者的关系
服务订阅/取消订阅:服务调用者订阅服务提供者的信息
服务路由:筛选整合服务提供者
服务配置
配置订阅:服务提供者和消费者订阅微服务相关的配置
配置下发:主动将配置推送给提供者和消费者
服务健康检测
检测服务提供者的健康情况
Eureka
Eureka是SpringCloud微服务架构中常用的注册中心,其架构图如下:
由其架构图可以看出,Eureka可以分为三部分:Eureka服务端,Eureka服务提供者,Eureka服务消费者。
其中Eureka服务端需要作为独立的服务运行,而服务提供者、消费者则是需要使用EurekaClient嵌入我们自己的服务中。
其运行原理是这样的:
当服务提供者启动时,会向注册中心发送请求,在注册中心注册实例。并且每隔一段时间向注册中心发送心跳,注册中心会保存实例和地址的映射关系
当服务消费者启动时,会从注册中心拉去所有的注册信息,并缓存起来。当需要调用某一个服务时。根据缓存的注册信息直接调用服务
聪明的你这个时候会察觉到。既然消费者使用的是缓存的注册信息。那么一定会存在一种情况就是服务提供者这边已经宕机。这个时候消费者根据缓存的信息没有及时更新就会导致调用失败,Eureka是怎么解决这个问题的呢?且往下看。
服务端的搭建
创建工程,导入坐标
这里推荐使用 Spring Initializer 直接创建。选择 web 和 euraka 即可。主要引入的依赖如下:
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
配置 application.yml ,说明见注释
server:
port: 9000
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false # 是否将自己注册到注册中心
fetch-registry: false # 是否从Eureka中获取注册信息
service-url: # Eureka Client 的请求地址
defaultZone: http://#{eureka.instance.hostname}:#{server.port}/eureka/
配置启动类
启动类除了常规的 @SpringBootApplication 外,还要添加 @EnableEurekaServer 表示开启 Eureka 服务
启动项目,浏览器访问 localhost:9000 出现以下页面即表示服务搭建成功
注册服务到Eureka
在要注册的工程中导入Eureka Client的坐标
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
在 application.yml 中配置Eureka服务端的地址:
这里需要特别注意:Eureka客户端配置的服务端地址使用的key是 defaultZone,不是 default_zone 如果写错会导致客户端无法注册服务,进而导致客户端无法启动
server:
port: 9001
spring:
application:
name: SERVICE_PROVIDER # 服务名称
datasource:
url: jdbc:mysql://192.168.25.128:3306/mysql?characterEncoding=UTF-8&useSSL=false&serverTimezone=CTT
driver-class-name: com.mysql.cj.jdbc.Driver
password: 521
username: keats
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/ # 刚刚在Eureka Server 配置的请求地址
register-with-eureka: true # 注册到注册中心
fetch-registry: false # 作为服务提供者,可以不用从Eureka获取注册信息。视实际情况而定
instance:
prefer-ip-address: true # 使用IP地址注册
在启动类加上 @EnableEurekaClient 注解(SpringCloud Finchley.RELEASE 版本及之后的版本会在项目中引入EurekaClient依赖后自动开启,我们使用的是最新版。因此也可以不用添加)
Euraka 客户端默认每隔 30 S向服务端发送一次心跳请求,如果服务端 90 S没有收到某客户端发送的请求将视为客户端宕机。会将其从服务列表剔除
消费者获取和使用服务
搭建服务消费者和提供者的步骤类似,首先是添加 eureka-client 依赖
之后配置 application.yml 如下:
server:
port: 9002
spring:
application:
name: SERVICE_CONSUMER # 服务名称
eureka:
client:
service-url: # 刚刚在Eureka Server 配置的请求地址
defaultZone: http://localhost:9000/eureka/
fetch-registry: true
register-with-eureka: false
这样该服务就具备了从Eureka获取服务的能力,那具体怎么使用呢?
Spring 为我们提供了一个Bean:DiscoveryClient (注意需要导入:org.springframework.cloud.client.discovery 包下的DiscoveryClient 而不是 netflix 包下的类)
我们在需要获取服务的类里面注入该类
@Autowired
private DiscoveryClient discoveryClient;
接着调用其 getInstances(String instancdName) 方法,通过服务的名称获取服务列表。我们这里只注册了一个服务提供方没有搭集群所以直接使用列表第0位的服务实体。而实体提供了 getUri() 方法用于获取服务提供者的 url。接着我们用该方法替换硬编码的 url 即可完成 Eureka 的使用。核心代码如下:
网上的很多其他教程在这里使用的都是 getHost() + ":" + getPort() 拼接,推测可能是版本比较老旧。新API既然已经提供了 getUri() 方法我们就要积极使用。这里建议读者们在使用某Bean的方法时通过打点的方式阅读一下其开放的API,大概了解一下
@GetMapping("teacher/users")
public List getAllUser(){
List service_provider = discoveryClient.getInstances("SERVICE_PROVIDER");
ServiceInstance serviceInstance = service_provider.get(0);
return restTemplate.getForObject(serviceInstance.getUri() + "/api/v1/users", List.class);
}
Eureka的自我保护
如上图提示,表示Eureka进入了自我保护模式。自我保护模式的介绍如下:
Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否高于 85%,如果高于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期。在我看来可以用一句古成语来形容这种模式---“三人成虎” 即当越来越多的服务提供者心跳不能到达时。Eureka开始不在怀疑是提供者GG,而怀疑自己了!
在开发环境中,我们往往启动一个Eureka服务 + 一个 Eureka 提供者,如果此时提供者正好出了问题。90S未发送心跳。但由于满足自我保护条件(这段时间失败比例为100%),Eureka不会将服务剔除。会直接导致服务消费者无法正确获取服务。因此开发环境中建议关闭其自我保护机制,而在生产环境打开之, yml 配置如下:
eureka:
server:
enable-self-preservation: false # 关闭自我保护
java cloud五大神兽_SpringCloud五大神兽之Eureka相关推荐
- java四神兽_SpringCloud五大神兽之Eureka
注册中心概述 什么是注册中心? 相当于服务之间的'通讯录',记录了服务和服务地址之间的映射关系.在分布式架构中服务会注册到这里.当服务需要调用其他服务时,就在注册中心找到其他服务的地址,进行调用 注册 ...
- 论《赢在中国》的五大收获与五大遗憾
论<赢在中国>的五大收获与五大遗憾 文/王艺建(欢迎约稿,网络策划推广等合作) QQ 543415188 最近每周二都在收看CCTV-2的<赢在中国>,去年看过第一期,现在正在 ...
- Oracle Java Cloud系列(02)——创建Java云的应用服务器实例 及 数据库云实例
本指南为整个系列的第二篇,介绍如何创建Oracle数据库云服务与Java云服务,文章整体将分为下面三个部分: 第一步:创建服务前准备 - 密钥与云存储容器 第二步:创建数据库云服务 第三步:创建Jav ...
- Spring Cloud(二): 注册中心Eureka的使用
Eureka 按照官方介绍: Eureka is a REST (Representational State Transfer) based service that is primarily us ...
- 【文档熟肉】spring cloud官方文档の中文熟肉之eureka
下面会陆续开始spring cloud中文文档的更新工作. 先更新个spring cloud最关键的eureka吧,原文地址: https://docs.spring.io/spring-cloud- ...
- SpringCloud学习笔记3:Spring Cloud Netflix 组件(五大神兽)
一.Spring Cloud Netflix有哪些组件? eureka (提供服务注册与发现功能) ribbon(提供负载均衡功能) Feign(整合了ribbon和Hystrix,具有负载均衡和熔断 ...
- java 成员类_Java类的五大成员之一——内部类
一. 类的五大成员: 属性.构造方法.一般方法.块.内部类 这篇主要描写内部类. 下面代码演示类的结构: package com.company.project.test.t41; import ja ...
- java 扫描 apk 安全性_五大APP安全在线检测平台对比
Android APP本文作者:ice@DMZLab 最近一直在研究的检测,写了一个系列的文章――手工检测,自动化检测,常见漏洞分析.今天给大家带来的是自动化检测.本篇没有深入的讲解每一个漏洞的详情, ...
- java面向对象三大特征及五大原则
java面向对象 一.java面向对象的三大特征 1.封装(Encapsulation) 封转是指属性私有化 根据需要提供setter和getter方法来访问属性 隐藏具体属性和实现细节,仅对外开放接 ...
最新文章
- tensorflow 风格迁移二
- 常见计算机英语词汇翻译,常见计算机英语词汇解释(1)
- 工厂模式一之简单工厂
- 网易云信集成视频教程(四):如何快速实现iOS登录登出?
- 钉钉小程序------子组件监测父组件的数据更新
- Redis遍历方式思考--字典扩容方式
- 第十节: 利用SQLServer实现Quartz的持久化和双机热备的集群模式 :
- 基于java SSM校园兼职平台系统设计和实现
- spark 应用程序性能优化经验
- 网络编程 之 有用的 socket
- python安装dlib要cmake,如何使用cmake解决dlib错误?
- VS2012下基于Glut 绘制立方体示例程序:
- 递归问题学习二之卡牌组合问题
- etc fstab 详解linux,Linux下/etc/fstab文件详解
- 【C语言】动态内存的分配
- no-siteapp 和 no-transform 有什么区别??
- 丧心病狂的Monkey测试
- 协调世界时转换为GPS周秒
- MySQL删除表的三种方式
- 计算机配置 主板,整套解决方案:I5-3470处理器和什么主板构成计算机配置?