SpringCloud开发实战(三):集成Eureka注册中心

目录
SpringCloud开发实战(一):搭建SpringCloud框架
SpringCloud开发实战(二):通过RestTemplate实现远程调用

Eureka简介

Eureka 是一个基于 Java 的开源技术,最广为人知的是作为 Netflix 开发的云原生架构的一部分,它主要用于构建微服务架构中的服务发现。在微服务架构中,应用程序被拆分成一组小的服务,每个服务运行在自己的进程中,并通过轻量级通信(通常是HTTP或消息队列)互相通信。随着服务数量的增长,手动管理服务间的交互变得越来越复杂,这就需要服务发现机制来动态地找到并连接到正确的服务实例。

Eureka 提供了一个RESTful服务端和客户端API,服务端作为注册中心,负责维护服务实例列表,包括它们的状态;客户端则用于服务实例的注册与发现。当服务启动后,它们会向 Eureka 注册中心注册自己,然后定时发送心跳以表明它们还“活着”。其他服务可以利用 Eureka 发现这些服务并通过解析得到的信息与之通信。

Eureka 的设计原则是优先考虑可用性,即使在出现分区的情况下,Eureka 仍然能够正常运行,只是牺牲了一部分准确性和健壮性。这是 CAP 定理在网络分区情况下选择 AP(可用性和分区容忍性)的结果。

一、为什么要引入Eureka

我们想想,假如我们的user-service部署了多个实例,如图:
在这里插入图片描述

我们大家来思考这几个问题:

order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?

有多个user-service实例地址,order-service调用时该如何选择?

order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

这些问题都需要利用SpringCloud中的注册中心来解决,其中最广为人知的注册中心就是Eureka,其结构如下:
在这里插入图片描述

回答之前的各个问题。

问题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拉取服务时,就能将故障实例排除了

二、搭建eureka-server

我们新建一个模块作为注册中心服务端:eureka-server,这必须是一个独立的微服务

2.1 引入eureka依赖

我们创建一个模块(过程略,没看过可以翻看之前文章),然后修改Pom文件,引入SpringCloud为eureka提供的starter依赖:

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

2.2 修改启动类

接着我们在启动类上添加一个@EnableEurekaServer注解,开启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);}
}

2.3 修改application.yml配置文件

我们将其他内容都去掉,只保留下面内容

server:port: 10086
spring:application:name: eureka-server
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka

2.4 项目结构

项目结构如下
在这里插入图片描述

2.5 启动服务

我们运行EurekaApplication,然后在浏览器访问:http://127.0.0.1:10086

看到下面结果应该是成功了:
在这里插入图片描述

三、服务注册

下面,我们将user-service注册到eureka-server中去。

3.1 引入依赖

我们在user-service的pom文件中,引入下面的eureka-client依赖:

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

3.2 配置文件

在user-service中,修改application.yml文件,添加服务名称、eureka地址,增加Mybatis的日志信息:

spring:application:name: userService
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

3.3 启动多个user-service实例

为了演示一个服务有多个实例的场景,我们添加一个SpringBoot的启动配置,再启动一个user-service。
首先,复制原来的user-service启动配置:

在这里插入图片描述
我们在弹出的窗口,填写信息,其中虚拟机选项输入

-Dserver.port=8083

在这里插入图片描述
如果这个菜单被隐藏了,我们可以点修改选项,然后选择Java里面的添加虚拟机选项。或者使用快捷键ALT+V
在这里插入图片描述
现在,服务窗口会出现两个user-service启动配置:
在这里插入图片描述
不过,第一个是8082端口,第二个是8083端口。启动两个user-service实例,然后查看eureka-server管理页面:
在这里插入图片描述

四、服务发现

下面,我们将order-service的逻辑修改:向eureka-server拉取user-service的信息,实现服务发现。

4.1 引入依赖

之前说过,服务发现、服务注册统一都封装在eureka-client依赖,因此这一步与服务注册时一致。在order-service的pom文件中,引入下面的eureka-client依赖:

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

4.2 修改application.yml

服务发现也需要知道eureka地址,因此第二步与服务注册一致,都是配置eureka信息:
在order-service中,修改application.yml文件,添加服务名称(服务名称别忘记加了)、eureka地址:

spring:application:name: orderService
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka

4.3 服务拉取和负载均衡

