【SpringCloud】(一文通)服务注册/服务发现-Eureka

news2024/11/24 2:32:40

目 录

  • 一. 背景
    • 1.1 问题描述
    • 1.2 解决思路
    • 1.3 什么是注册中心
    • 1.4 CAP理论
    • 1.5 常见的注册中心
  • 二. Eureka 介绍
  • 三. 搭建Eureka Server
    • 3.1 创建 Eureka-server 子模块
    • 3.2 引入 eureka-server 依赖
    • 3.3 项目构建插件
    • 3.4 完善启动类
    • 3.5 编写配置文件
    • 3.6 启动服务
  • 四. 服务注册
    • 4.1 引入 eureka-client 依赖
    • 4.3 启动服务
  • 五. 服务发现
    • 5.1 引入依赖
    • 5.2 完善配置文件
    • 5.3 远程调用
    • 5.4 启动服务
  • 六. Eureka 和 Zookeeper 区别

一. 背景

1.1 问题描述

上个文章的例子中可以看到, 远程调用时, 我们的 URL 是写死的

String url = "http://127.0.0.1:9090/product/"+ orderInfo.getProductId();

当更换机器, 或者新增机器时, 这个URL就需要跟着变更, 就需要去通知所有的相关服务去修改. 随之而来的就是各个项目的配置文件反复更新, 各个项目的频繁部署. 这种没有具体意义, 但⼜不得不做的工作, 会让⼈非常痛苦

1.2 解决思路

例如:
某机构电话如果发生变化, 通知114. 用户需要联系机构时, 先打114查询电话, 然后再联系各个机构.114查号台的作用主要有两个:

号码注册: 服务方把电话上报给114
号码查询: 使用方通过114可以查到对应的号码

在这里插入图片描述

同样的, 微服务开发时, 也可以采用类似的方案.

  • 服务启动/变更时, 向注册中心报道. 注册中心记录应用和 IP 的关系.
  • 调用方调用时, 先去注册中心获取服务方的IP, 再去服务方进行调用

1.3 什么是注册中心

在最初的架构体系中, 集群的概念还不那么流行, 且机器数量也比较少, 此时直接使用 DNS+Nginx 就可以满足几乎所有服务的发现. 相关的注册信息直接配置在 Nginx. 但是随着微服务的流行与流量的激增,机器规模逐渐变大, 并且机器会有频繁的上下线行为, 这种时候需要运维手动地去维护这个配置信息是⼀个很麻烦的操作. 所以开发者们开始希望有这么⼀个东西, 它能维护⼀个服务列表, 哪个机器上线了,哪个机器宕机了, 这些信息都会自动更新到服务列表上, 客户端拿到这个列表, 直接进行服务调用即可.这个就是注册中心

注册中心主要有三种角色:

  • 服务提供者(Server):⼀次业务中, 被其它微服务调用的服务. 也就是提供接口给其它微服务.
  • 服务消费者(Client):⼀次业务中, 调用其它微服务的服务. 也就是调用其它微服务提供的接口.
  • 服务注册中心(Registry): 用于保存Server 的注册信息, 当Server 节点发生变更时, Registry 会同步变更. 服务与注册中心使用⼀定机制通信, 如果注册中心与某服务长时间无法通信, 就会注销该实例.

他们之间的关系以及工作内容, 可以通过两个概念来描述:

  • 服务注册:服务提供者在启动时, 向 Registry 注册自身服务, 并向 Registry 定期发送心跳汇报存活状态.
  • 服务发现: 服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口. 服务发现的⼀个重要作用就是提供给服务消费者⼀个可用的服务列表

在这里插入图片描述

1.4 CAP理论

谈到注册中心, 就避不开CAP理论.

CAP 理论是分布式系统设计中最基础, 也是最为关键的理论.

在这里插入图片描述

• ⼀致性(Consistency) CAP理论中的⼀致性, 指的是强⼀致性. 所有节点在同⼀时间具有相同的数据
• 可用性(Availability) 保证每个请求都有响应(响应结果可能不对)
• 分区容错性(Partition Tolerance) 当出现网络分区后,系统仍然能够对外提供服务

CAP 理论告诉我们: ⼀个分布式系统不可能同时满足数据⼀致性, 服务可用性和分区容错性这三个基本需求, 最多只能同时满足其中的两个.

在分布式系统中, 系统间的网络不能 100% 保证健康, 服务又必须对外保证服务. 因此 Partition Tolerance不可避免. 那就只能在C和A中选择⼀个. 也就是 CP 或者 AP 架构

正常情况:

在这里插入图片描述

网络异常:

