当前位置: 代码网 > it编程>编程语言>Java > SpringCloud集成Eureka并实现负载均衡

SpringCloud集成Eureka并实现负载均衡

2024年07月31日 Java 我要评论
笔者认为:流行的不一定是最好的,如果只学习最流行的技术,这对以后的发展是很受限的。作为后端我们还是需要追求一定的广度。在以后的职业生涯中遇到一些特殊业务场景,才能够有更多的方案去灵活应对!

前言

辗转两家公司也算工作了大半年,有幸见识过很多微服务架构,比如dubbo+redis的组合;dubbo+zookepper的组合;springcloud+eureka的组合;springcloud+nacos的组合…
每一种组合都有属于自己的故事。
笔者认为:流行的不一定是最好的,如果只学习最流行的技术,这对以后的发展是很受限的。作为后端我们还是需要追求一定的广度。在以后的职业生涯中遇到一些特殊业务场景,才能够有更多的方案去灵活应对!当领导让你做技术选型,你直接好几套方案往他面前一摆,这真的很酷炫。
我想从当下最流行的springcloud体系谈起,从demo到底层循序渐进地整理出每一套组合,也非常希望能够对你起到一些绵薄的帮助~

故事从eureka(译文:发现你了)说起…

1.eureka

你问我eureka是什么,其实就是一个基于springboot的java程序。解压eureka-server的jar包之后,可以清楚看到一个标准的java目录结构(还有一些存放前端页面的static文件):
在这里插入图片描述
和nacos非常相似,只不过eureka作为注册中心默认是将实例信息存放在eureka-server内存中,这比较适用于开发环境与测试环境,生产环境中还是建议配置相应的数据库表,做好数据持久化。在启动方式上,二者大体相似,shell脚本,maven模块启动,docker镜像…都可以实现。

2.整合eureka作为注册中心

下面采用将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的实例上:
在这里插入图片描述
负载均衡成功实现

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com