【微服务 SpringCloud】实用篇 · Eureka注册中心

微服务(3)

在这里插入图片描述

文章目录

  • 微服务(3)
    • 1. Eureka的结构和作用
    • 2. 搭建eureka-server
      • 2.1 创建eureka-server服务
      • 2.2 引入eureka依赖
      • 2.3 编写启动类
      • 2.4 编写配置文件
      • 2.5 启动服务
    • 3. 服务注册
      • 1)引入依赖
      • 2)配置文件
      • 3)启动多个user-service实例
    • 4. 服务发现
      • 1)引入依赖
      • 2)配置文件
      • 3)服务拉取和负载均衡

微服务(3)

假如我们的服务提供者user-service部署了多个实例(不同实例,端口号不一致),如图:

在这里插入图片描述

大家思考几个问题:

  • 我们刚才的编程,是写死在程序里的,ip和端口都是写死的,这种硬编码的方式,之后改变ip和端口代码不就没法用了?
  • order-service在发起远程调用的时候,该如何得知user-service实例们的ip地址和端口,新增的实例怎么被访问到呢?
  • 有多个user-service实例地址,order-service调用时该如何选择?
  • order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

问题忒多了,但是我们的SpringCloud的注册中心Eureka是可以解决的~

1. Eureka的结构和作用

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

在这里插入图片描述

  • 我们的各个微服务相对于Eureka而言,都是客户端
  • 而他本身就是客户端服务器的,他也是个微服务,因为他也会“注册自己到自己身上”
    • 这与注册中心集群有关,暂时不做讨论,了解即可…

回答之前的各个问题。

问题1:这种硬编码的方式,之后改变ip和端口代码不就没法用了?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将服务注册、服务发现等功能统一封装到了eureka-client端

而eureka-server端,即注册中心就要做以下两个工作:

  1. 记录服务信息
  2. 心跳监控

因此,接下来我们动手实践的步骤包括:

在这里插入图片描述

2. 搭建eureka-server

首先大家注册中心服务端:eureka-server,这必须是一个独立的微服务

2.1 创建eureka-server服务

在cloud-demo父工程下,创建一个子模块:

在这里插入图片描述

填写模块信息,然后填写服务信息:

在这里插入图片描述

创建后

在这里插入图片描述

2.2 引入eureka依赖

引入SpringCloud为eureka提供的starter依赖:

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

在这里插入图片描述

(版本信息在父工程的pom.xml配好了,无需担心)

2.3 编写启动类

给eureka-server服务编写一个启动类,一定要添加一个 @EnableEurekaServer注解,开启eureka的注册中心功能:

package cn.itcast.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.4 编写配置文件

编写一个application.yml文件,内容如下:

server:port: 10086
spring:application:name: eureka-server
eureka:client:service-url: defaultZone: http://127.0.0.1:10086/eureka # 接口就是/eureka,在多个注册中心注册用逗号隔开								

在这里插入图片描述

2.5 启动服务

启动微服务,然后在浏览器访问:http://127.0.0.1:10086

看到下面结果应该是成功了:

在这里插入图片描述

在这里插入图片描述

注册的服务(实例)信息列表:

在这里插入图片描述

3. 服务注册

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

1)引入依赖

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

  • 这个就是客户端依赖,赋予其可以注册和拉取的功能~

如果这个设置在父工程pom里,就会作用于两个微服务的pom,但是我们希望两个微服务更加独立

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

在这里插入图片描述

2)配置文件

在user-service中,修改application.yml文件,添加服务名称、eureka地址:

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

在这里插入图片描述

3)启动多个user-service实例

为了演示一个服务有多个实例的场景,我们添加一个SpringBoot的启动配置,再启动一个user-service

首先,复制原来的user-service启动配置:

在这里插入图片描述

然后,在弹出的窗口中,填写信息:

  • 添加变量:.properties格式的配置信息(在被复制者的配置信息的基础上,进行覆盖)

在这里插入图片描述

现在,SpringBoot窗口会出现两个user-service启动配置:

在这里插入图片描述

不过,第一个是8081,第二个是8082

重新启动两个user-service实例(保证eureka在此之前启动):

在这里插入图片描述

