详解Eureka服务注册和调用

目录

1.概述

2.环境

2.1.项目结构

2.2.项目架构

2.3.依赖

3.注册中心

3.1.配置使用

3.2.管理页

3.3.集群

4.服务注册

5.服务调用

5.2.Ribbon

5.3.Feign

5.4.OpenFeign


1.概述

我们把从外部进入到微服务集群里的流量称为“南北流量”、微服务集群节点间流转的流量称为“东西流量”。就“南北流量”而言微服务架构其实仍然是一个中心化的架构,这个中心是“目录”,因为需要一个“目录”来记录服务的相关信息(诸如部署在哪台服务器上),“南北流量”才能找得到服务。这个"目录"在微服务体系中被称为“注册中心”。注册中心是微服务体系中最重要的一个组件,在Netflix版本的spring cloud中,注册中心组件是——eureka。

服务提供者向注册中心(Eureka Server)中注册数据,消费者在注册中心(Eureka Server)中获取数据。系统中的微服务使用Eureka客户端链接到Eureka Server中,并且维持心跳(即固定时间向server发送信号,证明自己存活。)

3f010a2d57bc44c3929635624023fddf.png

以上整个流程中,有两个组件的参与:

  • 注册中心
  • 远程服务调用组件

在Netflix版的spring cloud中注册中心一直都是eureka,但是远程服务调用组件有好几个可选:

  • Ribbon
  • Feign
  • OpenFeign。

它们之间从上到下都是逐渐优化、取代的关系。

本文会首先讲使用eureka进行服务注册,然后顺序的讲以上几种远程服务调用组件的使用和其相较于前一个的优化点在哪里。

2.环境

2.1.项目结构

f77f7640556d4341a8bf7ff4a6d71a52.png

整个示例项目用标准的maven结构,分为三个子module:

  • eureka,注册中心
  • userService,服务提供者
  • consumer,服务调用者

整个项目的依赖的版本管理在最顶层的父级pom.xml中进行。

2.2.项目架构

整个示例项目之所以分为三部分是希望在服务调用者和服务之间使用通信组件来展示如何结合注册中心来进行服务间的通信:

57985a07acbd488c81204921c264f5e2.png

2.3.依赖

spring官网,进入spring cloud的项目,项目首页详细记录着Netflix版本的spring cloud和spring boot之间的版本对应关系:

327dc33e149b496dac0d19b5749d8fa4.png

本项目我们选取spring boot 2.6.Xspring cloud Netflix aka jubilee。

在最顶级的父pom中引入依赖:

 <properties>
        <spring-cloud.version>2021.0.7</spring-cloud.version>
        <spring-boot.version>2.6.10</spring-boot.version>
    </properties>
    <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>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

3.注册中心

3.1.配置使用

依赖:

0f066b4c876c42cc86f33b98bdd9643f.png

配置:

a9ae69d42d474828bd096b37daed03dd.png

启动:

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain.class);
    }
}

3.2.管理页

通过IP+端口号的方式可以访问到eureka server的管理页:

整个管理页里面最重要的一部分是框起来的这部分,这部分显示的是注册在当前eureka server上的服务有哪些,目前还没有服务注册,所以没有显示任何东西。

0b584b7bd7dc4a628d6ea7730380b845.png

3.3.集群

eureka支持集群模式用于相互冗余容灾。eureka集群的配置很简单,没必要单独写了例子,以下是博主之前做的eureka的集群配置文件,看后会一目了然。

在每个eureka上关联其它eureka:

362efe9726a545588320a18d472450ba.png

 服务注册到所有eureka上:

32370aef2e5f469ebba21f6711dcdbf0.png

4.服务注册

注册中心已经准备好了,接下来我们要准备一个服务,将它注册到配置中心上。
依赖:

219da76711e8446185e49a32d368dfd5.png

配置:

0ecd5d6e60224e5b95b318561dbf453b.png

启动:

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

启动服务后,可以在eureka server上查看服务是否已经注册: 

6bb460a189634e888562a16acfda092f.png

5.服务调用

准备好注册中心、注册好服务后,接下来就是如何调用服务的问题了。也就是如何用以下几种组件来调用服务:

  • Ribbon
  • Feign
  • OpenFeign

5.2.Ribbon

ribbon只是一个负载均衡组件,需要依赖于其它HTTP通信组件来实现通信,一般用ribbon+spring boot自带的RestTemplate。

