java四神兽_SpringCloud五大神兽之Eureka

注册中心概述

什么是注册中心?

相当于服务之间的‘通讯录’,记录了服务和服务地址之间的映射关系。在分布式架构中服务会注册到这里。当服务需要调用其他服务时,就在注册中心找到其他服务的地址,进行调用

注册中心的主要作用?

注册中心一般有以下的功能:

服务发现

服务注册/反注册:保存服务提供者和调用者的关系

服务订阅/取消订阅:服务调用者订阅服务提供者的信息

服务路由:筛选整合服务提供者

服务配置

配置订阅:服务提供者和消费者订阅微服务相关的配置

配置下发:主动将配置推送给提供者和消费者

服务健康检测

检测服务提供者的健康情况

Eureka

Eureka是SpringCloud微服务架构中常用的注册中心,其架构图如下:

c622557891cdb3d48abfa3e20a10566a.png

由其架构图可以看出,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 出现以下页面即表示服务搭建成功

470dc1c9fb96c5099e111e39e51028a6.png

注册服务到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的自我保护

cf8ba562de882e0bd8f7e98f3a0619b1.png

如上图提示,表示Eureka进入了自我保护模式。自我保护模式的介绍如下:

Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否高于 85%,如果高于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期。在我看来可以用一句古成语来形容这种模式---“三人成虎” 即当越来越多的服务提供者心跳不能到达时。Eureka开始不在怀疑是提供者GG,而怀疑自己了!

在开发环境中,我们往往启动一个Eureka服务 + 一个 Eureka 提供者,如果此时提供者正好出了问题。90S未发送心跳。但由于满足自我保护条件(这段时间失败比例为100%),Eureka不会将服务剔除。会直接导致服务消费者无法正确获取服务。因此开发环境中建议关闭其自我保护机制,而在生产环境打开之, yml 配置如下:

eureka:

server:

enable-self-preservation: false # 关闭自我保护

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[SpringCloud五大神兽之Eureka]http://www.zyiz.net/tech/detail-107318.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下dubbo-admin和zookeeper安装部署

1. 概述 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、…

jpush java api_JPush極光推送Java服務器端API

產品功能說明極光推送(JPush)是一個端到端的推送服務,使得服務器端消息能夠及時地推送到終端用戶手機上,讓開發者積極地保持與用戶的連接,從而提高用戶活躍度、提高應用的留存率。極光推送客戶端支持 Android, iOS 兩個平台。本 Android SDK …

Maven详解(转)

转自 https://www.cnblogs.com/hongwz/p/5456578.html 一.前言 以前做过的项目中,没有真正的使用过Maven,只知道其名声很大,其作用是用来管理jar 包的。最近一段时间在项目过程中使用Maven,用Maven构建的web项目,其项目…

java商品编写代码_商品品牌业务之后台Java代码的编写

今天是刘小爱自学Java的第146天。感谢你的观看,谢谢你。商品品牌业务之后台Java代码的编写-1.jpg (50.46 KB, 下载次数: 1)2021-2-5 00:22 上传学习计划安排如下:昨天实现了前端页面的编写以及发送请求,今天关于异步请求工具axios的简单说明。…

java中8种数据类型和默认值所占字节数