在这里插入图片描述

  • CP架构: 为了保证分布式系统对外的数据⼀致性, 于是选择不返回任何数据
  • AP架构: 为了保证分布式系统的可用性, 节点2返回 V0 版本的数据(即使这个数据不正确)

1.5 常见的注册中心

  1. Zookeeper
    Zookeeper 的官方并没有说它是⼀个注册中心, 但是国内 Java 体系, 大部分的集群环境都是依赖 Zookeeper 来完成注册中心的功能.

  2. Eureka
    Eureka是Netflix开发的基于REST的服务发现框架, 主要用于服务注册, 管理,负载均衡和服务故障转移.官方声明在 Eureka2.0 版本停止维护, 不建议使用. 但是 Eureka 是 SpringCloud 服务注册/发现的默认实现, 所以目前还是有很多公司在使用.

  3. Nacos
    Nacos是Spring Cloud Alibaba架构中重要的组件, 除了服务注册, 服务发现功能之外, Nacos 还支持配置管理, 流量管理, DNS, 动态DNS等多种特性.

CAP 理论对比

在这里插入图片描述

二. Eureka 介绍

Eureka是Netflix OSS套件中关于服务注册和发现的解决方案. Spring Cloud对Eureka进行了集成, 并作为优先推荐⽅案进⾏宣传, 虽然目前Eureka 2.0已经停止维护, 新的微服务架构设计中, 也不再建议使用, 但是目前依然有大量公司的微服务系统使用 Eureka 作为注册中心.

Eureka主要分为两个部分:

  • Eureka Server: 作为注册中心 Server 端, 向微服务应用程序提供服务注册, 发现, 健康检查等能力.
  • Eureka Client: 服务提供者, 服务启动时, 会向Eureka Server 注册自己的信息(IP,端口,服务信息等),Eureka Server 会存储这些信息

关于Eureka的学习, 主要包含以下三个部分:

  1. 搭建 Eureka Server
  2. 将 order-service, product-service 都注册到 Eureka
  3. order-service 远程调用时, 从 Eureka 中获取 product-service 的服务列表, 然后进行交互

三. 搭建Eureka Server

Eureka-server 是⼀个独立的微服务.

3.1 创建 Eureka-server 子模块

在这里插入图片描述

3.2 引入 eureka-server 依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

3.3 项目构建插件

<build>
	<plugins>
		<plugin>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

3.4 完善启动类

给该项目编写⼀个启动类, 并在启动类上添加 @EnableEurekaServer 注解,开启 eureka 注册中心服务

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(EurekaServerApplication.class, args);
	}
}

3.5 编写配置文件

server:
	port: 10010
spring:
	application:
	name: eureka-server
eureka:
	instance:
		hostname: localhost
	client:
		fetch-registry: false # 表⽰是否从Eureka Server获取注册信息,默认为true.因为这是⼀个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这⾥设置为false
		register-with-eureka: false # 表⽰是否将⾃⼰注册到Eureka Server,默认为true.由于当前应⽤就是Eureka Server,故⽽设置为false.
		service-url:
# 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.
			defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3.6 启动服务

启动服务, 访问注册中心: http://127.0.0.1:10010/

在这里插入图片描述
可以看到 eureka-server 已经启动成功了

四. 服务注册

接下来我们把 product-service 注册到 eureka-server 中

4.1 引入 eureka-client 依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

4.2 完善配置文件

添加服务名称和 eureka 地址

spring:
	application:
		name: product-service
eureka:
	client:
		service-url:
			defaultZone: http://127.0.0.1:10010/eureka

4.3 启动服务

刷新注册中心: http://127.0.0.1:10010/

在这里插入图片描述

可以看到 product-service 已经注册到 eureka 上了

五. 服务发现

接下来我们修改 order-service, 在远程调用时, 从 eureka-server 拉取 product-service 的服务信息, 实现服务发现

5.1 引入依赖

服务注册和服务发现都封装在 eureka-client 依赖中, 所以服务发现时, 也是引入 eureka-client 依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

5.2 完善配置文件

服务发现也需要知道 eureka 地址, 因此配置内容依然与服务注册⼀致,都是配置 eureka 信息

spring:
	application:
		name: product-service
eureka:
	client:
		service-url:
			defaultZone: http://127.0.0.1:10010/eureka

5.3 远程调用

远程调用时, 我们需要从 eureka-server 中获取 product-service 的列表(可能存在多个服务), 并选择其中⼀个进行调用

import com.bite.order.mapper.OrderMapper;
import com.bite.order.model.OrderInfo;
import com.bite.order.model.ProductInfo;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.eureka.EurekaServiceInstance;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@Slf4j
@Service
public class OrderService {
	@Autowired
	private OrderMapper orderMapper;
	
