【SpringCloud】Eureka 案例上手稍微带点原理(2)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 2. Eureka2.1 Eureka 概述Eureka 是 Netflix 提供的基于 REST 的服务发现组件,用于帮助开发者管理微服务架构中的服务实例。它提供了一个可伸缩的注册中心,可以让每个微服务都能够找到其他微服务的位置和元数据信息,并对其进行负载均衡、自动故障转移等操作。

2. Eureka


2.1 Eureka 概述

Eureka 是 Netflix 提供的基于 REST 的服务发现组件,用于帮助开发者管理微服务架构中的服务实例。它提供了一个可伸缩的注册中心,可以让每个微服务都能够找到其他微服务的位置和元数据信息,并对其进行负载均衡、自动故障转移等操作。


通过将 Eureka Server 部署在中心服务器上,然后将各个微服务节点(即Eureka Client)注册到该中心服务器上,便可以实现微服务间的快速查找和调用。

066591c18846454d9c7dd7d6656214b6.png

使用Eureka能够方便地扩展和部署大规模微服务应用程序,并让你更容易地维护和监控整个系统。

同时,由于Eureka本身是基于REST接口设计的,因此它能够与多种编程语言和框架无缝集成,可以让开发者像使用本地服务一样轻松地编写分布式应用程序。

2.2 搭建 Eureka

2.2.1 pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
    </parent>
    <artifactId>eureka-service</artifactId>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <!-- SpringCloud版本号 -->
        <spring-cloud.version>Hoxton.SR10</spring-cloud.version>
    </properties>
    <!-- 版本锁定: 并不是jar包导入 -->
    <dependencyManagement>
        <dependencies>
            <!-- todo:2.导入springCloud父工程 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <!-- 打包方式为pom: 说明我们导入的是一个父工程 -->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
    <build>
        <finalName>app</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.2.2 yml

server:
  port: 10086
spring:
  application:
    name: eureka-server
eureka:
  # 给内置的客户端设置服务端地址
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
    register-with-eureka: false # 不注册自己
    fetch-registry: false #不拉取服务本eureka服务中的服务信息

2.2.3 启动类

@SpringBootApplication
// 开启Eureka服务端支持
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

2.2.4 启动访问

f9dd07a0c0114b1383155d56c17df4e8.png

2.3 将服务注册进 Eureka

给user服务和order服务分别引入依赖:

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


修改 user 和 order 的 yml 文件

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://192.168.0.108:3306/cloud?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: USER-SERVER
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance: # 在Eureka中显示服务的ip地址
    ip-address: 127.0.0.1 # 配置服务器ip地址
    prefer-ip-address: true # 更倾向于使用ip,而不是host名
    instance-id: ${eureka.instance.ip-address}:${server.port} # 自定义实例的id
server:
  port: 9091
spring:
  datasource:
    url: jdbc:mysql://192.168.0.108:3306/cloud?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: ORDER-SERVER
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

重启服务。

f2556ea713e54f6d94e97e04458e25c4.png

服务就已注册进来了。


2.4 通过Eureka调用服务

回看我们之前 order 调用 user 时候的方式是直接通过 RestTemplate 调用的,这样耦合是有些大的,比如我们的 user 服务换了部署地址,就得去动 order 的源代码。实在不妥。

853f80cdc2b04e4c96cdf51ef88cc6ca.png

下来我们通过 Eureka 提供的注册发现服务去调用。

改造OrderController

 @GetMapping("/get/{id}")
    public Order get(@PathVariable("id") Long id){
        String user_server_name = "USER-SERVER";
        String url = "http://" + user_server_name + "/user/get/";
        Order order = orderMapper.selectById(id);
        User user = restTemplate.getForObject(url + order.getUserId(), User.class);
        order.setUser(user);
        return order;
    }


启动访问:

23665b27987746b390c009eb5ed856e5.png

3. Eureka 原理


Eureka 采用了客户端-服务端的设计架构,分为 Eureka Server 和 Eureka Client 两部分。

7bd2d50d8e6d4a8692b0c9e1c99a3b04.png

Eureka Server 是一个基于 RESTful 的服务,用于管理和维护客户端节点的信息。每个 Eureka Client 向 Eureka Server 注册自己提供的服务,并定时通过心跳机制告知 Eureka Server 自己仍然存活。同时,Eureka Server 也会定期对注册在自己那里的每个 Eureka Client 进行监控,以确保它们正常运行。


Eureka Client 则是一个轻量级的 Java 客户端,用于将自己注册到 Eureka Server 并获取所依赖服务的信息。他们使用轮询来访问 Eureka Server 来达到负载均衡的目的。 另外,它还会缓存 Eureka Server 中的服务列表信息,当服务端不能访问时可以快速切换到本地缓存服务列表模式,尽可能降低系统的开销。

c78fca25225946a99d57f1925fb03dff.png

具体流程如下


Eureka Client 启动后,会向 Eureka Server 发送一个注册请求,包含了该客户端所提供的服务实例、IP 地址、端口号等元数据。

Eureka Server 接收到注册请求后,会将该客户端所提供的服务实例信息记录到自身的内存中,同时将变更信息广播给其他的 Eureka Server 节点,以实现服务注册中心的高可用和服务同步。


Eureka Client 通过 “心跳” 机制定期向 Eureka Server 发送请求,以更新服务健康状态、刷新缓存等操作。如果在一定时间内 Eureka Server 没有接收到“心跳”消息,则会将该客户端实例从注册列表中摘除。

Eureka Client 还可以通过发送 RESTful API 请求来查询可用的服务节点信息,以实现负载均衡等功能。


Eureka 的核心对象是服务实例,每个服务实例都可以作为提供者向 Eureka Server 注册自己,同时也可以作为消费者从 Eureka Server 中获取所需服务的信息,从而实现服务发现和调用。

4. 注意


Eurek 已经停止维护 2.x 版本!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
8 0
|
29天前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
1月前
|
Java Spring 容器
Spring底层原理大致脉络
Spring底层原理大致脉络
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
123 9
|
1月前
|
负载均衡 算法 Nacos
SpringCloud 微服务nacos和eureka
SpringCloud 微服务nacos和eureka
58 0
|
1月前
|
XML 前端开发 Java
拼多多1面:聊聊Spring MVC的工作原理!
本文详细剖析了Spring MVC的工作原理,涵盖其架构、工作流程及核心组件。Spring MVC采用MVC设计模式,通过DispatcherServlet、HandlerMapping、Controller和ViewResolver等组件高效处理Web请求。文章还探讨了DispatcherServlet的初始化和请求处理流程,以及HandlerMapping和Controller的角色。通过理解这些核心概念,开发者能更好地构建可维护、可扩展的Web应用。适合面试准备和技术深挖
42 0
|
1月前
|
负载均衡 Java API
Spring Cloud原理详解
Spring Cloud原理详解
67 0
|
1月前
|
负载均衡 Java 网络架构
Spring Cloud原理详解
介绍了Spring Cloud的原理和核心组件,包括服务注册与发现、配置管理、负载均衡、断路器、智能路由、分布式消息传递、分布式追踪和服务熔断等,旨在帮助开发人员快速构建和管理微服务架构中的分布式系统。
52 0
|
1月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
37 0
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