搭建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注册中心的作用,本节会简单讲解eureka作用,侧重注册中心的搭建。 Eureka作为服务注册中心可以进行服务注册和服务发现,注册在上面的服务可以到Eureka上进行服务实例的拉取,主要作用…...
【React】react-router-dom中的HashRouter和BrowserRouter实现原理
1. 前言 在之前整理BOM的五个对象时,提到: location.hash发生改变后,会触发hashchange事件,且history栈中会增加一条记录,但页面不会重新加载——实现HashRouter的关键history.pushState(state, , URL)执行后…...
生物信息学中的可重复性研究
科学就其本质而言,是累积渐进的。无论你是使用基于网络的还是基于命令行的工具,在进行研究时都应保证该研究可被其他研究人员重复。这有利于你的工作的累积与进展。在生物信息学领域,这意味着如下内容。 工作流应该有据可查。这可能包括在电脑…...
css-img图像同比缩小
1. HTML 中使图像按比例缩小 CSS 来控制图像的大小,并保持其宽高比 <!DOCTYPE html> <html> <head><style>.image-container {width: 300px; /* 设置容器宽度 */height: auto; /* 让高度自适应 */}.image-container img {width: 100%; /* …...
SpringBoot+Prometheus+Grafana搭建应用监控系统
1.应用监控系统介绍 SpringBoot的应用监控方案比较多,SpringBootPrometheusGrafana是比较常用的一种解决方案,主要的监控数据的处理逻辑如下: SpringBoot 的 actuator 提供了应用监控端点,可以对外暴露监控数据信息。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操作语言。 操作表的数据结构…...
写字母(文件)
请编写函数,将大写字母写入文件中。 函数原型 void WriteLetter(FILE *f, int n);说明:参数 f 为文件指针,n 为字母数目(1 ≤ n ≤ 26)。函数将前 n 个大写英文字母写入 f 所指示的文件中。 裁判程序 #include <stdio.h> #include &…...
基于Jackson自定义json数据的对象转换器
1、问题说明 后端数据表定义的id主键是Long类型,一共有20多位。 前端在接收到后端返回的json数据时,Long类型会默认当做数值类型进行处理。但前端处理20多位的数值会造成精度丢失,于是导致前端查询数据出现问题。 测试前端Long类型的代码 …...
【Java】缓存击穿解决方案
文章目录 什么是SingleFlight?优化缺点优化策略 什么是SingleFlight? SingleFlight是go语言中sync包中的一个东西。它用于确保在并发环境下某个操作(例如,函数调用)即使被多个goroutine同时请求,也只会被执…...
【HarmonyOS】掌握 Stage 模型的核心概念与应用
从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…...
2024年甘肃省职业院校技能大赛 “信息安全管理与评估”赛项样题卷①
2024年甘肃省职业院校技能大赛 高职学生组电子与信息大类信息安全管理与评估赛项样题 第一阶段:第二阶段:模块二 网络安全事件响应、数字取证调查、应用程序安全第二阶段 网络安全事件响应第一部分 网络安全事件响应第二部分 数字取证调查第三部分 应用程…...
我的AI之旅开始了
知道重要,但是就是不动。 今天告诉自己,必须开始学习了。 用这篇博文作为1月份AI学习之旅的起跑点吧。 从此,无惧AI,无惧编程。 AI之路就在脚下。 AI,在我理解,就是让机器变得更加智能&#…...
Day25 235二叉搜索树的公共祖先 701二叉搜索树插入 450二叉搜索树删除
235 二叉搜索树的最近公共祖先 如果利用普通二叉树的方法,就是利用后序遍历回溯从低向上搜索,遇到左子树有p,右子树有q,那么当前结点就是最近公共祖先。本题是二叉搜索树,所以说是有序的,一定能够简化上面…...
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 七种事务传播性介绍
作者:vivo 互联网服务器团队 - Zhou Shaobin 本文主要介绍了Spring事务传播性的相关知识。 Spring中定义了7种事务传播性: PROPAGATION_REQUIRED PROPAGATION_SUPPORTS PROPAGATION_MANDATORY PROPAGATION_REQUIRES_NEW PROPAGATION_NOT_SUPPORTED…...
Count the Colors ZOJ - 1610
题目链接 题意: 给定n个区间[ l, r ]和颜色c, 每次给[l, r]涂上c这个颜色. 后面的涂色会覆盖之前的涂色. 最后要求输出区间[0, 8000]中每种颜色及其出现的次数, 如果该颜色没有出现过则不输出. 思路:典型的线段树区间染色问题,一般这种题…...
MATLAB点云处理总目录
一、点云滤波 原始点云包含过多噪点和冗余点,滤波和采样往往是点云预处理的必要步骤 1.滤波 重复点去除 NAN或INF无效点去除 自定义半径滤波 2.采样 基于空间格网的点云抽稀 随机下采样 均匀体素下采样 非均匀体素下采样 二、邻近搜索 如何组织点云快速获取当前…...
C语言逗号表达式如何计算
在 C 语言中,逗号表达式是一种特殊的表达式形式,它由逗号分隔的多个表达式组成。 逗号表达式的计算过程如下:1、从左到右依次计算每个表达式的值。2、最终返回的值是最右边表达式的值。3、逗号表达式的求值过程是顺序执行的,不会…...
Ubuntu 本地部署 ChatGPT-Next-Web
Ubuntu 本地部署 ChatGPT-Next-Web 文章目录 Ubuntu 本地部署 ChatGPT-Next-Web ChatGPT-Next-Web 项目地址:https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 本文主要演示如何在 Ubuntu 本地(默认是端口 3000)部署 ChatGPT-Next-Web&am…...
小程序商城搭建:快速入门指南
随着移动互联网的普及,小程序商城逐渐成为了商家们进行线上销售的重要渠道。如果你也想搭建一个小程序商城,那么本文将为你介绍如何使用乔拓云这一第三方小程序搭建平台来轻松搭建自己的小程序商城。 一、选择合适的第三方小程序搭建平台 在选择第三方小…...
c# windows10大小端试
测试代码: unsafe public void ceshi() {byte[] by BitConverter.GetBytes(0x12345678);Debug.WriteLine(" byte[0] 0x" by[0].ToString("x2"));Debug.WriteLine(" byte[1] 0x" by[1].ToString("x2"));Debug.WriteLi…...
【算法专题】动态规划之斐波那契数列模型
动态规划1.0 动态规划 - - - 斐波那契数列模型1. 第 N 个泰波那契数2. 三步问题3. 使用最小花费爬楼梯4. 解码方法 动态规划 - - - 斐波那契数列模型 1. 第 N 个泰波那契数 题目链接 -> Leetcode -1137. 第 N 个泰波那契数 Leetcode -1137. 第 N 个泰波那契数 题目&…...
K2P路由器刷OpenWrt官方最新版本固件OpenWrt 23.05.2方法 其他型号的智能路由器OpenWrt固件刷入方法也基本上适用
最近路由器在开机时总出问题,于是就那他来开刀,直接刷一个OpenWrt官方最新版本的固件, 刷其他第三方的固件总是觉得不安全, 而且很多第三方固件都带了些小工具,始终会有安全隐患, 而且占用内存空间太多,本来这个东西就没有多少内存,于是就干脆刷一个官方的原始固件(才6.3M, 相…...
AI大语言模型会带来了新一波人工智能浪潮?
以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...
How to view the high-tech zone atmospheric project
How to view the high-tech zone atmospheric project 问题与建议登录界面没有验证码部分页面加载时间过长联动型下拉列表框点击反应迟钝页面缺乏导航没有采用https协议没有完成域名实名认证左侧菜单区不能收缩大屏区域功能图层不能完全隐藏部分页面表单控件没有文案提示其功能…...
sqlalchemy 中的缓存机制解释
SQLAlchemy 的缓存机制主要涉及两个层面:会话(Session)缓存和查询缓存。这两种缓存机制对于提升应用性能和数据一致性都非常重要。下面详细解释这两种缓存机制: 1. 会话(Session)缓存 会话缓存是 SQLAlch…...
网络安全B模块(笔记详解)- 漏洞扫描与利用
漏洞扫描与利用 1.通过Kali对服务器场景server2003以半开放式不进行ping的扫描方式并配合a,要求扫描信息输出格式为xml文件格式,从生成扫描结果获取局域网(例如172.16.101.0/24)中存活靶机,以xml格式向指定文件输出信息(使用工具Nmap,使用必须要使用的参数),并将该操…...
【C语言】指针——从底层原理到应用
C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻 目录 一、前言二、变量与指针的本质 1. 内存地址2. 32位与64位系统3. 变量4. 指针变量5. 操作指针变量 5.1 指针变量自身的值5.2 获取指针变量所指向的数据5.3 以什么样的数据类型来使用/解释指针变量所指…...
想了解步进伺服的朋友可以了解下这个方案
TMC4361A 是一款小型化、高性能的驱动步进电机的运动控制器。实用于很多的斜坡轮廓的应用,特别是速度快、限制过冲的运动场合。用户根据自己的要求实现 S 形或 sixPoint™六点式速度轮廓配置及闭环或开环的操作、动态修改运动参数。TMC4361A 包含 SPI接口、Step/Dir…...
做视频网站适合用什么服务器/松原头条新闻今日新闻最新
我们在写程序的时候经常会打一些日志来帮助我们查找问题,这次学习一下logging模块,在python里面如何操作日志。介绍一下logging模块,logging模块就是python里面用来操作日志的模块,logging模块中主要有4个类,分别负责不…...
基于asp.net网站开发视频教程/自己做网站难吗
微信回复图文消息 一级POJO只能包含一级子元素,如果是多级子元素,就包含多级对象就可以了; XmlRootElement(name"xml") XmlAccessorType(XmlAccessType.FIELD) public class ScanUrl {private Integer id;XmlElement(name"ToU…...
开发公司和建材商促销活动/seo推广方式是什么呢
达索系统宣布在7月10日至14日于新加坡举行的世界城市峰会上展示3DEXPERIENCE平台如何帮助全球的行业、政府和市民构想、开发并体验可持续城市解决方案。 随着智能产品、3D打印和自动化的出现,工业领域已经在各个层面上发生了变化。而这些趋势将会影响全球经济和整个…...
web网站性能测试怎么做/网站推广联盟
什么是ORM?就是对象关系映射(Object Relational Mapping,简称ORM)模式,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的一种技术。 我们在开发项目的时候,是不是总要建立实体类(Modlue Class)?例如下面是…...
网页网站导读怎么做/seo文章代写平台
有些资料讲如果要支持目录必须使用iiswriter,或者其他软件,其实通过简单对iis配置,再利用urlwriter就可以完美解决url重写的问题可以将http://abc.domain.com/blog转向到http://www.domain.com/xxx.aspx?usernameabc当然首先要将主机的泛域名支持打开。…...
dw做视频网站/百度付费推广
http://poj.org/problem?id2559 题意都懂,给出数列h1,h2,...hn。代表n个宽为1,高为hi的矩形,求最大连续的矩形面积。 思路:对于每个矩形,当然高已经决定,我们思考它的宽可以为多少。很容易得出它的宽可以向…...