【SpringCloud】02 注册中心Eureka的原理与使用

这篇具有很好参考价值的文章主要介绍了【SpringCloud】02 注册中心Eureka的原理与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

阅读提示:

本文是SpringCloud系列第二篇,请先阅读前置文章。
所有代码都基于01认识微服务,了解服务拆分与远程调用中的基础代码cloud-demo,可以前往下载。

一、问题引入

在上一篇文章中,我们在OrderService类的queryOrderById方法里,使用RestTemplate里向user-service微服务发起调用请求,根据用户id查询用户信息,代码如下:

// 2.使用RestTemplate发起http请求 实现远程调用
String url = "http://localhost:8081/user/"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);

当前存在的问题
在微服务中,往往一个服务模块如这里的user-service服务,会部署在多台机器上以应对高并发访问,因此会有多个实例及地址,以本机部署三个user-service服务为例,它们的端口号分别为8081,8082,8083,如下图:
【SpringCloud】02 注册中心Eureka的原理与使用,Spring Cloud,spring cloud,eureka,spring
那么这时我依然使用之前的RestTemplate发起访问请求,会存在以下几个问题:

// 2.使用RestTemplate发起http请求 实现远程调用
String url = "http://localhost:8081/user/"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);
  • user-service实例的ip地址和端口变化时,order-service该如何得知?
    很显然目前我们只能把user-service实例的地址写死在order-service的配置文件中,当user-service实例的地址和端口变化,也要修改order-service的配置文件,说不定还有很多其他微服务,也要调用user-service,当不得已修改user-service实例的地址和端口时,重新部署非常麻烦。
  • 有多个user-service实例的地址时,order-service该选择哪一个?
    1.首先固定选择其中某一个实例,肯定是不合适,因为只要这个user-service实例宕机,调用它的order-service实例也就宕机了,会影响微服务架构的稳定性、可用性。
    2.那么该怎么选择呢?这很难选,因为order-service不知道哪一个实例是健康的,哪一个已经宕机;或者哪一个当前服务器资源比较紧张,暂时不应该访问的(负载均衡)。而且RestTemplate的url地址是写死的,虽然可以在运行过程中修改url地址,但还是回到了问题本身,不清楚该选择哪一个。

二、Eureka的结构与作用

上述问题都需要利用SpringCloud中的注册中心来解决,其中最广为人知的注册中心就是Eureka,其结构如下:
【SpringCloud】02 注册中心Eureka的原理与使用,Spring Cloud,spring cloud,eureka,spring
回答上述两个问题。

  • user-service实例的ip地址和端口变化时,order-service该如何得知?
    user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端),这个叫服务注册。
    eureka-server保存服务名称到服务实例地址列表的映射关系。
    order-service根据user-service服务名称,拉取其实例地址列表。这个叫服务发现。
    在这种服务注册与发现的方式下,order-service甚至不需要把user-service的具体地址写入自己的配置文件中,只需要在访问user-service时,去Eureka服务端拉取目前的user-service服务实例的地址即可。
  • 有多个user-service实例的地址时,order-service该选择哪一个?
    使用@LoadBalanced注解,让order-service从user-service的实例列表中利用负载均衡算法选择其中一个实例地址;并且user-service的实例会定时向Eureka服务端发送心跳,超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除,order-service拉取服务时,就能将故障实例排除了,这就保证了order-service选择user-service实例时,既能保证保证均衡,又能保证排除故障实例。

因此注册中心解决的主要问题就是微服务之间进行远程调用时,让微服务之间能够互相发现对方,同时一定程度上可以监测微服务的健康状态,并提供负载均衡的功能,归根到底解决的就是远程调用时选择哪个实例这一个问题。

注意: 一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端,且每个微服务启动时都会将自己注册到Eureka服务端中。

三、搭建Eureka-server

首先搭建注册中心服务端:eureka-server,这必须是一个独立的微服务。
在cloud-demo模块下,创建一个子模块maven工程,命名为eureka-server。
【SpringCloud】02 注册中心Eureka的原理与使用,Spring Cloud,spring cloud,eureka,spring
引入SpringCloud为eureka提供的starter依赖:

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

