当前位置: 首页 > news >正文

搭建Eureka服务注册中心

一、前言

我们在别的章节中已经详细讲解过eureka注册中心的作用,本节会简单讲解eureka作用,侧重注册中心的搭建。
Eureka作为服务注册中心可以进行服务注册和服务发现,注册在上面的服务可以到Eureka上进行服务实例的拉取,主要作用就是进行请求时的负载均衡。在注册中心注册了orderService服务,但是这个服务有多个实例,实例A的端口是8001,实例B的端口是8002,在我们之前请求orderService服务的时候会指明具体的端口号,但指明了端口号,请求就总往一台服务上进行发送,其他服务就无法分担请求。这样orderService服务的集群就失效了,还是单台服务抗下了所有,但有了注册中心后,我们请求时就不需要声明具体的端口号,而是服务名,向指明了服务名的服务发起请求就可以了,请求会根据默认的请求规则(轮询),向A、B服务实例发起请求。

以下创建的模块,JDK为1.8,注意要在Project Structure中设置

## 二、搭建注册中心

1. 搭建SpringBoot项目

创建一个SpringBoot【cloud-eureka-demo】项目。

版本最好同我的一致:

  • SpringBoot选择2.3.12.RELEASE【这个版本必须搭配JDK1.8,17不行】

2. 搭建Eureka注册中心

在上面创建好的SpringBoot 项目上新建一个模块:【eureka-server】
在这里插入图片描述
虽然我们这里是新建模块,但是要注意新建模块有两种方式,上面创建的是一个独立的模块,与【cloud-eureka-demo】并不存在父子模块的关系,eureka与其他模块不存在依赖关系,应该作为独立模块存在,可以单独部署。在微服务项目中各个模块本身就是独立的一个服务,所以可以使用这种方式创建,项目结构目录直接帮我们创建好了,挺省事的。如果要创建父子关系的模块,可以使用下面的方式:
在这里插入图片描述
这里就会让我们选择父模块。

在微服务项目中使用Maven创建具有父子模块关系的项目结构好还是独立的模块好?


对于微服务项目,通常推荐使用Maven创建具有父子模块关系的项目结构。
使用Maven创建具有父子模块关系的项目可以带来以下几个优势:

  • 模块化管理:通过父子模块的关系,可以将不同的功能或服务划分为独立的子模块,并且可以分别进行构建、测试和部署。这样可以提高项目的可维护性和扩展性。注意:父子模块的关系并不会影响各个子模块的独立构建和部署。每个子模块都有自己的构建配置和插件配置,可以独立进行构建和部署。对于测试,也可以针对每个子模块进行独立的测试,以保证测试的独立性和有效性。
  • 依赖管理:通过在父模块中定义公共的依赖和版本信息,可以确保各个子模块之间的依赖关系是一致的。这样可以减少冲突和版本不一致的问题,并且简化了依赖管理的工作。
  • 统一构建和发布:使用父模块的pom.xml文件可以统一管理项目的构建配置和插件配置。这样可以确保各个子模块在构建过程中遵循相同的规范和流程,并且可以方便地进行整体构建和发布。
  • 可重用性:父模块可以作为一个通用的框架或基础设施模块,提供公共的代码、配置和工具类等,供子模块进行复用。这样可以提高代码的可重用性和开发效率。
    总之,使用Maven创建具有父子模块关系的项目结构可以提供更好的模块化管理、依赖管理和统一构建发布等优势。这种方式适用于较大型的微服务项目或者需要更灵活组织结构的项目。

