实用篇-Eureka注册中心
一、提供者与消费者
服务提供者:一次业务中,被其他微服务调用的服务。(提供接口给其他微服务)
服务消费者:一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口)
例如前面的案例中,order-service微服务是服务提供者,user-service微服务是服务消费者
思考:
如果服务A调用服务B,服务B调用服务C,那么服务B是什么角色 ?
一个服务既可以是提供者,也可以是消费者。所以服务B相对于服务A而言,服务B是提供者。服务B相对于服务C而言,服务B是消费者
二、Eureka原理分析
以上面的案例为例,order-service微服务和user-service微服务之间,服务调用出现的问题如下:
- order-service去向user-service发送请求,使用的是硬编码,也就是 "http://localhost:8081/user/"+order.getUserId();
- 硬编码每次修改需要重新打包
- 如果user-service微服务(提供者)部署成了多实例,形成集群来应对并发,那么order-service微服务(消费者)硬编码到底是写哪个实例的地址
- 即使你知道这些实例的地址,那么如何挑选其中一台实例来使用呢
Eureka原理
- Eureka架构中,微服务角色有两类,一个是EurekaServer叫做服务端(注册中心)。作用是记录服务信息,心跳监控;一个是EurekaClient叫做客户端,也就是服务的提供者/消费者
- 可以把注册中心理解为Key,我们的微服务项目理解为Value,Eureka理解为字典
- 当微服务项目(例如user-service)启动时,会主动把自己(user-service微服务)的信息注册给注册中心
- 注册到注册中心的微服务会每隔30秒,向注册中心发起心跳,证明自己还在健康运行
- 多个微服务的话,注册中心就会有多个Value,一个Value就是一个微服务的信息,这些Value会放到一个列表里面
- 当其它微服务(例如order-service)要使用某个微服务(例如user-service)时,这个微服务(order-service就会向注册中心去拉取对应微服务(user-service)的信息
- 当注册中心有多个提供者(微服务),那么消费者是通过负载均衡算法,在注册中心的服务列表中挑选一个
三、搭建Eureka
步骤有三步:
1、搭建注册中心(EurekaServer)。搭建EurekaServer注册中心,也就是创建一个项目(在cloud-demo项目内部创建eureka-server项目),把这个项目做成注册中心
2、服务注册。将user-service(前面导入的服务拆分Demo)、order-service(前面导入的服务拆分Demo)都注册到eureka
3、服务发现。在order-service中完成服务拉取,然后通过负载均衡挑选一个服务,实现远程调用
1. 搭建EurekaServer注册中心
第一步: 创建一个新的项目,作为独立的微服务,用于搭建Eureka,也就是在cloud-demo工程里面新建eureka-server微服务项目

第二步: 在eureka-server微服务的pom.xml添加如下,无需配置版本,因为父工程已经配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud-demo</artifactId><groupId>cn.itcast.demo</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>eureka-server</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><!--添加注册中心的依赖坐标--><dependencies>
<!-- eureka服务端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies></project>
第三步: 在eureka-server微服务的src/main/java目录新建cn.itcast.eureka.EurekaApplication类,写入如下,注意加上@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;@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class,args);}
}
第四步: 在eureka-server微服务的src/main/resources目录新建File,名字为application.yml,写入如下
server:# 服务端口port: 8686spring:application:# eureka的服务名称,因为eureka自己也是一个服务,也需要注册服务name: eurekaservereureka:client:service-url:# eureka的服务地址。如果有多个的话,逗号隔开defaultZone: http://localhost:8686/eureka
第五步: 启动eureka-server微服务。也就是运行EurekaApplication类,浏览器访问 http://localhost:8686


