搭建Eureka服务注册中心

news2025/1/19 12:53:50

一、前言

我们在别的章节中已经详细讲解过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: eurekaserver

server:
  port: 10086

eureka:
  client:
    # 是否将自身作为一个eureka服务注册
    register-with-eureka: false
    # 是否从服务上拉取服务实例
    fetch-registry: false
    service-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
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
    
    @Autowired
    private 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会认为微服务实例故障,将该实例从服务列表中剔除

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

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

相关文章

C++ 开发 + VSCode 调试

C 开发 VSCode 调试 MSYS2 安装 gcc、make下载安装MSMYS2pacman 添加镜像源 GCC1. 安装2. 查看结果3. 环境变量 GDB VSCode 调试所需插件创建项目调试代码1. tasks.json 配置任务2. launch.json 配置调试3. 运行 更进一步的 C/C 设置 参考资料 MSYS2 安装 gcc、make 下载 官…

CHS_01.1.5+操作系统引导

CHS_01.1.5操作系统引导 操作系统的引导一个新的磁盘安装操作系统后操作系统引导&#xff08;开机过程&#xff09; 操作系统的引导 我们会学习操作系统的引导 那你可能看见这个词的时候会觉得莫名其妙不明 绝地 什么是操作系统的引导呢 简单来说就是当你在开机的时候 如何让…

qt 实现登录界面

#include "mainwidget.h"MainWidget::MainWidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("有道笔记");this->setWindowIcon(QIcon("C:\\Users\\18801\\Desktop\\ydIcon\\icon")); // this->setStyleSheet("…

esp32UART串口外设(Arduino)

通用异步接收器/发送器 &#xff08;UART&#xff09; 介绍 通用异步接收器/发送器 &#xff08;UART&#xff09; 是一种硬件功能&#xff0c;它使用广泛采用的异步串行通信接口&#xff08;如 RS232、RS422 和 RS485&#xff09;处理通信&#xff08;即时序要求和数据成帧&…

torch.nn.CrossEntropyLoss()

torch.nn.CrossEntropyLoss(weight=None,size_average=None,ignore_index=-100,reduce=None,reduction=mean,label_smoothing=0.0) 计算过程 nn.CrossEntropyLoss()=nn.LogSoftmax()+nn.NLLLoss() import torch import torch.nn as nnloss_func = nn.CrossEntropyLoss() pre…

Windows11快速安装Android子系统

很多小伙伴想在电脑运行一下安卓程序&#xff0c;或则上班用手机摸鱼不方便&#xff0c;用电脑又没有想要的手机软件&#xff0c;那么怎么用电脑来安装安卓软件呢&#xff1f; 首先设置地区 安装Android子系统的前提需要安装 Amazon Appstore 这个应用&#xff0c;内地不能下载…

【CV】计算两个向量的夹角,并使用 OpenCV 可视化弧线

背景 基于人体/动物&#xff0c;骨骼点数据&#xff0c;计算关节角度 1. 原理 计算两个向量的夹角&#xff0c;我们已三个点为例&#xff0c;BA 向量和BC向量&#xff0c;求 B 的角度。若为四个点&#xff0c;延长交叉即可。 2. 效果 效果图如下 3. 核心代码 def comput…

vue2源码解析之第一步(对数据进行劫持)

###环境搭建 第一步 创建项目&#xff1a; npm init -y 第二步 安装对应的插件&#xff1a; npm i rollup rollup-plugin-babel babel/core babel/preset-env --save-dev 第三步 全局下创建rollup配置文件 rollup.config.js import babel from rollup-plug…

JVM工作原理与实战(十一):双亲委派机制

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、双亲委派机制 1.双亲委派机制详解 2.父类加载器 3.双亲委派机制的主要作用 二、双亲委派机制常见问题 总结 前言 ​JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字…

CDN的介绍以及加速内容传输原理

目前在公司的开发过程中&#xff0c;发现很多存储在oss的静态资源&#xff08;图片&#xff0c;安装包&#xff09;的链接中域名都使用了cdn域名&#xff0c;后面了解到这个cdn域名的主要作用是加速资源的访问&#xff0c;于是抽空了解了一下CDN加速原理。 目前使用得比较多的是…

【大厂算法面试冲刺班】day0:数据范围反推时间复杂度

