Spring Cloud学习笔记【服务注册与发现-Eureka】

文章目录

  • 什么是服务治理
  • 什么是服务注册与发现
  • Eureka两组件
  • Eureka搭建
    • 搭建单机Eureka Server
    • Eureka客户端注册
      • user服务
      • user服务
    • 单点测试
    • 搭建集群Eureka Server
    • 集群启动测试
    • 子服务集群搭建
    • 服务调用和负载均衡
  • 测试效果

什么是服务治理

服务治理是一种管理和控制分布式系统中各个服务的方法。在分布式系统中,各个服务可能由不同的团队或公司开发、维护和部署,因此需要一种机制来确保服务之间的互操作性和稳定性。
服务治理包括以下方面:

  • 服务注册与发现:服务提供者可以将其服务注册到服务注册中心,服务消费者可以从注册中心中发现需要的服务。
  • 负载均衡:服务治理可以根据不同服务的负载情况,将请求分配到不同的服务实例上,以避免某些服务实例过载或负载过轻。
  • 熔断与降级:当某个服务出现故障或响应缓慢时,服务治理可以通过熔断或降级的方式,防止故障或延迟的服务对整个系统的影响。
  • API 管理:服务治理可以对服务的 API 进行管理和限制,防止服务提供者滥用 API,同时保护服务消费者的数据安全。
  • 监控与报警:服务治理可以对服务的运行状态进行监控和报警,及时发现和处理潜在问题,保障系统的稳定性和可靠性。

服务治理是一种重要的分布式系统管理方法,能够有效提升系统的可靠性和可维护性,降低系统的运维成本。

什么是服务注册与发现

服务注册与发现是微服务架构中非常重要的一环,它解决了服务之间的通信问题。在分布式系统中,服务提供者需要将自己的服务信息注册到服务注册中心中,而服务消费者则可以从服务注册中心获取需要调用的服务信息,从而实现服务之间的通信。服务注册中心可以看作是服务的“黄页”,包含了服务提供者的名称、地址、端口号等信息,服务消费者可以通过查询服务注册中心来获取服务提供者的信息。

从Eureka的角度来说,服务注册就是将服务提供者的信息注册到Eureka注册中心中。服务提供者需要在启动时向Eureka注册中心发送注册请求,将自己的服务信息(如服务名称、IP地址、端口号等)注册到Eureka中。服务注册中心会将这些服务信息保存起来,供其他服务消费者使用。服务发现则是服务消费者从Eureka注册中心获取需要调用的服务信息。服务消费者可以通过Eureka注册中心的REST API查询服务提供者的信息,从而实现服务之间的调用。

Eureka的服务注册与发现机制可以实现服务的动态扩容和缩容,当服务提供者的实例数量发生变化时,Eureka可以自动更新注册中心的服务信息,服务消费者可以获取最新的服务信息,从而保证服务的可用性。Eureka还提供了自我保护机制,当服务提供者出现故障或网络波动时,Eureka可以自动进行恢复和剔除不可用的服务,从而提高服务的可靠性和健壮性。
在这里插入图片描述

Eureka两组件

Eureka由两个主要组件组成:

  • Eureka Server:Eureka服务器是服务注册中心,所有的服务实例都需要向Eureka服务器注册自己的信息,并定时向Eureka服务器发送心跳以维持注册信息的有效性。Eureka服务器维护了所有服务实例的注册信息,并提供了REST API接口供客户端查询服务信息。

  • Eureka Client:Eureka客户端是服务提供者和服务消费者,服务提供者在启动时向Eureka服务器注册自己的服务信息,并定时发送心跳以保持注册信息的有效性。服务消费者通过Eureka客户端查询服务提供者的信息,并通过负载均衡算法选择其中一个服务提供者进行调用。

Eureka Server和Eureka Client之间可以建立多个集群,以实现高可用性和容错性。Eureka服务器之间会相互注册,形成一个互相连接的集群。Eureka客户端在查询服务时,会优先查询本地的Eureka服务器,如果本地的Eureka服务器没有相应的服务实例,则会查询其他Eureka服务器上的注册信息。Eureka还提供了一些高级特性,如安全认证、自我保护机制、多数据中心支持等,以满足不同场景下的需求。

Eureka搭建

搭建单机Eureka Server

新建module cloud-eureka-server7001
在这里插入图片描述
pom.xml

<dependencies>
        <!--eureka-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!--boot web actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--图形监控,以后的swagger和Hystrix要用的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--一般通用配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>

application.yml

server:
  port: 7001

eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    #false表示不向注册中心注册自己。
    register-with-eureka: false
    #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    fetch-registry: false
    service-url:
      #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

启动类Eureka7001Application

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

启动测试
访问http://localhost:7001/显示如下,说明eureka server启动成功
在这里插入图片描述
接下来,我们将服务注册进来

Eureka客户端注册

将我们之前的两个demo服务auth和user进行改造,注册到Eureka中。

user服务

pom.xml添加eureka-client的依赖

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

application.yml添加eureka配置

eureka:
  instance:
    # 配置eureka的状态显示
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
  client:
    #表示是否将自己注册进EurekaServer默认为true。
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

启动类添加注解

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

user服务

配置和auth一一样,我就不具体写了

单点测试

先启动Eureka7001Application 服务端;
然后启动两个Eureka客户端。
在这里插入图片描述
服务注册成功

搭建集群Eureka Server

搭建Eureka注册中心集群 ,实现负载均衡+故障容错
参考cloud-eureka-server7001,新建cloud-eureka-server7002

修改host文件C:\Windows\System32\drivers\etc,添加映射,将实例名区分开,方便看到效果

  • 127.0.0.1 eureka7001.com
  • 127.0.0.1 eureka7002.com

修改application.yml
host名字修改:改为上面的假域名
defaultZone修改:将除自己以外的其他eureka节点都写进去,现在写了一个,后续如果多台eureka节点都加上用逗号分隔。
7001服务:
在这里插入图片描述
7002服务:
在这里插入图片描述

集群启动测试

在这里插入图片描述

子服务集群搭建

将user服务改造成集群,测试auth通过服务名,调用user的多台服务。

  • 参照user服务,新增一个user2的module
    在这里插入图片描述
    application.yml的端口有所区分,其他都一样
    在这里插入图片描述
  • 再将所有子服务的地址改为集群地址,用逗号隔开
    在这里插入图片描述
  • 启动所有的服务,注意顺序 先启动eureka server
    在这里插入图片描述
    看到三个服务都注册成功

服务调用和负载均衡

上期,auth调用user服务实际是写死的。
在这里插入图片描述

  • 现在我们改成通过在eureka上注册过的微服务名称调用
    在这里插入图片描述
  • 由于该服务是集群,LF-USER下有多个服务(9001端口和9011端口的服务),需要使用 @LoadBalanced 注解赋予 RestTemplate 负载均衡的能力,默认应该是轮询9001端口和9011端口的服务。同时在返回信息加上端口号,方便测试。
@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

测试效果

第一次请求:
在这里插入图片描述
第二次请求:
在这里插入图片描述
至此负载均衡效果达到,9001/9002端口交替出现

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

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

相关文章

基于51单片机的智能计算器Protues仿真设计

目录 一、设计背景 二、实现功能 三、硬件设计 3.1 总体硬件设计 ​3.2 键盘电路的设计 3.3 显示电路的设计 四、仿真演示 五、源程序 一、设计背景 随着社会的发展&#xff0c;科学的进步&#xff0c;人们的生活水平在逐步的提高&#xff0c;尤其是微电子技术的发展&am…

【数据结构】基础知识总结

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了数据结构复习用的&#xff0c;由于牛客刷题发现数据结构方面和王道数据结构的题目非常像&#xff0c;甚至很多都是王道中的&#xff0c;所以将基础知识进行了整理&#xff0c;后续会将牛客刷题的错题一…

大数据技术之Sqoop——SQL to Hadoop

一、简介sqoop &#xff08;sql to hadoop&#xff09;是一款开源的工具,主要用于在 Hadoop&#xff08;Hive&#xff09;与传统的数据库&#xff08;mysql、postgresql...&#xff09;间进行数据的传递&#xff0c;可以将一个关系型数据库&#xff08;例如 : MSQL,Oracle,Post…

Unity脚本练习

在C# 中 class 是创建类的标志&#xff0c;要创建类的话得现有class上面这个的逻辑是 类的访问权限&#xff0c; 关键字&#xff0c;类名以及类继承的父类在Unity中创建一个脚本或者添加一个组件&#xff0c;就相当于在Unity命名空间中创建了一个可以访问的类。这些类能够直接在…

2023秋招前端面试必会的面试题

浏览器存储 我们经常需要对业务中的一些数据进行存储&#xff0c;通常可以分为 短暂性存储 和 持久性储存。 短暂性的时候&#xff0c;我们只需要将数据存在内存中&#xff0c;只在运行时可用持久性存储&#xff0c;可以分为 浏览器端 与 服务器端 浏览器: cookie: 通常用于存储…