对于微服务项目,使用独立的模块也是一种常见的方式,特别是当各个模块对应的是独立的服务时。
使用独立的模块可以带来以下几个优势:

  • 独立部署:每个模块可以独立进行构建、测试和部署,这样可以更灵活地对每个服务进行管理和扩展。如果某个模块需要进行升级或者有故障发生,可以只对该模块进行处理,而不会影响其他模块。
  • 解耦合:每个模块可以独立开发和维护,它们之间通过定义好的接口进行通信,从而实现了解耦合。这样可以提高系统的可维护性和可扩展性,也方便团队并行开发。
  • 技术栈灵活:不同的模块可以选择不同的技术栈和框架来实现,根据具体需求选择最适合的技术栈。这样可以充分发挥各个模块的特长,并且可以更好地满足业务需求。
  • 服务独立性:每个模块对应一个独立的服务,可以根据需要对每个服务进行独立的水平扩展和负载均衡配置,以满足不同的性能和可用性要求。
    总结来说,使用独立的模块可以提供更好的独立部署、解耦合、技术栈灵活性和服务独立性。这种方式适用于对每个服务的独立性要求较高的微服务项目。
2.1. 版本搭配
  • 引入Eureka依赖需要引入SpringCloud
  • SpringCloud->Hoxton.SR1版本与JDK8搭配

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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.lzk</groupId><artifactId>eureka-server</artifactId><version>0.0.1-SNAPSHOT</version><name>eureka-server</name><description>eureka-server</description><properties><java.version>8</java.version><spring-cloud.version>Hoxton.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
2.2. 配置文件
spring:application:name: eurekaserverserver:port: 10086eureka:client:# 是否将自身作为一个eureka服务注册register-with-eureka: false# 是否从服务上拉取服务实例fetch-registry: falseservice-url:defaultZone: http://localhost:10086/eureka
2.3. 启动类

在启动类上添加@EnableEurekaServer注解

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

启动服务后,如果出现以下错误是版本错误,检查项目是否是JDK8
在这里插入图片描述

在浏览器上访问:http://localhost:10086/,出现以下页面就是成功搭建了注册中心。
在这里插入图片描述

三、服务注册-提供者

1. 创建SpringBoot项目

创建一个名为【provider-server】的项目。

2. 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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.lzk</groupId><artifactId>provide-server</artifactId><version>0.0.1-SNAPSHOT</version><name>provide-server</name><description>provide-server</description><properties><java.version>8</java.version><spring-cloud.version>Hoxton.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><version>2.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

注意: 引入的eureka-client为:

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

而不是下面这个:引入这个依赖服务注册不到注册中心上去

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

3. 配置文件

application.yml

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

4. 启动类

在启动类上添加:@EnableEurekaClient注解,用于将服务注册到注册中心上

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

5. UserController

创建userController用于提供服务,便于后面测试:

@RestController
@RequestMapping("/user")
public class UserController {@GetMapping("/login")public String login(){return "8080 login success";}
}

6. 克隆服务

将上面的服务再创建一次,服务端口改为:8081,userController中改为return "8081 login success,便于测试。
我们这是创建服务提供者,服务提供者是为了给消费者提供服务,但二者身份不是唯一的,提供者可能也是一个消费者,消费者可能也是一个提供者。

7. 服务启动

两个服务启动后会注册到eureka上,可以在注册中心看到:
在这里插入图片描述

四、服务注册-消费者

1. 创建SpringBoot项目

创建一个名为【consumer-server】的服务

2. pom.xml

pom文件同服务提供者的一致

3. 配置文件

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

4. 启动类

同提供者一样,增加一个@EnableEurekaClient注解

5. OrderController

要调用服务提供者提供的服务。

@Bean注解将方法返回值注册到Spring容器中,@Bean要同@Component注解或其派生注解共同使用。

@RestController
@RequestMapping("order")
public class OrderController {@Bean@LoadBalancedpublic RestTemplate getRestTemplate(){return new RestTemplate();}@Autowiredprivate RestTemplate restTemplate;@GetMapping("/info")public String getOrderInfo(){String url = "http://userservice/user/login";String info = restTemplate.getForObject(url, String.class);return "订单滴滴:" + info;}
}

6. 服务启动访问

在这里插入图片描述
访问:http://localhost:8083/order/info
在这里插入图片描述
在这里插入图片描述
由于RestTemplate添加了@LoadBalanced注解,所以请求会被负载均衡,这也是注册中心的作用所在,eureka还会进行服务健康监测,例如:8082端口的userservice服务宕机,那么该服务会从服务实例中剔除,下次orderservice拉取服务实例时,就拉取不到8082的userservice了。