最后,我们要去eureka-server中拉取user-service服务的实例列表,并且实现负载均衡。
但是负载均衡的操作不用我们去做,只需要添加一些注解即可。
在order-service的OrderApplication中,给RestTemplate这个Bean添加一个**@LoadBalanced**注解:
在这里插入图片描述


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("org.demo.mapper")
@SpringBootApplication
public class OrderApplication {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}

然后我们要修改order-service服务中的OrderService,将类中的queryOrderById方法中访问的url路径,用服务名代替ip、端口:
在这里插入图片描述
spring会自动帮助我们从eureka-server端,根据userService这个服务名称,获取实例列表,而后完成负载均衡。

五、测试

我们清空两个UserApplication的日志,然后调用http://localhost:8081/order/101五次,查看日志信息如下
在这里插入图片描述
在这里插入图片描述
我们能看到UserApplication调用了三次,UserApplication(1)调用了两次。

至此,我们成功集成Eureka注册中心,如果文章有任何错误,还请大家指出。不胜感激!!!

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

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

相关文章

ElasticSearch学习笔记(六)自动补全、拼音分词器、RabbitMQ实现数据同步

文章目录 前言11 自动补全11.1 拼音分词器11.2 自定义分词器11.3 自动补全查询 12 数据同步12.1 实现方案12.1.1 同步调用12.1.2 异步通知12.1.3 监听binlog 12.2 异步通知实现数据同步12.2.1 声明交换机和队列12.2.2 发送MQ消息12.2.3 接收MQ消息并操作ES 前言 ElasticSearch…

互联网职场说 | “400w能否实现‘躺平’的生活”

近年来&#xff0c;“躺平”一词在国内职场中频频出现&#xff0c;表达了许多年轻人对工作压力和生活负担的不满与逃避心理。 近日&#xff0c;一位网友在社交平台上提出了一个引人深思的问题&#xff1a;“400万可以躺平吗&#xff1f;有房有车无贷款。” 网友们也各抒己见&a…

GB/T28181规范和JT1078交通部标差异

技术背景 好多开发者区分不太清楚GB/T28181和JT1078规范&#xff0c;实际上&#xff0c;二者在规范定义、技术特点、过检认证以及应用场景等方面均存在显著差异。两者各有其适用领域和优势&#xff0c;但在某些特定场景下也可能需要相互协作以实现更全面的监控和管理。 规范定…

[学术论文] KBS期刊介绍及投稿流程学习笔记

该专栏主要是论文投稿的记录笔记&#xff0c;希望对初学者有所帮助&#xff0c;也希望大家论文都能命中。这篇文章主要介绍人工智能一区期刊Knowledge-Based Systems的投稿笔记&#xff0c;希望您喜欢&#xff01; 文章目录 一.期刊介绍二.投稿地址及模板1.投稿地址2.LaTex下载…

[工具使用]git

git fetch 获取远程仓库内容&#xff0c;但未合入本地仓库&#xff1b; git rebase 获取远程仓库内容&#xff0c;并更改基地合入本地仓库&#xff1b; 将master分支的内容合入feature分支&#xff1a; 当在feature分支上执行git rebase master时&#xff0c;git会从master…

Datawhale X 李宏毅苹果书 AI夏令营-深度学习进阶task3:批量归一化

1.批量归一化 如果误差表面很崎岖&#xff0c;它比较难训练。批量归一化&#xff08;Batch Normalization&#xff0c;BN&#xff09;就是其中一个“把山铲平”的想法 如图 所示&#xff0c;假设两个参数对损失的斜率差别非常大&#xff0c;在 w1 这个方向上面&#xff0c;斜…

聚观早报 | 苹果推出AI消除功能;比亚迪2024上半年营收

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 8月30日消息 苹果推出AI消除功能 比亚迪2024上半年营收 真我GT7 Pro渲染图曝光 苹果iPhone 16开始印度量产 故宫…

旗帜分田(华为od机考题)

一、题目 1.原题 从前有个村庄&#xff0c;村民们喜欢在各种田地上插上小旗子&#xff0c;旗子上标识了各种不同的数字。 某天集体村民决定将覆盖相同数字的最小矩阵形的土地的分配给为村里做出巨大贡献的村民&#xff0c; 请问&#xff0c;此次分配土地&#xff0c;做出贡献…

MMsegmentation与MMdeploy简单使用