依赖:

eureka的以来里集成了ribbon,所以要使用ribbon来调服务的时候,直接引入eureka的依赖即可。

59975dff3e7e414098e545cd5d33a227.png

配置:

@LoadBalanced用来将RestTemplate托管给ribbon来管理。

2d3da4cd755f4dbc989e803402a1bb63.png

a3b3510bbc5d45df9acd2c4743fbaa03.png

服务调用:

ef71b7117e0249dda00285ed6dd08c52.png 结果:

f5cd5143680f43ec9216d7ee2f0e9e48.png

5.3.Feign

ribbon+restTemplate可以完成服务的调用以及负载均衡,但是存在一个很明显的地方就是服务名直接写死,不便于维护。srping体系中主体思想是依赖倒置,也就是面向接口编程,所以社区推出了Feign,其封装了ribbon和http请求工具,使得其除了能完成负载均衡和http请求以外,可以面向接口编程来完成服务调用。

依赖:

78a7b4f555464513b483707bca7b10d7.png

服务层:

7752a45e57484571a6178a5e3128924e.png 服务调用:

a794982e4c4e41669e065a9f6529873b.png 开启Feign:

e497bf6d566748a1901bbd155344a089.png

结果:

f5326f1139a6460ba07ef9b0ac4fb5cd.png

5.4.OpenFeign

feign面向接口的、声明式的服务调用组件,其封装了ribbon,目的是简化服务调用代码,使得服务调用具有rest风格。Openfeigin是feigin的升级版,增强了对springMVC注解的支持。

以上是博主写过的一个OpenFeign的示例。

依赖:

5bf7e8479d7b4da18a9f1220d13e9f56.png

 启动:

7a532e9362704fcd8c02bf8ced57b82d.png

服务层:

96dc16d710be49c79ee0f9f50edf9829.png

服务调用:

84655da40d274dc9a5bffa1f765e1640.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开发短视频电商 Jmeter插件安装和常用插件

Jmeter插件安装和常用插件 插件安装方式 一种是手动安装各种插件&#xff0c;下载对应的jar包&#xff0c;放到lib\ext目录下就可以使用了。另一种是通过漂亮的 UI &#xff0c;jmeter 插件管理器Plugins Manager可以方便的管理其他插件的下载和更新。安装一次插件管理器&…

数据库SQL查询(一)

本文介绍SQL查询&#xff0c;如何在海量数据中筛选想要数据&#xff1b; 数据库管理系统选择&#xff1a;关系型数据库mysql 数据库管理工具选择&#xff1a;navicat 本文中查询语句和查询案例参考自&#xff1a;https://edu.csdn.net/course/detail/27673?ops_request_mis…

面试专题:计算机网络常见面试点总结

socket、tcp、udp、http 的认识及区别 socket、tcp、udp、http 的认识及区别​ 一、先来一个讲TCP、UDP和HTTP关系的 1、TCP/IP是个协议组&#xff0c;可分为三个层次&#xff1a;网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传…

【Django 网页Web开发】24. 实战项目:moudleForm的文件上传应用到城市管理(17)(保姆级图文)

目录 用户上传文件存放media如何启用1. 在urls.py中进行配置&#xff1a;2. 在settings.py中进行配置&#xff1a;3. 能够通过media的url访问文件 moudleForm上传文件实现城市管理1. moudle.py2. url.py3. city.py4. city.html5. 文件上传小结6. 城市管理效果总结 欢迎关注 『D…

基于Java菜匣子优选系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码)

人脸识别4&#xff1a;Android InsightFace实现人脸识别Face Recognition(含源码) 目录 人脸识别4&#xff1a;Android InsightFace实现人脸识别Face Recognition(含源码) 1. 前言 2. 项目说明 &#xff08;1&#xff09;开发版本 &#xff08;2&#xff09;依赖库说明(O…

Docker部署gitlab-runner

gitlab-runner 1.部署 Linux使用二进制的方式Docker中使用容器的方式启动gitlab-runnerHelm包的方式安装gitlab-runner Docker中使用容器的方式启动gitlab-runner 1.安装gitlab runner docker run -d --name gitlab-runner --restart always \ -v /srv/gitlab-runner/conf…

When viruses are good for you 病毒,有时对人体是有益的 | 经济学人20230506版社论双语精翻