给eureka-server服务编写一个启动类,一定要添加一个@EnableEurekaServer注解,开启eureka的注册中心功能:

package cn.itcast.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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

编写配置文件application.yml,内容如下:这里我们设置eureka-server的ip为本机的10086端口

server:
  port: 10086
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:10086/eureka

启动微服务EurekaApplication,然后在浏览器访问:http://127.0.0.1:10086
看到下面结果就是成功了:
【SpringCloud】02 注册中心Eureka的原理与使用,Spring Cloud,spring cloud,eureka,spring

四、服务注册与发现

前面已经说过,一个微服务既可以是服务的提供者,也可以是服务消费者,因此只需要使用同一个依赖spring-cloud-starter-netflix-eureka-client,就可以同时实现一个微服务的注册与发现。

4.1 配置user-service

(1) 引入依赖
在user-service的pom文件中,引入下面的eureka-client(eureka客户端)依赖:

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

(2) 修改配置文件
在user-service中,修改application.yml文件,添加服务名称、eureka地址:
后续其他服务要访问user-service,就是通过这个服务名称来发起请求,因此这里命名最好规范。

spring:
  application:
    name: userservice 
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

(3) 使用IDEA启动多个user-service实例
首先,右键复制原来的user-service启动配置:
【SpringCloud】02 注册中心Eureka的原理与使用,Spring Cloud,spring cloud,eureka,spring
修改运行实例名称为UserApplication2,点击Modify options,点击Add VM Options
【SpringCloud】02 注册中心Eureka的原理与使用,Spring Cloud,spring cloud,eureka,spring
【SpringCloud】02 注册中心Eureka的原理与使用,Spring Cloud,spring cloud,eureka,spring
接着填写-Dserver.port=8082来修改运行端口号
【SpringCloud】02 注册中心Eureka的原理与使用,Spring Cloud,spring cloud,eureka,spring
启动两个User-service实例,可以在eureka控制台看到如下信息:
【SpringCloud】02 注册中心Eureka的原理与使用,Spring Cloud,spring cloud,eureka,spring

4.2 配置order-service

之前说过,服务发现、服务注册统一都封装在eureka-client依赖,因此引入依赖和与配置文件的修改和user-service基本一致。
(1) 引入依赖
在order-service的pom文件中,引入下面的eureka-client依赖

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

(2) 修改配置文件
在order-service中,修改application.yml文件,添加服务名称、eureka地址

spring:
  application:
    name: orderservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

