SpringCloud---服务注册(Eureka)

news2024/9/20 7:58:25

目录

前言

一.注册中心

二.CAP理论

三.常见的注册中心

四.Eureka

4.1搭建Eueka Server

4.2服务注册

4.3发现服务

4.4小结


学习专栏:http://t.csdnimg.cn/tntwg

前言

        在SpringCloud里,我们可以发现一个巨大的问题,就是url是写死的,无法改变的,但是有什么法子修改吗?

        啊?你问我为什么修改?你部署到服务器上的时候,url链接不要改吗?如果你换台机器,你的公网IP不会改变吗?

解决思路:有没有一种存在,服务方也就是被调用的服务主动的存储自身的链接,然后使用方只需要根据url的后半部分(@RequestMapping指定的路径)查找呢?

这个就是所谓的 注册中心

本次的配合的代码讲解还是部署当中的代码:http://t.csdnimg.cn/AYJSl

一.注册中心

        注册中心:用于管理和维护服务实例信息的集中存储和查询系统。在微服务架构中,注册中心扮演着重要角色,主要功能包括服务注册、服务发现和服务状态监控。

注册中心有三种角色:

  1. 服务提供者(Server):⼀次业务中, 被其它微服务调⽤的服务. 也就是提供接⼝给其它微服务.
  2. 服务消费者(Client):⼀次业务中, 调⽤其它微服务的服务. 也就是调⽤其它微服务提供的接⼝.
  3. 服务注中心(Registry): 用于保存Server 的注册信息, 当Server 节点发生变更时, Registry 会同步变更. 服务与注册中心使⽤⼀定机制通信, 如果注册中⼼与某服务⻓时间⽆法通信, 就会注销该实例.

二.CAP理论

CAP理论分别为:一致性、可用性和分区容错性

  1. 一致性(Consistency):所有节点在同一时间的数据访问结果是一致的。换句话说,当一个数据更新操作完成后,所有后续的访问都应该返回最新的值。

  2. 可用性(Availability):系统在有限时间内能够返回一个非错误的响应,即服务一直可用,不管是正常的请求还是异常的请求。

  3. 分区容错性(Partition Tolerance):即使系统中出现网络分区(部分节点之间的通信失败),系统仍然能够继续工作。

CAP 理论告诉我们: ⼀个分布式系统不可能同时满足数据⼀致性, 服务可用性和分区容错性这三个基本需求, 最多只能同时满足其中的两个。
CP架构: 为了保证分布式系统对外的数据⼀致性, 于是选择不返回任何数据
AP架构: 为了保证分布式系统的可用性, 节点也会返回数据(即使这个数据不正确)
原因如下:
  • 一致性与可用性的冲突:在面临网络分区的情况下,要么选择保证数据的一致性,这可能会导致某些节点无法响应请求(降低可用性),要么保证可用性,这可能会导致节点间数据的不一致性(牺牲一致性)。例如,如果要求在所有节点间实时同步数据,而某些节点无法访问,那么要么阻塞请求以等待所有节点恢复,要么允许某些节点返回不完全一致的数据。

  • 分区容错性的必要性:在分布式系统中,网络分区是难以避免的现象,特别是在大规模系统中。因此,分布式系统需要具备分区容错性,即使某些节点之间出现通信问题,整个系统仍能继续工作。这就增加了在网络分区下解决一致性与可用性之间的抉择难度。

三.常见的注册中心

        常见的注册中心有三种:Zookeeper、Eureka 以及Nacos

Zookeeper

Apache Zookeeper 是一个分布式的开源协调服务,主要用于:

  • 服务注册与发现:允许服务在集群中注册自己的地址,其他服务可以查询并发现注册的服务。
  • 分布式锁:提供分布式锁的机制,用于协调分布式系统中的并发操作。
  • 配置管理:可以作为配置中心,存储和管理分布式系统的配置信息。

Zookeeper 的优点包括稳定性和成熟度高,适合于那些对可用性要求不那么苛刻、但需要高一致性和稳定性的场景。


Eureka

