SpringCloud---服务注册(Eureka)

目录

前言

一.注册中心

二.CAP理论

三.常见的注册中心

四.Eureka

[4.1搭建Eueka Server](#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的依赖和构建插件

XML 复制代码
<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文件夹下创建一个包,再创建启动类

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

编写配置文件:application.yml

XML 复制代码
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

java 复制代码
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

第二步,完善配置文件

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

java 复制代码
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类

java 复制代码
@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

相关推荐
华为云开源4 小时前
openGemini 社区人才培养计划:助力成长,培养新一代云原生数据库人才
数据库·云原生·开源
荆州克莱5 小时前
springcloud整合nacos、sentinal、springcloud-gateway,springboot security、oauth2总结
spring boot·spring·spring cloud·css3·技术
ZHOU西口14 小时前
微服务实战系列之玩转Docker(十五)
nginx·docker·微服务·云原生·swarm·docker swarm·dockerui
Xua305514 小时前
浅谈Spring Cloud:认识微服务
spring·spring cloud·微服务
蜜桃小阿雯16 小时前
JAVA开源项目 校园美食分享平台 计算机毕业设计
java·jvm·spring boot·spring cloud·intellij-idea·美食
无名之逆20 小时前
云原生(Cloud Native)
开发语言·c++·算法·云原生·面试·职场和发展·大学期末
Richardlygo21 小时前
(k8s)Kubernetes部署Promehteus
云原生·容器·kubernetes
bug菌¹1 天前
滚雪球学SpringCloud[5.1讲]: Spring Cloud Config详解
spring·elasticsearch·spring cloud
Lill_bin1 天前
JVM内部结构解析
jvm·后端·spring cloud·微服务·云原生·ribbon
二进制杯莫停1 天前
初识zookeeper
分布式·zookeeper·云原生