常见算法的时间复杂度 规定n是数组的长度/树或图的节点数 二分查找&#xff1a;O(logn) 双指针/滑动窗口&#xff1a;O(n) DFS/BFS&#xff1a;O(n) 构建前缀和&#xff1a;O(n) 查找前缀和&#xff1a;O(1) 一维动态规划&#xff1a;O(n) 二维动态规划&#xff1a;O(n^2) 回溯…

Java后端返回的MySQL日期数据在前端格式错误的解决方法,区分jackson和fastjson

写在前面 在写web项目的时候经常会遇到后端返回的MySQL日期数据(date)类型在前端显示不正确的情况&#xff0c;有的时候会出现一串数字的时间戳&#xff0c;有的时候显示为日期晚了一天。 这是因Json给前端返回数据的时候格式问题造成的 解决方法 其实总结起来就是一句话在…

【Docker】私有仓库

目录 1.搭建 2. 上传镜像 3.拉取镜像 1.搭建 1.拉取私有仓库的镜像 docker pull registry 2.创建私有仓库容器 docker run -id --nameregistry -p 5000:5000 registry 3.打开浏览器,输入地址&#xff08;http:私有仓库服务器ip:5000/v2/_catalog&#xff09; 出现如图表示私…

Python - 深夜数据结构与算法之 Two-Ended BFS

目录 一.引言 二.双向 BFS 简介 1.双向遍历示例 2.搜索模版回顾 三.经典算法实战 1.Word-Ladder [127] 2.Min-Gen-Mutation [433] 四.总结 一.引言 DFS、BFS 是常见的初级搜索方式&#xff0c;为了提高搜索效率&#xff0c;衍生了剪枝、双向 BFS 以及 A* 即启发式搜索…

1.1数算选择题(循环队列、二叉树、查找、堆、顺序表、生成树、哈夫曼树、排序)

循环队列 front&#xff1a;头指针 rear&#xff1a;尾指针 m&#xff1a;循环队列的长度 元素个数&#xff08;rear-frontm&#xff09;%m 19-114048%408 11-194032%4032 二叉树 入度出度&#xff0c;n-1n0n1n2-1n12n2,有n21n0,对于完全二叉树&#xff0c;度为1的节点要…

挑战Transformer的新架构Mamba解析以及Pytorch复现

今天我们来详细研究这篇论文“Mamba:具有选择性状态空间的线性时间序列建模” Mamba一直在人工智能界掀起波澜&#xff0c;被吹捧为Transformer的潜在竞争对手。到底是什么让Mamba在拥挤的序列建中脱颖而出? 在介绍之前先简要回顾一下现有的模型 Transformer:以其注意力机制而…

重学JavaScript高级(八):ES6-ES12新增特性学习

ES6-ES12新增特性学习 ES6–对象字面量增强 属性的简写方法的简写计算属性名 let name "zhangcheng" //我想让sum作为obj的key值 let objKey "sum" let obj {//属性名的简写name//等同于name:name//方法的简写running(){}//等同于running:function()…

RT-DETR 更换骨干网络之 MobileNetV3 | 《搜寻 MobileNetV3》

论文地址:https://arxiv.org/abs/1905.02244 代码地址:https://github.com/xiaolai-sqlai/mobilenetv3 我们展示了基于互补搜索技术和新颖架构设计相结合的下一代 MobileNets。MobileNetV3通过结合硬件感知网络架构搜索(NAS)和 NetAdapt算法对移动设计如何协同工作,利用互…

使用 Open3D 的 3D LiDAR 可视化:用于自动驾驶的 2D KITTI 深度框架-含数据集+源码

3D LiDAR传感器(或)3维 光探测和测距是一种先进的发光仪器,能够像我们人类一样在3维空间中感知现实世界。这项技术尤其彻底改变了地球观测、环境监测、侦察以及现在的自动驾驶领域。它提供准确和详细数据的能力有助于增进我们对环境和自然资源的理解和管理。 在这篇权威研究…

仿stackoverflow名片与b站名片实现(HTML、CSS)

目录 前言一、仿stackoverflow名片HTMLCSS 二、仿b站名片HTMLCSS 素材 前言 学习自ACwing - Web应用课 一、仿stackoverflow名片 HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport&…