SpringCloud集成Eureka并实现负载均衡

文章目录

    • 前言
    • 1.Eureka
    • 2.整合Eureka作为注册中心
      • 2.1创建maven工程
      • 2.2依赖配置(Eureka-Server)
      • 2.3业务配置(Eureka-Client)
      • 2.4服务调用流程
    • 3.集成负载均衡

前言

辗转两家公司也算工作了大半年,有幸见识过很多微服务架构,比如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作为注册中心

给大家提供一个我已经整合好的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 {@ResourceEurekaClient 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的实例上:
在这里插入图片描述
负载均衡成功实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/178685.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

香港优才计划需要什么条件?2023申请条件/流程/政策放宽!

香港优才计划需要什么条件&#xff1f;2023申请条件/流程/政策放宽&#xff01; 香港优才计划全称&#xff1a;“香港优秀人才入境计划”&#xff0c;是香港特区政府为了吸引优秀人才来港定居&#xff0c;借以提升香港的国际竞争力&#xff0c;于2006年6月正式推行的。 2022年1…

2年博士后|心外医生赴美国耶鲁大学开展研究

G医生决定放弃申报CSC&#xff0c;改为自费出国&#xff0c;并在美国密歇根大学安娜堡分校和耶鲁大学两所名校中选择了更为出名的后者。因为不是CSC出资&#xff0c;G医生得以通过签证&#xff0c;顺利出国&#xff0c;实现了在世界知名高校从事2年博士后的个人职业规划目标。 …

lc121. 买卖股票的最佳时机

一次遍历&#xff0c;一边遍历一边修改买入的价格&#xff0c;一边比较取得最大利润 public class BuyAndSellStocks {public static void main(String[] args) {int[] arr {7,1,5,3,6,4};int[] arr1 {7,6,4,3,1};System.out.println(buyAndSellStocks(arr));System.out.pri…

IDEA从Gitee拉取代码,推送代码教程

打开IDEA&#xff0c;选择Get from Version Control 输入Gitee 仓库项目的URL地址 URL地址输入后点击Clone&#xff0c;即拉取成功 向Gitee提交推送代码 右键选中项目&#xff0c;选中Git 第一步先点击 Add 第二步 点击Commit填写提交信息&#xff0c;点击Commit就会出现下面…

蚂蚁集团首次披露数字科技业务海外发展数据 营收规模同比增长300%

蚂蚁集团资深副总裁、数字科技事业群总裁蒋国飞15日在新加坡金融科技节期间表示&#xff0c;过去一年&#xff0c;蚂蚁数科通过科技产品带来的海外营收规模增长了 300%&#xff0c;其中尤以菲律宾、马来西亚、印度尼西亚等新兴市场国家为主。这是蚂蚁集团首次披露数字科技业务板…

centos7系统离线安装tcpdump抓包软件、使用教程

tcpdump 是Linux系统下的一个强大的命令&#xff0c;可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤&#xff0c;并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 本教程对tcpdump命令使用进行讲解说明&#xff0c;通…

免费IDEA插件分享:Apipost-Helper

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;无需安装、打开任何其他软件&#xff1b;写完代码IDEA内一键调试&#xff0c;无需安装、打开任何其他软件&#xff1b;生成API目录树&#xff0c;双击即可快速…

Mysql中的JDBC编程

JDBC编程 1.JDBC的数据库编程2.JDBC工作原理3.JDBC使用3.1JDBC开发案例3.2JDBC使用步骤总结 4.JDBC API4.1数据库连接Connection4.2 Statement对象4.3 ResultSet对象4.4 释放 5.Java代码操作数据库 1.JDBC的数据库编程 JDBC&#xff0c;即Java Database Connectivity&#xff0…

vite => .env 文件配置和使用

.env.development .env.production VITE_API_BASE_URL /api # 开发环境代理地址 .env.development 是在开发环境中的代理地址 .env.production 是在线上的代理地址 &#xff08; 两个 .env 内部的变量都是一样的 vite 会在你开发环境和线上环境自动做切换 &#xff09; …

手机,蓝牙开发板,TTL/USB模块,电脑四者之间的通讯

一,意图 通过手机蓝牙连接WeMosD1R32开发板,开发板又通过TTL转USB与电脑连接.手机通过蓝牙控制开发板上的LED灯的开,关,闪等动作,在电脑上打开串口监视工具观察其状态.也可以通过电脑上的串口监视工具来控制开发板上LED灯的动作,而在手机蓝牙监测工具中显示灯的状态. 二,原料…

ubuntu18.04安装google浏览器

下载google安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 安装google浏览器 sudo dpkg -i google-chrome-stable_current_amd64.deb 执行安装 sudo apt-get -f install 启动浏览器 在应用程序中找到google图标点击运行

langchain 之 Tools 多案例使用(一)

原文&#xff1a;langchain 之 Tools 多案例使用&#xff08;一&#xff09; - 简书 ATTENTION: 如果采用 openai 的接口&#xff0c;需要走代理&#xff0c;本文采用 proxychains 进行设置。开启 debug 模式后&#xff0c;能看到更多的输出信息。 import langchain langcha…