2. 服务注册
这里我们实现把user-service和order-service注册到Eureka,只演示user-service
第一步:在user-service项目引入spring-cloud-start-netfix-eureka-client依赖,表示客户端
<!--引入Eureka客户端依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
第二步: 在user-service微服务的application.yml添加如下
spring:# Eureka相关配置application:# user的服务名称。也就是这个user-service注册到Eureka之后,这个user-service会叫什么名字name: userserviceeureka:client:service-url:# eureka的服务地址。如果有多个的话,逗号隔开。也就是把当前这个user-service微服务注册给哪个EurekadefaultZone: http://localhost:8686/eureka
添加完后,user-service的application.yml文件如下,注意application是spring下的配置,要写在spring的下面
server:port: 8081
spring:datasource:url: jdbc:mysql://localhost:3306/cloud_user?useSSL=falseusername: rootpassword:driver-class-name: com.mysql.jdbc.Driver# Eureka相关配置application:# user的服务名称。也就是这个user-service注册到Eureka之后,这个user-service会叫什么名字name: UserService
mybatis:type-aliases-package: cn.itcast.user.pojoconfiguration:map-underscore-to-camel-case: true
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSSeureka:client:service-url:# eureka的服务地址。如果有多个的话,逗号隔开。也就是把当前这个user-service微服务注册给哪个EurekadefaultZone: http://localhost:8686/eureka
同理,order-service也做相同操作,只是服务名修改一下
第三步:
启动user-service。也就是运行UserApplication类,浏览器访问 http://localhost:8686,就可以看到user-service已经添加到Eureka里面
启动order-service。也就是运行OrderApplication类,浏览器访问 http://localhost:8686,就可以看到order-service已经添加到Eureka里面

当运行程序出现找不到或无法加载主类,可以尝试install一下maven工程,实在不行就全部删掉重新写一遍

IDEA复制服务实例
上面我们启动了一个UserService服务实例,那么我们想再启动一个UserService实例,向Eureka注册多个服务,实现如下
第一步:右键服务然后点击复制配置

第二步:设置服务名称和端口
第三步:启动服务

第四步:打开Eureka注册中心,看到UserService的服务列表中增加了一个
也就是说,UserService的服务实例可以注册多个,当消费者想要获取服务时,可以通过负载均衡策略向服务实例发起请求
3. 服务发现
服务发现也叫服务拉取,我们需要在order-service完成服务拉取。服务拉取是基于服务名称获取服务列表,然后再对服务列表做负载均衡
首先回想一下,前面的远程调用,我们实现了在订单项目(也就是现在的order-service微服务)去查询用户项目(也就是现在的user-service微服务)的案例需求
当时是在order-service里面使用url请求ip地址的方式,去请求user-service,从而获取user-service的用户信息
那么,学习了上面的Eureka之后,并且我们已经把order-service和user-service注册到注册中心(eureka-server)了,所以就可以在order-service里面,通过 '服务发现' 去获取user-service里面的用户信息
具体操作也非常简单,也是使用url请求的方式,但请求的路径不是ip,而是服务名称
代码实现
第一步: 在order-server微服务中的src/main/java/cn.itcast.order/service/OrderService类,修改访问的url路径,用服务名代替ip、端口。修改为如下
package cn.itcast.order.service;import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.sql.PreparedStatement;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);//2.利用RestTemplate发起http请求,查询用户//2.1 url路径String url = "http://UserService:8081/user/" + order.getUserId();//这个方法第一个参数是访问路径,第二个参数是把响应得到的Json数据封装成实体类对象User user = restTemplate.getForObject(url, User.class);//3.封装user到Orderorder.setUser(user);// 4.返回return order;}
}

第二步: 负载均衡。在order-server微服务中的OrderApplication引导类修改为如下,主要是给RestTemplate加上@LoadBalanced注解
package cn.itcast.order;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}/*** 创建RestTemplate并注入Spring容器* @return*/@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}}
第三步: 重新启动在order-server微服务的OrderApplication引导类,浏览器输入
http://localhost:8080/order/101,并向user-service微服务发送多次请求