	@Resource
	private DiscoveryClient discoveryClient;
	@Autowired
	private RestTemplate restTemplate;
	
	public OrderInfo selectOrderById(Integer orderId) {
		OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
		//String url = "http://127.0.0.1:9090/product/"+ 
		orderInfo.getProductId();
		//根据应⽤名称获取服务列表
		List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
		//服务可能有多个, 获取第⼀个
		EurekaServiceInstance instance = (EurekaServiceInstance) 
		instances.get(0);
		log.info(instance.getInstanceId());
		//拼接url
		String url = instance.getUri()+"/product/"+orderInfo.getProductId();
		ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
		orderInfo.setProductInfo(productInfo);
		return orderInfo;
		}
}

5.4 启动服务

刷新注册中心: http://127.0.0.1:10010/

在这里插入图片描述

可以看到 order-service 已经注册到 eureka上了

访问接口: http://127.0.0.1:8080/order/1

可以看到, 远程调用也成功了

在这里插入图片描述

六. Eureka 和 Zookeeper 区别

Eureka和Zookeeper都是⽤于服务注册和发现的⼯具,区别如下:

  1. Eureka 是 Netflix 开源的项目, 而 Zookeeper 是 Apache 开源的项目.
  2. Eureka 基于AP原则, 保证高可用, Zookeeper 基于 CP 原则, 保证数据⼀致性.
  3. Eureka 每个节点 都是均等的, Zookeeper 的节点区分 Leader 和 Follower 或 Observer, 也正因为这个原因, 如果 Zookeeper 的 Leader 发生故障时, 需要重新选举, 选举过程集群会有短暂时间的不可用.

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

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

相关文章

Docker基础概述、Docker安装、Docker镜像加速、Docker镜像指令

1.为什么学docker 开发环境与测试环境不同&#xff0c;导致错误 因此docker提供解决方法———系统平滑移植&#xff0c;容器虚拟化技术 将代码与软件与配置文件 打包成一个镜像 2.docker的历练 创建一个开发环境内成为镜像文件再用docker使用镜像 3.什么是docker Docke…

泛型篇(Java - 泛型机制)(持续更新迭代)

目录 私聊 一、什么是泛型&#xff0c;泛型有什么用&#xff0c;为什么要用 1. 说法一 1.1 什么是泛型 1.2 泛型的使用 1.3 为什么要用泛型 2. 说法二 2.1 什么是泛型&#xff0c;泛型有什么用&#xff0c;为什么要用 2.2 怎么使用泛型&#xff0c;泛型可以作用在什么…

私有方法加事务注解会导致事务失效

这里idea其实已经提醒了使用事务不能用私有方法&#xff0c;这其实是个常见问题&#xff0c;这里主要就加深印象

XSS复现

目录 XSS简单介绍 一、反射型 1、漏洞逻辑&#xff1a; 为什么有些标签可以触发&#xff0c;有些标签不能触发 可以触发的标签 不能触发的标签 为什么某些标签能触发而某些不能 二、DOM型 1、Ma Spaghet! 要求&#xff1a; 分析&#xff1a; 结果&#xff1a; 2、J…

计算xpclr

1.conda安装xpclr 首先安装流程很轻松 conda create -n xpclr -c bioconda xpclr conda activate xpclr xpclr -h 2.按照要求准备文件 XPCLR - 简书 (jianshu.com) 根据教程准备文件&#xff0c;vcf&#xff0c;计算好的map&#xff0c;以及样本文件txt 其实官网也有介绍…

django学习入门系列之第九点《案例 Flask+MySQL新增用户》

文章目录 1 新增用户往期回顾 1 新增用户 from flask import Flask, render_template, request import pymysqlapp Flask(__name__)# 创建了网址 /nima和函数index的对应关系 # 以后用户在浏览器上访问/nima自动运行函数 app.route("/nima", methods[GET, POST]) d…

最小区间00

题目链接 最小区间00 题目描述 注意点 -10^5 < nums[i][j] < 10^5nums[i] 按非递减顺序排列找到一个 最小 区间&#xff0c;使得 k 个列表中的每个列表至少有一个数包含在其中 解答思路 参照题解&#xff0c;根据滑动窗口完成本题首先将所有的元素都提取出来并按升序…

为修复漏洞而准备的更新破坏了Windows-Linux双启动的计算机

上周是微软支持的 Windows 操作系统每月一次的"星期二补丁"活动。然而&#xff0c;一个本意是修复漏洞的补丁却给一些使用 Windows 和各种版本 Linux 的双启动电脑带来了问题。 Ars Technica报道称&#xff0c;该更新旨在修复名为CVE-2022-2601 的漏洞。该漏洞于 20…

