当前位置: 首页 > news >正文

SpringCloud---服务注册(Eureka)

目录

前言

一.注册中心

二.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: localhostclient:fetch-registry: false # 表⽰是否从Eureka Server获取注册信息,默认为true.因为这是#⼀个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这⾥设置为falseregister-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=falseusername: rootpassword: 密码driver-class-name: com.mysql.cj.jdbc.Driver# 设置 Mybatis 的 xml 保存路径
mybatis:configuration: # 配置打印 MyBatis 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-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 {@AutowiredStudentMapper studentMapper;@AutowiredRestTemplate restTemplate;@Resourceprivate 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Ubuntu 24.04 LTS 桌面安装MT4或MT5 (MetaTrader)教程
  • JAVA的接口和实现类
  • Power Shell查看进程、排序、打印出前五
  • 【软考】UML中的关联关系
  • 低功率范围内的MOSFET表征
  • Mysql数据库的索引、事务和存储引擎
  • 面试题:Java中堆内存和栈内存的区别,缓存数据是把数据放到哪里
  • unittest框架和pytest框架区别及示例
  • js修改hash的方法
  • Lucene 索引文件详解:结构与工作原理
  • 采用Ollama运行本地大模型
  • 速盾:ddos高防ip哪里好用?
  • Spark的动态资源分配算法
  • idea如何让包结构分层
  • 【开源项目】H265码流格式解析
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • JS实现简单的MVC模式开发小游戏
  • js正则,这点儿就够用了
  • OSS Web直传 (文件图片)
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Selenium实战教程系列(二)---元素定位
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • SpiderData 2019年2月23日 DApp数据排行榜
  • uni-app项目数字滚动
  • vue-cli3搭建项目
  • 从PHP迁移至Golang - 基础篇
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 关于使用markdown的方法(引自CSDN教程)
  • 开源地图数据可视化库——mapnik
  • 项目实战-Api的解决方案
  • 扩展资源服务器解决oauth2 性能瓶颈
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (十八)三元表达式和列表解析
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • ******之网络***——物理***
  • ./和../以及/和~之间的区别
  • .NET 5种线程安全集合
  • .Net Winform开发笔记(一)
  • .NET 分布式技术比较
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net通用权限框架B/S (三)--MODEL层(2)
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • @AutoConfigurationPackage的使用
  • @ConfigurationProperties注解对数据的自动封装
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @synthesize和@dynamic分别有什么作用?
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [] 与 [[]], -gt 与 > 的比较