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

相关推荐
xx.ii9 小时前
k8s的资源管理
云原生·容器·kubernetes
维尔切9 小时前
k8s 实战入门
云原生·容器·kubernetes
xx.ii9 小时前
K8s练习
云原生·容器·kubernetes
算是难了9 小时前
K8s基础总结
云原生·容器·kubernetes
失因9 小时前
Kubernetes(K8s)资源管理
云原生·容器·kubernetes
KubeSphere 云原生9 小时前
Fluid 正式入驻青云 KubeSphere Marketplace,共建云原生数据加速新生态
云原生
阿里云云原生11 小时前
云栖实录:重构可观测 - 打造大模型驱动的云监控 2.0 与 AIOps 新范式
阿里云·云原生·重构·云监控·可观测
白小云<12 小时前
docker镜像
docker·容器·eureka
不爱笑的良田13 小时前
从零开始的云原生之旅(一):把 Go 应用塞进 Docker
docker·云原生·golang
不爱笑的良田13 小时前
从零开始的云原生之旅(四):K8s 工作负载完全指南
云原生·容器·kubernetes