Ps:首选项 - 工具

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“工具” Tool选项卡允许用户根据自己的使用习惯和工作需求来定制 Photoshop 工具的行为。这些设置能够帮助用户提高操作的效率和精确度&#xff0c;提供更加流畅和符合个人习惯…

电影推荐(2)-----基于物品的协同过滤算法关联性分析

目录 1.算法的简单图解 2.算法的基本分析过程 3.算法的核心 4.算法的实现 5.关联分析的概念 5.1事务和事务库 5.2项 5.3项集 6.支持度 6.1受欢迎程度 6.2最小支持度 6.3关联条件 7.置信度 8.提升度 1.算法的简单图解 2.算法的基本分析过程 3.算法的核心 上面的全…

【个人学习】JVM(7):方法区概述、方法区内部结构、垃圾回收等

方法区 栈、堆、方法区的交互关系 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型场景就是数据库连接管理,以及会话管理。 栈、堆、方法区的交互关系 下面涉及了对象的访问定位 Person 类的 .class 信息存放在方法区中person 变量存放…

基于web的铁路订票管理系统

TOC springboot347基于web的铁路订票管理系统--论文 研究背景 近年来&#xff0c;由于计算机技术和互联网技术的飞速发展&#xff0c;所有企事业单位内部都是数字化、信息化、无纸化的发展趋势&#xff0c;随着这种趋势的发展&#xff0c;各种决策系统、辅助系统也应运而生&…

计量自动化终端上行通信规约

物理层 TCP 和 UDP 的传输接口 该类接口的登录链接和心跳检测采用链路测试服务&#xff0c;链路测试周期可设定。 参见 TCP/IP 协议规范。 串行通信传输接口 字节传输按异步方式进行&#xff0c;它包含 8 个数据位、1 个起始位“0”、1 个偶校验位 P 和 1 个停止位“1”。 …

SEO优化:如何优化自己的文章,解决搜索引擎不收录的问题

可以使用bing的URL检查&#xff0c;来检查自己的文章是不是负荷收录准测&#xff0c;如果页面有严重的错误&#xff0c;搜索引擎是不会进行收录的&#xff0c;而且还会判定文章为低质量文章&#xff01; 检查是否有问题。下面的页面就是有问题&#xff0c;当然如果是误报你也可…

yolov5和yolov7车牌识别检测(可检测黄牌、绿牌、双层车牌等各种车牌,准确率高,提供界面)

实现一个车牌识别系统&#xff0c;使用YOLOv5和YOLOv7这两种不同的模型来进行车牌的检测。下面我将提供一个完整的项目概述&#xff0c;包括模型训练脚本、车牌识别代码以及两个GUI界面&#xff0c;分别用于处理静态图片和实时视频流 1. 模型训练 YOLOv5 和 YOLOv7 的训练脚本…

Flask条件查询接口出现SQL注入,使用参数化查询:写法的解决方案(附带企业级开发实际例子与经验分享)

背景&#xff1a; 一个接口出现了SQL注入&#xff0c;条件查询场景下出现&#xff0c;形如下图 解决问题时&#xff0c;我们先要问&#xff0c;什么是SQL注入&#xff1f; 下面的资料有助于针对SQL注入是什么、如何验证SQL注入解决成功了&#xff0c;提供一些思路&#xff0c…

【功能自动化】进阶版——使用mysql数据表获取参数,并批量更新数据

环境搭建&#xff1a; 1.需要配置WebTours网站 2.安装pymysql pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymysql 3.mysql数据表user表内容 实现代码 # 导入包 from selenium import webdriver from selenium.webdriver.support.select import Select f…

Keil C51 插件 检测变量名引用不统一

此插件解决的问题 Keil 插件 -- Python 代码 import chardet, sys, glob import re# 变量名字典 key--数据名 value--数据s类型 variable_dic {} # 报错变量名字典 error_dic {}def add_key(key, value):if key in variable_dic:error_dic[key] valueelse:variable_dic[key…

【js】各类前端输入校验方法

使用方式&#xff1a; 源码&#xff1a; //电话号码 export const checkModbile (rule,value,callback)>{if(value undefined){callback();return;} if(value.length 11){var reg /^1[3,4,5,6,7,8,9][0-9]{9}$/;}else if(value.length 13 || value.length 8 || valu…

SQL 二阶注入 (injection 第二十四关)

简介 SQL注入&#xff08;SQL Injection&#xff09;是一种常见的网络攻击方式&#xff0c;通过向SQL查询中插入恶意的SQL代码&#xff0c;攻击者可以操控数据库&#xff0c;SQL注入是一种代码注入攻击&#xff0c;其中攻击者将恶意的SQL代码插入到应用程序的输入字段中&am…