查看eureka-server管理页面:

在这里插入图片描述

停止就会被剔除:

在这里插入图片描述

在这里插入图片描述

4. 服务发现

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

1)引入依赖

之前说过,服务发现、服务注册统一都封装在eureka-client依赖,因此这一步与服务注册时一致。

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

  • 这个就是客户端依赖,赋予其可以注册和拉取的功能~
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2)配置文件

服务发现也需要知道eureka地址,因此第二步与服务注册一致,都是配置eureka信息:

在order-service中,修改application.yml文件,添加服务名称、eureka地址:

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

3)服务拉取和负载均衡

最后,我们要去eureka-server中拉取user-service服务的实例列表,并且实现负载均衡。

不过这些动作不用我们去做,只需要添加一些注解即可。

在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解:

在这里插入图片描述

修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务名代替ip、端口:

在这里插入图片描述

spring会自动帮助我们从eureka-server端(配置文件配置的)

  1. 根据userservice这个服务名称,获取实例列表
  2. 而后完成负载均衡(加了那个注解,让他有能力去负载均衡)

最后他就会发送到正确的那个地址,实现远程调用

在浏览器验证一下试试(注意重新启动):

在这里插入图片描述

…略…

查看user服务的两个实例里查看日志:

在这里插入图片描述
在这里插入图片描述

好像确实负载均衡了(两个都有被访问到),具体怎么负载均衡的?

  • 这是接下来Ribbon负载均衡的内容啦😀

文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

代码:cloud-demo · 游离态/云服务 - 码云 - 开源中国 (gitee.com)


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

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

相关文章

android 13.0 SystemUI导航栏添加虚拟按键功能(二)

1.概述 在13.0的系统产品开发中,对于在SystemUI的原生系统中默认只有三键导航,想添加其他虚拟按键就需要先在构建导航栏的相关布局 中分析结构,然后添加相关的图标xml就可以了,然后添加对应的点击事件,就可以了,接下来先分析第二步关于导航栏的相关布局情况 然后实现功能…

尚硅谷Flink(三)时间、窗口

1 &#x1f3b0;&#x1f3b2;&#x1f579;️ &#x1f3b0;时间、窗口 &#x1f3b2;窗口 &#x1f579;️是啥 Flink 是一种流式计算引擎&#xff0c;主要是来处理无界数据流的&#xff0c;数据源源不断、无穷无尽。想要更加方便高效地处理无界流&#xff0c;一种方式就…

react简单写一个transition动画组件然后在modal组件中应用

1. 动画组件 原理: 利用transition和class类的切换执行transition的动画效果 import React, { useEffect } from "react"; import _ from "lodash";interface IProps {name: string;children: React.ReactNode;transitionShow: boolean; } sessionStorag…

期中考Web复现

第一题 1z_php <?php //Yeedo told you to study hard! echo !(!(!(!(include "flag.php")||(!error_reporting(0))||!isset($_GET[OoO])||!isset($_GET[0o0])||($_GET[OoO]2023)||!(intval($_GET[OoO][0])2023)||$_GET[0o0]$_GET[OoO]||!(md5($_GET[0o0])md5($_…

从头开始机器学习:线性回归

从头开始机器学习&#xff1a;线性回归 跟随 16 分钟阅读 28月 <> 1 一、说明 本篇实现线性回归的先决知识是&#xff1a;基本线性代数&#xff0c;微积分&#xff08;偏导数&#xff09;、梯度和、Python &#xff08;NumPy&#xff09;&#xff1b;从线性方程入手。 代…

基于vue实现滑块动画效果

主要实现&#xff1a;通过鼠标移移动、触摸元素、鼠标释放、离开元素事件来进行触发 创建了一个滑动盒子&#xff0c;其中包含一个滑块图片。通过鼠标按下或触摸开始事件&#xff0c;开始跟踪滑块的位置和鼠标/触摸位置之间的偏移量。然后&#xff0c;通过计算偏移量和起始时的…

【京东开源项目】微前端框架MicroApp 1.0正式发布