总结:服务发现,就是将请求url中的ip地址替换成服务名称,然后根据负载均衡策略去调用服务
相关文章:
实用篇-Eureka注册中心
一、提供者与消费者 服务提供者:一次业务中,被其他微服务调用的服务。(提供接口给其他微服务) 服务消费者:一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口) 例如前面的案例中,order-service微服务是服…...
基于springboot实现篮球竞赛预约平台管理系统项目【项目源码+论文说明】
基于springboot实现篮球竞赛预约平台管理系统演示 摘要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,篮球竞赛预约平台也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大&…...
OpenHarmony docker环境搭建所见的问题和解决
【摘要】OpenHarmony docker环境搭建需要一台安装Ubuntu的虚拟机,并且虚拟机中需要有VScode。 整个搭建流程请参考这篇博客:OpenHarmony docker环境搭建-云社区-华为云 (huaweicloud.com) 上篇博主是用Ubuntu的服务器进行环境搭建的,在使用VS…...
1817_ChibiOS的RT线程
全部学习汇总: GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 1. 关于线程,有几个概念需要弄清楚:声明、生命循环、延迟、线程引用、线程队列、线程时间、优先级管理、调度。 2. 两个声明…...
牛客网刷题-(7)
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...
多模态领域的先进模型
多模态学习领域涌现了许多先进的模型,这些模型能够处理来自不同感官模态的信息并实现多模态任务。以下是一些先进的多模态学习模型: CLIP (Contrastive Language-Image Pretraining):由OpenAI开发的CLIP是一种多模态预训练模型,能…...
列表自动向上滚动
列表自动向上滚动 鼠标放上去 自动停止滚动 <div id"list-detail-main"><div class"my_table_thead_tr"><div v-for"(item, index) in header" :key"index" class"my_table_thead_th">{{ item }}</div…...
嘴笨的技术人员怎么发言
对于嘴笨的人来说,即兴发言简直就是灾难,想想自己窘迫的模样,自己都受不了,但职场又避免不了这种场合,所以,就要靠一些技巧让我们顺利打开思路了。 那么,今天就分享几个解救过我的不同场景即兴发…...
vue源码分析(三)——new Vue 的过程(详解data定义值后如何获取的过程)
文章目录 零、准备工作1.创建vue2项目2.修改main.js 一、import Vue from vue引入的vue是哪里来的(看导入node_modules包)1: 通过node_modules包的package.json文件2: 通过配置中的main入口文件进入开发环境的源码(1&a…...
软考系统架构师知识点集锦四:信息安全技术基础知识
一、考情分析 二、考点精讲 2.1信息加解密技术 2.1.1对称加密 概念:对称加密(又称为私人密钥加密/共享密钥加密) : 加密与解密使用同一密钥。特点:加密强度不高,但效率高;密钥分发困难。 (大量明文为了保证加密效率一般使用对称加密) 常见对称密钥加密算法:DES:…...
Vscode中不显示.ipynb文件单元格行号
找到设置,搜索line number: 看到下面那个Notebook: Line Numbers 控制单元格编辑器中行号的显示。,选择on即可;...
【Oracle】[INS-30131]执行安装程序验证所需的初始设置失败。
这里写目录标题 一、问题描述1 报错内容1.1 无法从节点“kotin”检索 exectask 的版本1.2 工作目录"xxx"无法在节点"kotin"上使用 2 相关环境2.1 安装软件2.2 安装系统 3 解决思路分析 二、解决方案1 方案一、 满足验证条件 - 不换系统1.1 第一步、检查文件…...
二进制部署kubernetes集群的推荐方式
软件版本: 软件版本containerdv1.6.5etcdv3.5.0kubernetesv1.24.0 一、系统环境 1.1 环境准备 角色IP服务k8s-master01192.168.10.10etcd、containerd、kube-apiserver、kube-scheduler、kube-controller-manager、kubele、kube-proxyk8s-node01后续etcd、conta…...
智能矩阵,引领商业新纪元!拓世方案:打破线上线下界限,开启无限营销可能!
在科技赋能商业大潮中,一切行业都在经历巨大变革,传统的营销策略被彻底改变,催生着无数企业去打造横跨线上线下、多维度、全方位的矩阵营销帝国。无数的成功案例已经告诉我们,营销不再只是宣传,而是建立品牌与消费者之…...
ADB原理(第四篇:聊聊adb shell ps与adb shell ps有无双引号的区别)
前言 对于经常使用adb的同学,不可避免的一定会这样用adb,比如我们想在手机里执行ps命令,于是在命令行中写下如下代码: adb shell ps -ef 或者 adb shell "ps -ef" 两种方式都可以使用,你喜欢用哪个呢&#…...
「网络编程」数据链路层协议_ 以太网协议学习
「前言」文章内容是数据链路层以太网协议的讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、以太网协议简介二、以太网帧格式(报头)三、MTU对上层协议的影响四、ARP协议4.1 ARP协议的作用4.2 ARP协议报头 一、以太网协…...
通过python操作neo4j
在neo4j中创建结点和关系 创建结点 创建电影结点 例如:创建一个Movie结点,这个结点上带有三个属性{title:‘The Matrix’, released:1999, tagline:‘Welcome to the Real World’} CREATE (TheMatrix:Movie {title:The Matrix, released:1999, tagl…...
Ubuntu中查看电脑有多少个核——lscpu
1. 使用lscpu命令: 打开终端并输入以下命令: lscpu你会看到与CPU相关的详细信息。查找"CPU(s)"这一行来看总的核心数。另外,“Core(s) per socket”表示每个插槽或每个物理CPU的核数,“Socket(s)”表示物理CPU的数量。将这两个值相乘即得到总…...
Python学习笔记第七十二天(Matplotlib imread)
Python学习笔记第七十二天 Matplotlib imread读取图像数据修改图像裁剪图像图像颜色 后记 Matplotlib imread imread() 方法是 Matplotlib 库中的一个函数,用于从图像文件中读取图像数据。 imread() 方法返回一个 numpy.ndarray 对象,其形状是 (nrows,…...
安卓核心板_天玑700、天玑720、天玑900_5G模块规格参数
5G安卓核心板是采用新一代蜂窝移动通信技术的重要设备。它支持万物互联、生活云端化和智能交互的特性。5G技术使得各类智能硬件始终处于联网状态,而物联网则成为5G发展的主要动力。物联网通过传感器、无线网络和射频识别等技术,实现了物体之间的互联。而…...
GPT-SoVITS:重新定义语音合成技术的少样本学习框架
GPT-SoVITS:重新定义语音合成技术的少样本学习框架 【免费下载链接】GPT-SoVITS 1 min voice data can also be used to train a good TTS model! (few shot voice cloning) 项目地址: https://gitcode.com/GitHub_Trending/gp/GPT-SoVITS 在数字化内容创作日…...
如何用Python实现非奇异快速终端滑模控制(NTSM)?附完整仿真代码
Python实现非奇异快速终端滑模控制(NTSM)的工程实践指南 滑模控制因其强鲁棒性在工业控制领域广受青睐,但传统方法存在奇异性与抖振问题。本文将手把手带您用Python实现非奇异快速终端滑模控制(Non-singular Terminal Sliding Mode Control, NTSM),包含完…...
避坑指南:OpenClaw云端一键部署的5个关键配置,90%的人都踩过前3个
OpenClaw作为目前最火的开源AI智能体框架,凭借低代码、多模型兼容、全渠道对接(飞书/钉钉/Telegram等)的特性,已经成为个人开发者、中小团队搭建专属AI员工的首选方案。 各大云厂商也纷纷推出了OpenClaw一键部署镜像,号…...
Vue项目本地部署神器:phpStudy+nginx配置全流程(支持多项目同时运行)
Vue项目本地部署神器:phpStudynginx配置全流程(支持多项目同时运行) 每次在本地调试Vue项目时,你是否也遇到过这样的困扰?项目打包后需要部署到服务器才能预览效果,但配置nginx对前端开发者来说又太过复杂。…...
umamusume-localify本地化工具与效能调优技术指南
umamusume-localify本地化工具与效能调优技术指南 【免费下载链接】umamusume-localify Localify "ウマ娘: Pretty Derby" DMM client 项目地址: https://gitcode.com/gh_mirrors/um/umamusume-localify 开源本地化工具如何解决跨语言界面障碍?游戏…...
5个实用技巧让华硕笔记本性能提升30%:GHelper全功能解析
5个实用技巧让华硕笔记本性能提升30%:GHelper全功能解析 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, …...
Postman便携版:Windows免安装API开发工具的新选择
Postman便携版:Windows免安装API开发工具的新选择 【免费下载链接】postman-portable 🚀 Postman portable for Windows 项目地址: https://gitcode.com/gh_mirrors/po/postman-portable 在现代API开发流程中,开发者常常面临工具安装繁…...
利用SoftEther实现跨平台虚拟私有网络部署指南
1. SoftEther简介与核心优势 如果你正在寻找一款能同时在Windows、Linux、Mac、Android和iOS上运行的虚拟私有网络解决方案,SoftEther绝对值得深入了解。这个源自日本筑波大学的开源项目,经过多年发展已经成为支持协议最全面的跨平台工具之一。我第一次…...
5分钟搞定USR-K5模块配置:串口转以太网通讯的保姆级教程
5分钟搞定USR-K5模块配置:串口转以太网通讯的保姆级教程 当你需要在嵌入式系统中快速实现串口设备与以太网的互联时,USR-K5模块是个不错的选择。这款小巧的串口转以太网模块,能够帮助开发者省去复杂的网络协议栈开发工作,特别适合…...
StructBERT中文语义匹配系统开发者案例:语义向量用于排序模型特征
StructBERT中文语义匹配系统开发者案例:语义向量用于排序模型特征 1. 项目核心价值:从“虚高”到“精准”的跨越 如果你做过搜索推荐或者内容去重,大概率遇到过这样的头疼事:两段明明不相关的文本,用传统的语义模型一…...