最近涉及到了图像分割的任务&#xff0c;于是拿来写下博客加深下使用。 MMsegmentation与MMdeploy的环境配置暂不做讲解&#xff0c;在官网和其他博客中有很多说明。 MMdeploy主要是把pt转为 onnx_int8的情况。 MMsegmentation环境配置可以参考 : 安装与配置MMSegmentation 目录…

DriveLM的baseline复现

DriveLM是一篇很有意思的工作&#xff0c;把自动驾驶跟MLLM结合到一起了&#xff0c;实现端到端的决策。 Repo&#xff1a;https://github.com/OpenDriveLab/DriveLM 该工作是基于nuScenes数据集做的&#xff0c;官方paper里给出了数据的具体构建方式&#xff0c;感兴趣的可以…

[HZNUCTF 2023 preliminary]easyAPK-快坚持不下去的第三天

第一做安卓题&#xff0c;前提jadx,java环境&#xff0c;模拟器&#xff0c;我配了好久&#xff0c; 这段代码实现了一个简单的登录界面&#xff0c;用户需要输入用户名和密码。用户名和密码会与预设的硬编码值进行比较&#xff0c;登录成功后会启动另一个 Activity。如果密码错…

★ 算法OJ题 ★ 力扣11 - 盛水最多的容器

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起做一道双指针算法题--盛水最多的容器~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 解法1&#xff1a;暴力枚举 …

Mysql基础练习题 620.有趣的电影 (力扣)

620.编写解决方案&#xff0c;找出所有影片描述为 非 boring (不无聊) 的并且 id 为奇数 的影片,返回结果按 rating 降序排列 题目链接&#xff1a; https://leetcode.cn/problems/not-boring-movies/ 建表插入数据&#xff1a; Create table If Not Exists cinema (id int…

【云原生系列之SkyWalking的部署】

1、分布式链路追踪 1.1概念 在较大的web集群和微服务环境中&#xff0c;客户端的一次请求需要经过不同的模块&#xff0c;多个不同中间件&#xff0c;多个不同机器一起相互协作才能处理完成客户端的请求&#xff0c;而在这一系列的请求过程之中,处理流程可能是串行执行,也可能…

论斜率优化dp

论斜率优化dp 1问题2暴力算法-线性dp3斜率优化线性dp4后记 1问题 如下图 看到这题&#xff0c;题面很复杂 其实可以转化为如下问题 有 n n n个任务&#xff0c;排成一个有序序列&#xff0c;我们要解决这些任务 总费用是每一个任务的完成时间乘以费用系数求和 每个任务之前…

sessionstorage和localstorage的使用与区别

sessionstorage和localstorage的使用与区别 localStorage和sessionStorage一样都是用来存储客户端临时信息的对象。他们均只能存储字符串类型的对象&#xff08;虽然规范中可以存储其他原生类型的对象&#xff0c;但是目前为止没有浏览器对其进行实现&#xff09;。 localStor…

Hadoop 下载

下载法一&#xff1a;官方下载 hadoop官网 1.选择要下载的版本&#xff0c;这里我以3.4.0为例进行说明&#xff1b; 2.跳转后&#xff0c;选择对应系统架构的&#xff0c;进行下载&#xff1b; 下载法二&#xff1a;国内镜像源下载 1.阿里云 这里我以mac m1为案例&#x…

Linux日志-wtmp日志

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux 系统中的日志是记录系统活动和事件的重要工具&#xff0c;它们可以帮助管理员监视系统状态、调查问题以及了解系统运行…

【保姆级教程】如何在Win11上搭建一个GPU环境

CUDA和CUDNN安装 CUDA安装 下载对应cuda环境 下载链接&#xff1a;https://developer.nvidia.com/cuda-downloads&#xff0c;图片下载的是 cuda_12.6.1_560.94_windows.exe 然后一路安装即可&#xff1a; 安装路径如下&#xff1a; CUDNN安装 打开cuDNN下载页面 解压后…

嵌入式基础知识-RS232通信协议电路与代码最全分析

1.RS232基本概念 RS232是异步通信&#xff0c;全双工传输&#xff08;异步通信就是无时钟CLK信号&#xff0c;全双工就是能同时收发数据&#xff09;。采用负逻辑传送&#xff0c;规定逻辑“1”的电平为-5V~-15 V&#xff0c;逻辑“0”的电平为5 V&#xff5e;15 V。选用该电气…