Netflix 开发的 Eureka 是一个基于 REST 的服务注册与发现组件,特点包括:

  • 服务注册中心:微服务通过将自己注册到 Eureka 服务器,使得其他微服务可以通过 Eureka 服务器来获取其位置信息。
  • 客户端负载均衡:Eureka 客户端具备负载均衡能力,可以根据服务实例的健康状态进行负载均衡。
  • 自我保护机制:当网络分区发生时,Eureka 能够保持对已知正常的服务实例的注册信息,并且不会立即从注册表中删除健康的实例。

Eureka 适合于云原生应用和基于 Netflix OSS 的微服务架构,但随着 Netflix 对 Eureka 的维护减少,一些新项目可能更倾向于选择其他解决方案。


Nacos

阿里巴巴开源的 Nacos 是一个更全面的动态服务发现、配置管理和服务管理平台,具有以下特点:

  • 服务发现与注册:支持基于 DNS 和基于 RPC 的服务发现,适应各种场景下的服务注册与发现需求。
  • 动态配置管理:支持动态配置的发布、监听和推送,可以实现动态配置更新。
  • 服务及其元数据管理:提供服务的健康检查、路由及负载均衡策略的管理。
  • 多环境支持:支持多环境(如开发、测试、生产环境)下的配置管理和服务发现。

Nacos 被认为是一个功能更加完善和未来性更强的替代品,尤其适合于需要高度动态性和灵活性的云原生应用场景。


一般而言Nacos最好,但是我们先讲解Eureka,为什么?因为本博主只学了后面两个!

四.Eureka

Eureka有一个注册中心,作用:

  1. 为微程序提供服务注册,发现,健康检测等能力!
  2. 服务提供者, 服务启动时, 会向Eureka Server 注册⾃⼰的信息(IP,端⼝,服务信息
    等),Eureka Server 会存储这些信息
看不懂没关系,就是提交资源获取的路径,让别的服务器获取注册信息,进行获取需要的数据。

接下来的学习,我们将在-部署服务器的代码-基础上,搭建一个EurekaServer,将已经存在的Teacher-service和StudentService注册到Eureka上,StudentService远程调用时,从Eureka上获取StudentService的服务列表,进行交互!

4.1搭建Eueka Server

        在我们的父项目里搭建一个子项目,eureka-service

    引入eureka-server的依赖和构建插件

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


<build>
    <plugins>
         <plugin>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
     </plugins>
</build>

           编写在Java文件夹下创建一个包,再创建启动类

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

        编写配置文件:application.yml

server:
    port: 10010
spring:
    application:
      name: eureka-server
eureka:
  instance:
    hostname: localhost
  client:
      fetch-registry: false # 表⽰是否从Eureka Server获取注册信息,默认为true.因为这是
  #⼀个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这⾥设置为false
      register-with-eureka: false # 表⽰是否将⾃⼰注册到Eureka Server,默认为true.由于
  #当前应⽤就是Eureka Server,故⽽设置为false.
  service-url:
   # 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.
    defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

        启动服务: http://127.0.0.1:10010/

4.2服务注册

        将Student-service和Teacher-service注册进去

第一步,引入依赖eureka-client

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

第二步,完善配置文件

两个配置文件都要完善!!! 

server:
  port: 8080        #另一个端口号不同
Spring:  
  application: 
     name: product-service     #另一个名字不同
  datasource:                            #数据库名不同
      url: jdbc:mysql://127.0.0.1:3306/cloud_student?characterEncoding=utf8&useSSL=false
      username: root
      password: 密码
      driver-class-name: com.mysql.cj.jdbc.Driver

# 设置 Mybatis 的 xml 保存路径
mybatis:
  configuration: # 配置打印 MyBatis 执行的 SQL
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true  #自动驼峰转换
eureka:
  client:
      service-url:
          defaultZone: http://127.0.0.1:10010/eureka

第三步,启动查看Eureka

4.3发现服务

        指需要获取注册中心当中的url链接时的操作

第一步,在需要的服务项目当中,引入依赖

        这个依赖就是服务注册和发现的依赖!

第二步,完善配置文件

        和注册的完善是一致的!

第三步,远程调用

        修改Server层的StudentService类

@Service
public class StudentService {
    @Autowired
    StudentMapper studentMapper;
    @Autowired
    RestTemplate restTemplate;
    @Resource
    private DiscoveryClient discoveryClient;