java 8种基本数据类型的默认值及所占字节数通过一段代码来测试一下 8种基本数据类型的默认值 1 package dierge;2 3 public class Ceshi { 4 int a; 5 double b; 6 boolean c; 7 char d; 8 float f; 9 byte e; 10 long h; 11 short j; 12 public static void main(String…

软件测试实验1:为三角形问题编写一个Java程序,并用Junit测试程序

实验报告 实验内容: 1.Install Junit(4.12), Hamcrest(1.3) with Eclipse 2.Install Eclemma with Eclipse 3.Write a java program for the triangle problem and test the program with Junit. 实验步骤: 1.在eclipse中安装Junit、Hamcrest和eclemma。…

SurfaceFlinger与Surface概述

基本原理: SF一个Client对应一个app中的SurfaceComposerClient, 分别是Binder的n端和b端,主要用来CreateSurface 一个app中有多个Activity,一个Activity一般有一个Surface(除SurfaceView,一个View就有一个Surface)&…

拼图项目动手指南

Jigsaw项目将把模块化引入Java平台,根据原始计划,它将在12月10日完成功能。 所以我们在这里,但是拼图在哪里? 在过去的六个月中肯定发生了很多事情: 原型问世 ,内部API的迫在眉睫的删除引起了很大的骚动 &…

java实现回文验证_LeetCode 精选 TOP 面试题(Java 实现)—— 验证回文串

文章目录一、题目描述1.1 题目验证回文串给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例 1:输入: "A man, a plan, a cana…

java开发门禁指纹,指纹门禁

大兀人脸识别控制系统USB指纹仪DW9拓扑图(指纹为java系统直接采集、云或控制板直接比对,无需二次注册,人脸为htttp上传服务器或rtsp视频流比对方案)大兀活体指纹门禁采用BS架构,已集成进大兀人脸识别系统,如二次开发可直接调用jav…

使用Selenide进行有效的UI测试

等待奇迹 圣诞节是奇迹的时刻。 在新的一年的前夕,我们都为下一年制定了计划。 我们希望所有问题都将在最后一年消失,在来年出现奇迹。 每个Java开发人员都梦想着创造一个奇迹,使他成为世界上最有效的Java开发人员。 我想向你展示这样的奇…

android之seekbar

做了一个拖动滑块改变数值的demo 下附上代码: <SeekBar android:id"id/myseekbar" android:layout_width"match_parent" android:layout_marginTop"20dp" android:thumb"drawable/slider" android:layout_height&qu…

php 微信小程序 循环 多选,微信小程序实现多选功能

本文为大家分享了微信小程序实现多选功能的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下代码&#xff1a;{{num 1}}/{{quesyion.length}}{{question[num][0]}}A {{question[num][1]}}B {{question[num][2]}}C {{question[num][3]}}D {{question[num][4]}}正确答案…

php+反序列化代码执行漏洞,PHP反序列化漏洞

0x001 漏洞产生原理在反序列化的过程中自动触发了某些魔术方法。未对用户输入的序列化字符串进行检测&#xff0c;导致攻击者可以控制反序列化过程&#xff0c;从而导致XSS、代码执行、文件写入、文件读取等不可控后果。0x002 漏洞触发条件一般只能通过代码审计的方式挖掘该漏洞…

java filter 模式,Java设计模式----过滤器模式(挑三拣四)

过滤器模式描述拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器&#xff0c;并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志&#xff0c;或者跟踪请求&#xff0c;然后把请求传给相…

java项目processes设置,Jvm调优和SpringBoot项目优化的详细教程

参考文章1、先看一下未设置JVM参数的情况&#xff0c;默认情况下&#xff0c;没有设置任何Jvm参数。2、设置Jvm参数。配置参数&#xff1a;关于这些设置的JVM参数是什么意思&#xff0c;参考Jvm调优。-XX:MetaspaceSize128m (元空间默认大小)-XX:MaxMetaspaceSize128m (元空间最…

Git问题Everything up-to-date解决

Git问题Everything up-to-date解决 【自己的亲身错误体验】 我的上一篇博客&#xff0c;说了怎么上传一个项目到git远程上面。今天我写好一个小栗子&#xff0c;准备再次上传的时候。我依旧是放在我的F:\github\js- 这个和我的github上的远程仓库相同名称的文件中的 在这里空白…

java超出gc开销限制_超出了GC开销限制– Java堆分析

java超出gc开销限制这篇文章是我们原来的GC开销超出问题模式的延续。 正确的Java堆分析对于消除O​​utOfMemoryError&#xff1a;GC开销问题至关重要。 如果您不熟悉此Java HotSpot 1.6错误&#xff0c;建议您首先阅读有关此主题的第一篇文章 。 本文将为您提供一个示例程序和…

java自定义一个timeout,Timeout操作符 RxJava 学习笔记二十一

timeout用于检测在给定时间内observables没有及时响应。如果指定的时间量没有发出任何项目&#xff0c;则超时会使observables失败并出现TimeoutException。我们将从debounce的示例中重用我们的observable来演示超时。输出&#xff1a;只要值不超过200ms&#xff0c;就会输出。…

用xshell ssh连接测试服务器时候出的问题

问题还原&#xff1a;用ssh连接测试服务器 给我结结实实报了个错 FBIwarning: ----------------------------------------------------------------------------------------------------------------------------以上 问题还原 解决过程&#xff1a;百度 博客地址http://blog.…