介绍 MicroApp是由京东前端团队推出的一款微前端框架&#xff0c;它从组件化的思维&#xff0c;基于类WebComponent进行微前端的渲染&#xff0c;旨在降低上手难度、提升工作效率。MicroApp无关技术栈&#xff0c;也不和业务绑定&#xff0c;可以用于任何前端框架。 源码地址…

vueday01——文本渲染与挂载

1.定义html样式字符串 const rawHtml "<span stylecolor:red>htmlTest</span>" 2.创建标签&#xff0c;分别渲染普通文本和html文本 <p> 你好<span v-html"rawHtml"></span></p> 3.代码展示 4.结果展示

day01——禁用按钮和输入框等组件

1.代码展示 <button :disabled"true" click"printId">Print ID {{ resultId }}</button> 2.非禁用情况 <button :disabled"false" click"printId">Print ID {{ resultId }}</button> 3.禁用情况 <butt…

BIM如何通过3D开发工具HOOPS实现WEB轻量化?

随着建筑行业的数字化转型和信息建模技术的不断发展&#xff0c;建筑信息模型&#xff08;BIM&#xff09;已经成为设计、建造和管理建筑项目的标准。然而&#xff0c;BIM模型通常包含大量的数据&#xff0c;导致在Web上的传输和查看效率低下。为了解决这一挑战&#xff0c;HOO…

【MySQL】如何在Linux上安装MySQL

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 MySQL 一、准备Linux服务器二、下载Linux版…

田字描红贴

<html> <title>田字描红贴</title> <head> <style> canvas { border:1px solid gray; } </style> </head> <body> <div align"center"><canvas id"canvas"></canvas></div> <…

lower_bound()以及upper_bound()

lower_bound&#xff08;&#xff09;&#xff1a; lower_bound()的返回值是第一个大于等于 target 的值的地址&#xff0c;用这个地址减去first&#xff0c;得到的就是第一个大于等于target的值的下标。 在数组中&#xff1a; int poslower_bound(a,an,target)-a;\\n为数组…

vueday01——动态参数

我们现在知道了 v-bind:的语法糖是: v-on:的语法糖是 我们现在来尝试一下&#xff0c;定义一个动态参数模拟点击事件按钮 <div :id"idValue" ref"myDiv">我是待测div{{ resultId }}</div> <button v-on:[eventName]"doSomething&…

rust注释

一、普通注释 // 这是第一种注释方式/* 这是第二种注释方式 */ /* 多行注释 多行注释 多行注释*/二、文档注释 ///外部行文档注释。为接下来的项生成帮助文档 //! 内部行文档注释。为注释所属于的项生成帮助文档/**...*/外部块文档注释。为接下来的项生成帮助文档 /*!...*/内…

探索未来:硬件架构之路

文章目录 &#x1f31f; 硬件架构&#x1f34a; 基本概念&#x1f34a; 设计原则&#x1f34a; 应用场景&#x1f34a; 结论 &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

解决kong部署自定义插件报 helloworld plugin is enabled but not installed

背景 我使用的是docker环境部署&#xff0c;使用的是自定义挂载plugins路径 -e "KONG_LUA_PACKAGE_PATH/plugins/?.lua" \ -v "/plugins:/plugins" \ -e "KONG_PLUGINSbundled,helloworld" \但是当我只需docker run的时候就报错 [error] 1#0:…

python的搜索引擎系统设计与实现 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python的搜索引擎系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;5分创新点&#xff1a;3分 该项目较为新颖&#xff…

[Tkinter 教程08] Canvas 图形绘制

python - [译][Tkinter 教程08] Canvas 图形绘制 - 个人文章 - SegmentFault 思否 一、简介 Canvas 为 Tkinter 提供了绘图功能. 其提供的图形组件包括 线形, 圆形, 图片, 甚至其他控件. Canvas 控件为绘制图形图表, 编辑图形, 自定义控件提供了可能. 在第一个例子里, …

使用Python计算平面多边形间最短距离,数据需要从excel表格中导入

使用Python计算平面多边形间最短距离&#xff0c;数据需要从excel表格中导入&#xff0c; * 多边形种类包括&#xff08;圆形、矩形、六边形、五边形、跑道形/胶囊形&#xff09;&#xff0c; * Python代码需要使用gjk算法进行判断两个多边形间是否重叠&#xff0c; * 如果未重…