    public StudentInfo getId(int id){
        StudentInfo studentInfo = studentMapper.getId(id);
        List<ServiceInstance> instances = discoveryClient.getInstances("Teacher-service");
        EurekaServiceInstance instance = (EurekaServiceInstance) instances.get(0);
        String url = instance.getUri().toString()+"/Teacher/"+studentInfo.getClassroom();
        TeacherInfo teacherInfo = restTemplate.getForObject(url, TeacherInfo.class);
        studentInfo.setTeacherInfo(teacherInfo);
        return studentInfo;
    }
    
}

4.4小结

  1. discoveryClient.getInstances("Teacher-service");当中的服务名称必须和注册的一模一样,有大小写区分
  2. 注册的服务的获取的服务需要的依赖是一样的
  3. 使用该类DiscoveryClient,获取服务,从而获取链接

注:学习负载均衡链接:http://t.csdnimg.cn/7dLx8

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

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

相关文章

如何在 Android 中删除和恢复照片

对于智能手机用户来说&#xff0c;相机几乎已经成为一种条件反射&#xff1a;你看到值得注意的东西&#xff0c;就拍下来&#xff0c;然后永远保留这段记忆。但如果那张照片不值得永远保留怎么办&#xff1f;众所周知&#xff0c;纸质快照拿在手里很难舍弃&#xff0c;而 Andro…

grafana大坑,es找不到时间戳 | No date field named timestamp found

grafana大坑&#xff0c;es找不到时间戳。最近我这边的es重新装了一遍&#xff0c;结果发现grafana连不上elasticsearch了&#xff08;以下简称es&#xff09;&#xff0c;排查问题查了好久一直以为是es没有装成功或者两边的版本不兼容&#xff0c;最后才发现是数值类型问题 一…

一天搞定React(3)——Hoots组件

Hello&#xff01;大家好&#xff0c;今天带来的是React前端JS库的学习&#xff0c;课程来自黑马的往期课程&#xff0c;具体连接地址我也没有找到&#xff0c;大家可以广搜巡查一下&#xff0c;但是总体来说&#xff0c;这套课程教学质量非常高&#xff0c;每个知识点都有一个…

【Node】npm i --legacy-peer-deps,解决依赖冲突问题

文章目录 &#x1f356; 前言&#x1f3b6; 一、问题描述✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 npm i --legacy-peer-deps&#xff0c;解决依赖冲突问题 &#x1f3b6; 一、问题描述 node执行安装指令时出现报错&#xff…

【QT】label适应图片(QImage)大小;图片适应label大小

目录 0.简介 1.详细代码 1&#xff09;label适应img大小 2&#xff09;img适应label大小 0.简介 一个小demo &#xff0c;想在QLabel中放一张QImage的图片&#xff0c;我有一张图片叫【bird.jpg】&#xff0c;是提前放在资源文件中的&#xff0c;直接显示在label上后&#…

【网络】网络聊天室udp

网络聊天室udp 一、低耦合度代码1、代码2、测试结果 二、高耦合度代码1、服务端小改&#xff08;1&#xff09;维护一个unordered_map用户列表&#xff08;2&#xff09;服务端代码&#xff08;3&#xff09;客户端不改的情况下结果展示 2、大改客户端&#xff08;udp全双工用多…

通过QT进行服务器和客户端之间的网络通信

客户端 client.pro #------------------------------------------------- # # Project created by QtCreator 2024-07-02T14:11:20 # #-------------------------------------------------QT core gui network #网络通信greaterThan(QT_MAJOR_VERSION, 4): QT widg…

饥荒dst联机服务器搭建基于Ubuntu

目录 一、服务器配置选择 二、项目 1、下载到服务器 2、解压 3、环境 4、启动面板 一、服务器配置选择 首先服务器配置需要2核心4G&#xff0c;4G内存森林加洞穴大概就占75% 之后进行服务器端口的开放&#xff1a; tcp:8082 tcp:8080 UDP:10888 UDP:10998 UDP:10999 共…

套接字编程一(简单的UDP网络程序)

文章目录 一、 理解源IP地址和目的IP地址二、 认识端口号1. 理解 "端口号" 和 "进程ID"2. 理解源端口号和目的端口号 三、 认识协议1. 认识TCP协议2. 认识UDP协议 四、 网络字节序五、 socket编程接口1. socket 常见API2. sockaddr结构&#xff08;1&#…

