SpringCloud集成Eureka并实现负载均衡的过程详解

 更新时间:2023年11月16日 09:36:05   作者:懒羊羊.java  
这篇文章主要给大家详细介绍了SpringCloud集成Eureka并实现负载均衡的过程,文章通过代码示例和图文讲解的非常详细,对大家的学习或工作有一定的参考价值,需要的朋友可以参考下

1.Eureka

你问我Eureka是什么,其实就是一个基于SpringBoot的Java程序。解压Eureka-server的jar包之后,可以清楚看到一个标准的Java目录结构(还有一些存放前端页面的static文件):

在这里插入图片描述

和nacos非常相似,只不过Eureka作为注册中心默认是将实例信息存放在eureka-server内存中,这比较适用于开发环境与测试环境,生产环境中还是建议配置相应的数据库表,做好数据持久化。在启动方式上,二者大体相似,shell脚本,maven模块启动,docker镜像…都可以实现。

2.整合Eureka作为注册中心

给大家提供一个我已经整合好的demo(用户-支付的场景),实现了服务间的注册与发现,并且有数据库表的支持,可以进行简单的调用:https://gitee.com/lazy-sheep-java/cloud-eureka.git
下面采用将Eureka-server作为独立maven模块的方式启动来作为注册中心,其实本质也就是扫描运行Eureka-server的jar包而已,并在此过程中做一些人为配置:

2.1创建maven工程

创建一个父-子结构的maven工程,这个很简单点点点就好

在这里插入图片描述

2.2依赖配置(Eureka-Server)

作为独立的maven模块启动Eureka服务,只需要引入核心依赖,配置一个启动类,并配置相应路径端口即可提供服务:

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

在这里插入图片描述

server:
  port: 10086 # 服务端口
spring:
  application:
    name: eureka-server # eureka的服务名称
eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

2.3业务配置(Eureka-Client)

在业务模块中,都属于Eureka的客户端,其核心依赖为:

        <!--eureka客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

并在相应的模块中配置服务端的地址

在这里插入图片描述

直到这里,当启动eureka-server、user-service模块之后,登录http://127.0.0.1:10086就会发现,Eureka-server作为注册中心已经成功注册了user-service服务,就像这样:

在这里插入图片描述

2.4服务调用流程

在一个订单服务(A)调用用户服务(B)的模型中,A服务从Eureka-server获取B服务的地址。在A服务中使用RestTemplate通过getForObject()方法发送HTTP请求到B服务的地址,并处理返回的响应将其封装为指定的对象。

在这里插入图片描述

这是一个最简单的调用链路。用非官方语言描述该过程,即A拿着B的使用说明书向B发消息并得到了回应,而Eureka正是那本说明书

当然,在生产环境中一个微服务不太可能只会有单实例,更多的是一服务多实例的形式,当被调用方接收到调用请求,会去做负载均衡的处理,从而将请求落到合适实例上。以此来实现高可用、高扩展、高伸缩…

3.集成负载均衡

首先给一个服务多部署几个实例:

在这里插入图片描述

效果就像这样:

在这里插入图片描述

以前我们拉取的是某个服务的那个实例,现在则是拉取某个服务的实例列表。并在此基础上通过负载均衡将发来的请求指定到其中的某一实例上。

那要怎么实现呢?

只需要在服务调用方添加一个注解即可,最简单的方式就是这样:

    @Bean
    @LoadBalanced //负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

其实,在RestTemplate内部继承了一个拦截器(实现请求的转发,也就是负载均衡),而@LoadBalance注解则是帮助开启了该功能

在这里插入图片描述

注解本身是没有实现相关功能的(后面分析实现原理):

在这里插入图片描述

言归正传

现在我们的user服务已经有三个实例,并且已经进入到了负载均衡的列表

在这里插入图片描述

我们用aop做一个切面,来把负载均衡分发到服务实例上的信息以日志的形式打印到控制台,以便更直观地看到均衡的效果:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

注入Eureka客户端,通过提供的api来查询服务的客户端分发到的实例信息:

@Aspect
@Component
@Slf4j
public class RequestAspect {
    @Resource
    EurekaClient eurekaClient;

    @Before(value = "execution(* com.yu7.user.web.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        String className = joinPoint.getTarget().getClass().getName();
        log.debug("调用方法:{} ", className + "." + methodName);
        InstanceInfo instanceInfo = eurekaClient.getApplicationInfoManager().getInfo();
        log.debug("负载均衡到的实例信息为:{}",instanceInfo.getInstanceId());
    }
}

当调用方再次发起请求,观察控制台的信息,可以直接看到请求被分发到了端口为8084的实例上:

在这里插入图片描述

负载均衡成功实现

以上就是SpringCloud集成Eureka并实现负载均衡的过程详解的详细内容,更多关于SpringCloud集成Eureka的资料请关注脚本之家其它相关文章!

相关文章

  • Java编程获取当前屏幕分辨率的方法示例

    Java编程获取当前屏幕分辨率的方法示例

    这篇文章主要介绍了Java编程获取当前屏幕分辨率的方法,涉及java针对系统硬件信息的相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • Java编程实现基于TCP协议的Socket聊天室示例

    Java编程实现基于TCP协议的Socket聊天室示例

    这篇文章主要介绍了Java编程实现基于TCP协议的Socket聊天室,结合实例形式详细分析了java基于TCP协议的Socket聊天室客户端与服务器端相关实现与使用技巧,需要的朋友可以参考下
    2018-01-01
  • 详解Java发送HTTP请求

    详解Java发送HTTP请求

    这篇文章主要介绍了Java发送HTTP请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 一文详解SpringBoot使用Kafka如何保证消息不丢失

    一文详解SpringBoot使用Kafka如何保证消息不丢失

    这篇文章主要为大家详细介绍了SpringBoot使用Kafka如何保证消息不丢失的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以参考一下
    2025-01-01
  • 通过实例了解java checked和unchecked异常

    通过实例了解java checked和unchecked异常

    这篇文章主要介绍了通过实例了解checked和unchecked异常,Java异常分为两种类型,checked异常和unchecked异常,另一种叫法是异常和错误。下面小编就带大家来一起学习一下吧
    2019-06-06
  • Java开发之Spring连接数据库方法实例分析

    Java开发之Spring连接数据库方法实例分析

    这篇文章主要介绍了Java开发之Spring连接数据库方法,以实例形式较为详细的分析了Java Spring开发中针对数据库的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • 图文讲解IDEA中根据数据库自动生成实体类

    图文讲解IDEA中根据数据库自动生成实体类

    这篇文章主要以图文讲解IDEA中根据数据库自动生成实体类,本文主要以Mysql数据库为例,应该会对大家有所帮助,如果有错误的地方,还望指正
    2023-03-03
  • Eclipse+Java+Swing+Mysql实现工资管理系统

    Eclipse+Java+Swing+Mysql实现工资管理系统

    这篇文章主要介绍了Eclipse+Java+Swing+Mysql实现工资管理系统,对正在工作或者学习的你有一定的参考价值,需要的朋友可以参考一下
    2022-01-01
  • 多用多学之Java中的Set,List,Map详解

    多用多学之Java中的Set,List,Map详解

    下面小编就为大家带来一篇多用多学之Java中的Set,List,Map详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • SpringCache 分布式缓存的实现方法(规避redis解锁的问题)

    SpringCache 分布式缓存的实现方法(规避redis解锁的问题)

    这篇文章主要介绍了SpringCache 分布式缓存的实现方法(规避redis解锁的问题),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11

最新评论