userservice会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳
当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除

相关文章:

搭建Eureka服务注册中心

一、前言 我们在别的章节中已经详细讲解过eureka注册中心的作用&#xff0c;本节会简单讲解eureka作用&#xff0c;侧重注册中心的搭建。 Eureka作为服务注册中心可以进行服务注册和服务发现&#xff0c;注册在上面的服务可以到Eureka上进行服务实例的拉取&#xff0c;主要作用…...

【React】react-router-dom中的HashRouter和BrowserRouter实现原理

1. 前言 在之前整理BOM的五个对象时&#xff0c;提到&#xff1a; location.hash发生改变后&#xff0c;会触发hashchange事件&#xff0c;且history栈中会增加一条记录&#xff0c;但页面不会重新加载——实现HashRouter的关键history.pushState(state, , URL)执行后&#xf…...

生物信息学中的可重复性研究

科学就其本质而言&#xff0c;是累积渐进的。无论你是使用基于网络的还是基于命令行的工具&#xff0c;在进行研究时都应保证该研究可被其他研究人员重复。这有利于你的工作的累积与进展。在生物信息学领域&#xff0c;这意味着如下内容。 工作流应该有据可查。这可能包括在电脑…...

css-img图像同比缩小

1. HTML 中使图像按比例缩小 CSS 来控制图像的大小&#xff0c;并保持其宽高比 <!DOCTYPE html> <html> <head><style>.image-container {width: 300px; /* 设置容器宽度 */height: auto; /* 让高度自适应 */}.image-container img {width: 100%; /* …...

SpringBoot+Prometheus+Grafana搭建应用监控系统

1.应用监控系统介绍 SpringBoot的应用监控方案比较多&#xff0c;SpringBootPrometheusGrafana是比较常用的一种解决方案&#xff0c;主要的监控数据的处理逻辑如下&#xff1a; SpringBoot 的 actuator 提供了应用监控端点&#xff0c;可以对外暴露监控数据信息。Prometheu…...

QT c++和qml交互实例

文章目录 一、demo效果图二、c和qml交互的基本方式1、qml 调用 C 类对象2、C 类对象调用 qml3、qml 给 C 发送信号4、C 给 qml 发送信号 三、关键代码1、工程结构图2、c代码MainWindow.cppMainQuickView.cppStudentInfoView.cppStudentInfoModel.cpp 3、qml代码main.qmlMainQui…...

mysql基础-数据操作之增删改

目录 1.新增数据 1.1单条数据新增 1.2多条数据新增 1.3查询数据新增 2.更新 2.1单值更新 2.2多值更新 2.3批量更新 2.3.1 批量-单条件更新 2.3.2批量-多条件更新 2.4 插入或更新 2.5 联表更新 3.删除 本次分享一下数据库的DML操作语言。 操作表的数据结构&#xf…...

写字母(文件)

请编写函数&#xff0c;将大写字母写入文件中。 函数原型 void WriteLetter(FILE *f, int n);说明&#xff1a;参数 f 为文件指针&#xff0c;n 为字母数目(1 ≤ n ≤ 26)。函数将前 n 个大写英文字母写入 f 所指示的文件中。 裁判程序 #include <stdio.h> #include &…...

基于Jackson自定义json数据的对象转换器

1、问题说明 后端数据表定义的id主键是Long类型&#xff0c;一共有20多位。 前端在接收到后端返回的json数据时&#xff0c;Long类型会默认当做数值类型进行处理。但前端处理20多位的数值会造成精度丢失&#xff0c;于是导致前端查询数据出现问题。 测试前端Long类型的代码 …...

【Java】缓存击穿解决方案

文章目录 什么是SingleFlight&#xff1f;优化缺点优化策略 什么是SingleFlight&#xff1f; SingleFlight是go语言中sync包中的一个东西。它用于确保在并发环境下某个操作&#xff08;例如&#xff0c;函数调用&#xff09;即使被多个goroutine同时请求&#xff0c;也只会被执…...