输入设备应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

输入设备应用编程 输入类设备编程介绍 什么是输入设备 输入设备&#xff08;input 设备&#xff09;&#xff0c;如鼠标、键盘、触摸屏等&#xff0c;允许用户与系统交互 input 子系统 Linux系统通过input子系统管理多种输入设备 Input子系统提供统一的框架和接口&#xff…

网络编程之LINUX信号

注意发送信号是给进程&#xff0c;不是线程&#xff0c;调用的是KILL函数&#xff0c;SIG是信号种类。pid0是本进程的其他的进程。 可以通过设置ERRNO来查看返回的错误&#xff0c;如下&#xff1a; 当目标进程收到信号后&#xff0c;要对信号进行一些执行操作&#xff1a; 定义…

[每周一更]-(第106期):DNS和SSL协作模式

文章目录 什么是DNS&#xff1f;DNS解析过程DNS解析的底层逻辑 什么是SSL&#xff1f;SSL证书SSL握手过程SSL的底层逻辑 DNS与SSL的协同工作过程 什么是DNS&#xff1f; DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的重要组成部分&#xff0c…

黑马程序员MySQL基础学习,精细点复习【持续更新】

文章目录 数据库Mysql基础一、数据库1.数据库2.数据库管理系统3.SQL4.Mysql目录结构5.关系型数据库6.SQL基础概念 mysql高级一、数据库备份和还原1.图形化界面备份与还原 二、约束1.分类&#xff1a;2.主键约束3.唯一约束4.非空约束5.默认值约束6.外键约束 三、表关系1.概述2.一…

《Windows API每日一练》13.1 打印基础

在Windows中使用打印机时&#xff0c;在调用一系列与打印相关的GDI绘图函数的背后&#xff0c;实际上启动了一系列模块之间复杂的交互过程&#xff0c;包括 GDI32库模块、打印机设备驱动程序库模块&#xff08;带.DRV后缀的文件&#xff09;、Windows后台打印处理程序&#xff…

5. harbor镜像仓库

harbor镜像仓库 一、镜像仓库1、类型2、构建私有仓库的方案 二、部署harbor仓库(单机版)1、安装docker(略)2、安装docker-compose工具3、安装harbor4、生成harbor需要的证书、密钥(V3版本证书)4.1 创建CA4.2 创建harbor仓库需要的证书 5、编辑harbor配置文件6、启动harbor 三、…

【C++】17.AVL树

一、AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种…

Linux实用操作二

文章目录 Linux实用操作二日期、时区&#xff1a;date命令查看日期时间作用&#xff1a;语法&#xff1a;字段解释&#xff1a;操作&#xff1a; 修改Linux系统时区作用&#xff1a;操作&#xff1a; 使用ntp进行时间同步和校准作用&#xff1a;操作&#xff1a; IP地址、主机名…

buuctf web 第五到八题

[ACTF2020 新生赛]Exec 这里属实有点没想到了&#xff0c;以为要弹shell&#xff0c;结果不用 127.0.0.1;ls /PING 127.0.0.1 (127.0.0.1): 56 data bytes bin dev etc flag home lib media mnt opt proc root run sbin srv sys tmp usr var127.0.0.1;tac /f*[GXYCTF2019]Pin…

【数学建模】多波束测线问题(持续更新)

多波束测线问题 问题 1建立模型覆盖宽度海水深度重叠长度重叠率 问题二问题三问题四 问题 1 与测线方向垂直的平面和海底坡面的交线构成一条与水平面夹角为 α \alpha α的斜线&#xff08;如下图&#xff09;&#xff0c;称 α \alpha α为坡度。请建立多波束测深的覆盖宽度及…

世界华人国学泰斗级人物颜廷利:人类史上全球公认最伟大的思想家

世界华人国学泰斗级人物颜廷利:人类史上全球公认最伟大的思想家 颜廷利教授,一位在21世纪东方哲学、科学界具有深远影响力的人物,同时也是当代中国教育界的知名教授、周易起名与易经姓名学的专家,以及现代国学的杰出代表。他在其著作《升命学说》中提出了一系列独到的理论,包括…