本篇来自《经济学人》&#xff08;The Economist&#xff09;2023年5月6日社论&#xff08;Leaders&#xff09;精选&#xff1a;《病毒&#xff0c;有时对人体是有益的》&#xff08;When viruses are good for you&#xff09;。 Bacteriophages 噬菌体 When viruses are goo…

202319读书笔记|《春之海终日优哉游哉:谢芜村俳句300》——远山峡谷间樱花绽放,宇宙在其中

202319读书笔记&#xff5c;《春之海终日优哉游哉&#xff1a;谢芜村俳句300》——远山峡谷间樱花绽放&#xff0c;宇宙在其中 与谢芜村&#xff0c;小林一茶&#xff0c;芭蕉&#xff0c;与谢野晶子&#xff0c;俳句都很赞&#xff0c;虽多本书中略有重复&#xff0c;但多多观…

Android插件化框架-Shadow原理解析

作者&#xff1a;dennyz 1、前言 所谓插件化&#xff0c;是实现动态化的一种具体的技术手段。 对于移动端的App而言&#xff0c;无论是Android还是iOS&#xff0c;都存在一个共同的问题&#xff0c;那就是更新的周期较长。 当我们希望快速为App更新功能时&#xff0c;必须经…

【redis】redis的5种数据结构及其底层实现原理

文章目录 redis中的数据结构redis数据结构底层实现stringlisthashsetintset字典 zset跳表插入删除过程 redis中的数据结构 Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;…

Python如何制作图标点选验证码

本文讲解如何使用python中的opencv库来制作图标点选验证码 图标点选验证码制作起来非常简单,你只需要准备两部分数据集,数据集数量都不用很多,背景图我选择了20个左右,大小为(300, 500)左右,图标我抓取了100多个,图标大小为(40,40)左右,图标由不同大小的透明度构成…

C++:IO流

目录 一. C语言的输入输出方式 二. C的输入输出 2.1 C标准IO流 2.2 文件IO流 2.3 字符串IO流 一. C语言的输入输出方式 一般C语言通过scanf和printf来实现输入输出&#xff0c;scanf和printf都需要显示地指定数据类型。同时&#xff0c;C语言还支持fscanf/fprintf以及ssc…

【大数据】可视化仪表板 - Superset的安装和使用

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

MYSQL中 find_in_set() 函数用法详解

MYSQL中 find_in_set() 函数用法详解 官方涵义&#xff08;MySQL手册中语法说明&#xff09; FIND_IN_SET(str,strlist) &#xff1a; str 要查询的字符串&#xff0c;strlist 需查询的字段&#xff0c;参数以”,”分隔&#xff0c;形式如 (1,2,6,8,10,22)&#xff1b;该函数的…

接口如何运用pytest+HttpRunner展开测试?

目录 前言&#xff1a; 一、 什么是接口测试 二、 引入自动化背景 三、 自动化技术选型 四、 自动化测试用例 五、自动化成果 前言&#xff1a; pytest和HttpRunner都是Python编程语言中常用的接口测试框架。 pytest是一种成熟的、灵活的、社区支持良好的测试框架&…

vr沉浸式仿真实训展厅中控系统提高课堂纪律

为解决实训教学过程中“看不到、进不去、成本高、危险大”的问题&#xff0c;VR智能中控系统为职业教育及高等教育老师提供一个数字化、沉浸式、集中管控的实训教学工具。 VR智能中控系统通过对VR教学课堂的实时监控、数据的收集和分析&#xff0c;为气象学院的教学提供更多帮助…

2023年05月份青少年软件编程Scratch试卷三级真题

2023-05 Scratch三级真题 分数&#xff1a;100 题数&#xff1a;38 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1. 关于变量&#xff0c;下列描述错误的是&#xff1f;&#xff08;A&#xff09;&#xff08;2分&#xff09; &#xff08;变量那一栏…

【深度学习】基于Qt的人脸识别系统,门禁人脸识别系统,Python人脸识别流程,树莓派

文章目录 人脸识别过程人脸检测人脸对齐人脸特征提取特征距离比对人脸识别系统 人脸识别过程 在深度学习领域做人脸识别的识别准确率已经高到超出人类识别&#xff0c;但综合考虑模型复杂度&#xff08;推理速度&#xff09;和模型的识别效果&#xff0c;这个地方还是有做一些…

基于Java物流管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…