springboot健身房管理系统

springboot健身房管理系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xf…

Vue 3.0 单文件组件 【Vue3 从零开始】

#介绍 在很多 Vue 项目中&#xff0c;我们使用 app.component 来定义全局组件&#xff0c;紧接着用 app.mount(#app) 在每个页面内指定一个容器元素。 这种方式在很多中小规模的项目中运作的很好&#xff0c;在这些项目里 JavaScript 只被用来加强特定的视图。但当在更复杂的…

HTTP 3.0来了,UDP取代TCP成为基础协议,TCP究竟输在哪里?

TCP 是 Internet 上使用和部署最广泛的协议之一&#xff0c;多年来一直被视为网络基石&#xff0c;随着HTTP/3正式被标准化&#xff0c;QUIC协议成功“上位”&#xff0c;UDP“取代”TCP成为基础协议&#xff0c;TCP究竟“输”在哪里&#xff1f; HTTP/3 采用了谷歌多年探索的基…

< CSS小技巧:那些不常用,却很惊艳的CSS属性 >

文章目录&#x1f449; 前言&#x1f449; 一. background-clip: text - 限制背景显示&#xff08;裁剪&#xff09;&#x1f449; 二. user-select - 控制用户能否选中文本&#x1f449; 三. :focus-within 伪类&#x1f449; 四. gap - 网格 / 弹性布局间隔设置&#x1f449;…

【C++笔试强训】第三十一天

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 选择题 &#x…

Golang每日一练(leetDay0005)

目录 13. 罗马数字转整数 Roman to Integer ★ 14. 最长公共前缀 Longest Common Prefix ★ 15. 三数之和 3Sum ★★★ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 13. 罗马数字转…

我从功能测试到python接口自动化测试涨到22k,谁知道我经历了什么......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 常见的接口&#xf…

C++高并发内存池的设计和实现

一、整体设计 1、需求分析 池化技术是计算机中的一种设计模式&#xff0c;内存池是常见的池化技术之一&#xff0c;它能够有效的提高内存的申请和释放效率以及内存碎片等问题&#xff0c;但是传统的内存池也存在一定的缺陷&#xff0c;高并发内存池相对于普通的内存池它有自己…

卷王都在偷偷准备金三银四了...

年终奖没发&#xff1b; 简历石沉大海&#xff1b; 发消息只读不回 打开某招聘&#xff0c;看了看岗位&#xff0c;这个厂还不错&#xff0c;可是要求好高&#xff0c;我啥都不会。 “哎&#xff0c;算了&#xff0c;我简历还没更新呢&#xff0c;我躺到6月份拿到年终奖再跑…

3-1 SpringCloud快速开发入门: Ribbon 是什么

接上一章节Eureka 服务注册中心自我保护机制&#xff0c;这里讲讲Ribbon 是什么 Ribbon 是什么 通常说的负载均衡是指将一个请求均匀地分摊到不同的节点单元上执行&#xff0c;负载均和分为硬件负载均衡和软件负载均衡&#xff1a; **硬件负载均衡&#xff1a;**比如 F5、深信…

记第一次面试的过程(C++)

说实话三月份上旬过得很充实&#xff0c;而且感觉蛮值&#xff0c;但还有不足的地方&#xff0c;今晚特地看完资料分析来复盘复盘。 时间还要回到3.2中午13.35&#xff08;别问我为什么那么准确&#xff0c;刚刚掏手机看的&#xff09;&#xff0c;我正在吃着饭看着王者荣耀的直…

STL sort 分析

前言 STL 中提供了很多算法&#xff0c;sort 是我们经常使用的&#xff0c;那它究竟是如何实现的呢&#xff1f; STL 的 sort 算法&#xff0c;数据量大时采用快速排序&#xff0c;分段递归。一旦分段的数据量小于某个门槛&#xff0c;为避免快速排序的递归调用带来过大的额外…

三天吃透计算机网络面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

Linux常用命令

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

C++STL 容器案例 员工分组 实现步骤与代码分析与展示 实现步骤的注意事项

STL容器 员工分组案例 文章目录STL容器 员工分组案例1 案例描述2 实现步骤3 案例代码与分析1 案例描述 公司今天招聘了10个员工&#xff08;ABCDEFGHIJ&#xff09;&#xff0c;10名员工进入公司之后&#xff0c;需要指派员工在哪个部门工作员工信息有: 姓名 工资组成&#xf…