【HarmonyOS】掌握 Stage 模型的核心概念与应用

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…...

2024年甘肃省职业院校技能大赛 “信息安全管理与评估”赛项样题卷①

2024年甘肃省职业院校技能大赛 高职学生组电子与信息大类信息安全管理与评估赛项样题 第一阶段&#xff1a;第二阶段&#xff1a;模块二 网络安全事件响应、数字取证调查、应用程序安全第二阶段 网络安全事件响应第一部分 网络安全事件响应第二部分 数字取证调查第三部分 应用程…...

我的AI之旅开始了

知道重要&#xff0c;但是就是不动。 今天告诉自己&#xff0c;必须开始学习了。 用这篇博文作为1月份AI学习之旅的起跑点吧。 从此&#xff0c;无惧AI&#xff0c;无惧编程。 AI之路就在脚下。 AI&#xff0c;在我理解&#xff0c;就是让机器变得更加智能&#…...

Day25 235二叉搜索树的公共祖先 701二叉搜索树插入 450二叉搜索树删除

235 二叉搜索树的最近公共祖先 如果利用普通二叉树的方法&#xff0c;就是利用后序遍历回溯从低向上搜索&#xff0c;遇到左子树有p&#xff0c;右子树有q&#xff0c;那么当前结点就是最近公共祖先。本题是二叉搜索树&#xff0c;所以说是有序的&#xff0c;一定能够简化上面…...

android系列-init 挂载文件系统

1.init 挂载文件系统 //android10\system\core\init\main.cppint main(int argc, char** argv) {return FirstStageMain(argc, argv); } //android10\system\core\init\first_stage_init.cppint FirstStageMain(int argc, char** argv) {CHECKCALL(mount("tmpfs",…...

Spring 七种事务传播性介绍

作者&#xff1a;vivo 互联网服务器团队 - Zhou Shaobin 本文主要介绍了Spring事务传播性的相关知识。 Spring中定义了7种事务传播性&#xff1a; PROPAGATION_REQUIRED PROPAGATION_SUPPORTS PROPAGATION_MANDATORY PROPAGATION_REQUIRES_NEW PROPAGATION_NOT_SUPPORTED…...

Count the Colors ZOJ - 1610

题目链接 题意&#xff1a; 给定n个区间[ l, r ]和颜色c, 每次给[l, r]涂上c这个颜色. 后面的涂色会覆盖之前的涂色. 最后要求输出区间[0, 8000]中每种颜色及其出现的次数, 如果该颜色没有出现过则不输出. 思路&#xff1a;典型的线段树区间染色问题&#xff0c;一般这种题…...

MATLAB点云处理总目录

一、点云滤波 原始点云包含过多噪点和冗余点&#xff0c;滤波和采样往往是点云预处理的必要步骤 1.滤波 重复点去除 NAN或INF无效点去除 自定义半径滤波 2.采样 基于空间格网的点云抽稀 随机下采样 均匀体素下采样 非均匀体素下采样 二、邻近搜索 如何组织点云快速获取当前…...

C语言逗号表达式如何计算

在 C 语言中&#xff0c;逗号表达式是一种特殊的表达式形式&#xff0c;它由逗号分隔的多个表达式组成。 逗号表达式的计算过程如下&#xff1a;1、从左到右依次计算每个表达式的值。2、最终返回的值是最右边表达式的值。3、逗号表达式的求值过程是顺序执行的&#xff0c;不会…...

Ubuntu 本地部署 ChatGPT-Next-Web

Ubuntu 本地部署 ChatGPT-Next-Web 文章目录 Ubuntu 本地部署 ChatGPT-Next-Web ChatGPT-Next-Web 项目地址&#xff1a;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 本文主要演示如何在 Ubuntu 本地&#xff08;默认是端口 3000&#xff09;部署 ChatGPT-Next-Web&am…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...