(3) 服务拉取与负载均衡
负载均衡的设置
在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解:

    /**
     * 创建RestTemplate并注入Spring容器
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

服务拉取
修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务名userservice代替ip+端口的url

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.使用RestTemplate发起http请求 实现远程调用
        String url = "http://userservice/user/"+order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        // 封装到order中
        order.setUser(user);
        // 4.返回
        return order;
    }

@LoadBalanced注解可以让RestTemplate能够识别服务的名称而不是直接使用URL。这样,发送HTTP请求时,RestTemplate会根据服务名称来选择一个可用的实例进行调用。它会根据负载均衡策略,在多个实例之间分配请求,以达到负载均衡的效果,当然前提是结合注册中心使用。
详细原理请阅读:https://zhuanlan.zhihu.com/p/617967367

4.3 效果测试

重新启动OrderApplication,浏览器访问localhost:8080/order/101,可以发现IDEA控制台中8081和8082端口的UserApplication服务轮流打印信息,因此注册中心部署和服务注册、发现,负载均衡都成功实现。文章来源地址https://www.toymoban.com/news/detail-754156.html

到了这里,关于【SpringCloud】02 注册中心Eureka的原理与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心

    单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署。 优点:架构简单;部署成本低(打jar包、部署、负载均衡就完成了) 缺点:耦合度高(维护困难、升级困难,不利于大项目开发) 分布式架构 根据业务功能对系统做拆分,每个业务功能模块作为独立

    2024年02月13日
    浏览(27)
  • 【spring cloud学习】3、Eureka Server注册中心

    Eureka本身是Netflix开源的一款注册中心产品,并且Spring Cloud提供了相应的集成封装。选择Eureka作为注册中心实例来讲解是出于以下原因: (1)Eureka在业界的应用十分广泛,整个框架经受住了Netflix严酷生产环境的考验。 (2)除了Eureka注册中心外,Netflix的其他服务治理功能也十

    2024年02月11日
    浏览(35)
  • Spring Cloud Eureka Service Registry 服务注册中心实践

    作者:禅与计算机程序设计艺术 在分布式微服务架构下,服务发现是保证应用可用的关键组件之一。在Spring Cloud体系中,服务发现中心通过Netflix Eureka实现。 本文将介绍Spring Cloud Eureka服务注册中心的机制、配置及使用方法,并通过实例对Eureka的功能及其局限性进行详细阐述

    2024年02月11日
    浏览(43)
  • 特别详细的Spring Cloud 系列教程1:服务注册中心Eureka的启动

    Eureka已经被Spring Cloud继承在其子项目spring-cloud-netflix中,搭建Eureka Server的方式还是非常简单的。只需要通过一个独立的maven工程即可搭建Eureka Server。  我们引入spring cloud的依赖和eureka的依赖。 注意spring cloud和springboot的版本要对应,不然容易出现各种奇怪的错误。 不知道spr

    2024年04月08日
    浏览(52)
  • 使用SpringCloud搭建Eureka注册中心

    目录 前言 一、搭建EurekaServer 1、在cloud-demo父工程下,创建子模块 eureka-server。  2、引入eureka依赖 3、给eureka-server模块编写启动类 4、编写配置文件 5、启动服务 二、服务注册  1、引入依赖 2、配置文件 3、启动服务  三、服务发现 1、引入依赖 3、服务拉取 总结          在

    2024年02月04日
    浏览(26)
  • 客快物流大数据项目(一百一十三):注册中心 Spring Cloud Eureka

    文章目录 注册中心 Spring Cloud Eureka 一、Eureka 简介 二、架构图

    2023年04月25日
    浏览(44)
  • SpringCloud(二) Eureka注册中心的使用

    在SpringCloud(一)中,我们学会了使用RestTemplate进行远程调用,但是在调用user-service时候需要在order-service中发送http请求,请求中需要书写对应微服务的ip和端口号,十分不方便,如果此时有多个user-service实例的话,就不知道调用哪个了(除非每次调用的时候都对ip和端口号进行调整),所以本

    2024年02月07日
    浏览(31)
  • 如何使用SpringCloud Eureka 创建单机Eureka Server-注册中心

    😀前言 本篇博文是关于使用SpringCloud Eureka 创建单机Eureka Server-注册中心,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客

    2024年02月09日
    浏览(25)
  • Spring Cloud - Eureka原理、注册、搭建、应用(全过程详解)

    目录 一、Eureka 注册原理 1.1、为什么要使用 Eureka 1.2、Eureka 的工作流程及原理 1.3、eureka 的作用 二、具体实现 2.1、搭建注册中心 2.2、服务注册和部署 2.2.1、user-service 服务注册 2.2.2、服务部署 2.2.3、order-service 服务注册 2.2.4、验证服务 2.3、服务发现 2.3.1、在order-service完成服务

    2024年02月11日
    浏览(28)
  • 在项目中同时使用SpringCloud和Dubbo,注册中心选用Eureka?

    在pom.xml文件中添加Dubbo相关依赖:服务提供者和服务消费者都需要 1)配置服务提供者 1、在配置文件中配置Dubbo的相关信息: 2、在服务提供者的启动类上添加@EnableDubbo注解: 3、编写服务提供者的接口和实现类: 添加@Service,指定interfaceClass属性来指定要暴露的接口 2)配置

    2024年01月18日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包