3-Spring cloud之搭建Ribbon负载均衡——服务器上实操(上)

news2024/11/24 10:00:56

3-Spring cloud之搭建Ribbon负载均衡——服务器上实操(上)

  • 1. 前言
  • 2. ribbon整合eureka入门
    • 2.1 修改相关配置
      • 2.1.1 修改服务消费者pom,引入ribbon相关依赖
      • 2.1.2 修改服务消费者yml,将客户端注册进eureka服务列表内
      • 2.1.3 修改配置类,开启客户端的负载均衡
      • 2.1.4 修改主启动类,开启客户端向注册中心eureka注册服务
      • 2.1.5 修改客户端的访问类,消费者按名字访问微服务
    • 2.2 启动服务,查看效果
  • 3. 部署服务提供者到服务器上(单台)
    • 3.1 修改数据库服务地址
    • 3.2 修改Controller里的方法——为了测试
    • 3.3 打包、启动问题
      • 3.3.1 启动问题——no main manifest attribute
        • 3.3.1.1 问题描述
        • 3.3.1.2 解决问题
        • 3.3.1.3 关于此问题详细解析
      • 3.3.2 解决打出的jar包没有Java文件
    • 3.4 启动、访问、看效果
      • 3.4.1 启动
      • 3.4.2 访问
        • 3.4.2 访问问题
  • 4. ribbon的负载均衡(之轮询)
    • 4.1 在多台机器上部署服务提供者
      • 4.1.1 注意修改yml配置文件
      • 4.1.2 部署到3台服务器上
    • 4.1 启动服务消费者
      • 4.1.1 访问可能出现的问题
        • 4.1.1.1 问题1:502 Bad Gateway
        • 4.1.1.2 问题2:Operation timed out (Connection timed out)
          • 4.1.1.2.1 问题描述
          • 4.1.1.2.2 尝试排查问题
          • 4.1.1.2.3 解决问题
          • 4.1.1.2.4 重新启动服务看效果
      • 4.1.2 问题解决后,重启各服务,观看轮询效果
    • 4.2 ribbon负载均衡架构

1. 前言

  • 本篇文章是继上篇eureka文章之后的更新,上篇文章如下:
    1-Eureka服务注册与发现以及Eureka集群搭建(实操型).

2. ribbon整合eureka入门

  • 在上篇文章的基础上,引入ribbon,让ribbon和eureka结合,实现消费者可以直接调用微服务,不用再管服务提供者的IP和端口号,具体操作请继续……

2.1 修改相关配置

2.1.1 修改服务消费者pom,引入ribbon相关依赖

  • 如下:
    在这里插入图片描述
      <!--引入ribbon相关依赖,ribbon是客户端的负载均衡,ribbon需要和eureka整合-->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-eureka</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-ribbon</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-config</artifactId>
      </dependency>
    

2.1.2 修改服务消费者yml,将客户端注册进eureka服务列表内

  • 如下:
    在这里插入图片描述
    这里将 register-with-eureka 不设置的话,默认是true,就是将消费者服务也注册到注册中心了,待会看效果
    spring:
      application:
        name: dog-consumer
    
    eureka:
      client:  # 客户端注册进eureka服务列表内
    #    register-with-eureka: false  # false表示不向注册中心注册自己
        service-url:
          defaultZone: http://IP1:2886/eureka/,http://IP2:2886/eureka,http://IP3:2886/eureka/
    

2.1.3 修改配置类,开启客户端的负载均衡

  • 如下,添加 @LoadBalanced 注解即可:
    在这里插入图片描述

2.1.4 修改主启动类,开启客户端向注册中心eureka注册服务

  • 添加开启注解,如下:
    @EnableEurekaClient  //开启客户端向注册中心eureka注册服务
    
    在这里插入图片描述

2.1.5 修改客户端的访问类,消费者按名字访问微服务

  • 修改,如下:
    在这里插入图片描述
    • 为什么写成大写的:DOG-PROVIDER,如下:
      在这里插入图片描述

2.2 启动服务,查看效果

  • 首先,启动 eureka集群,我这边一直在服务器上跑着,没停的,本次也没修改,所以不用重新启动
  • 然后启动服务提供者 和 服务消费者
  • 最后观看效果,因为服务提供者也没有修改,所以主要观察服务消费者能否正常访问,以及eureka的注册情况,如下:
    在这里插入图片描述
    在这里插入图片描述
    OK,没问题,ribbon与eureka整合没问题,可问题是,怎么体现负载均衡呢?请继续……

3. 部署服务提供者到服务器上(单台)

  • 为了效果,这里直接在服务器上测试,首先先部署单台,改动点如下:

3.1 修改数据库服务地址

  • 把之前localhost改成真实的IP,前提是安装了mysql,这个在这里就不多说了,如下
    在这里插入图片描述

3.2 修改Controller里的方法——为了测试

  • 为了后续的效果,这里将服务器IP返回前端,如下:
    在这里插入图片描述
        @RequestMapping(value = "/getDogByNum/{dogNum}",method = RequestMethod.GET)
        public Object getDogByNum(@PathVariable("dogNum") Long dogNum) throws UnknownHostException {
            Map<String, Object> resultMap = new HashMap<>();
    
            InetAddress address = InetAddress.getLocalHost();
            String ipAddress = address.getHostAddress();
            System.out.println(ipAddress);
    
            resultMap.put("ipAddress",ipAddress);
            resultMap.put("dog",dogService.getDogByNum(dogNum));
    
            return resultMap;
        }
    

3.3 打包、启动问题

3.3.1 启动问题——no main manifest attribute

3.3.1.1 问题描述

  • 问题如下:
    no main manifest attribute, in dog-provider-8001-1.0-SNAPSHOT.jar
    
    在这里插入图片描述

3.3.1.2 解决问题

  • 解决问题如下:
    在该微服务(工程的对应子模块——微服务提供者)的pom文件里添加,如下配置,注意是子模块里,不是父工程的pom文件里,如下:
    在这里插入图片描述
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${spring-boot.version}</version>
                    <configuration>
                        <mainClass>com.liu.susu.DogProviderApp8001</mainClass>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
  • 再次启动
    在这里插入图片描述

3.3.1.3 关于此问题详细解析

  • 可以参考下面的文章:
    解决no main manifest attribute, in XXX.jar.

3.3.2 解决打出的jar包没有Java文件

  • 解决问题,如下
    在父工程的pom文件里添加如下配置即可:
     <!--解决 打出的jar包里没有Java文件-->
     <resource>
       <directory>src/main/java</directory>
       <filtering>true</filtering>
       <includes>
         <include>**/*.java</include>
       </includes>
     </resource>
    
    在这里插入图片描述

3.4 启动、访问、看效果

3.4.1 启动

  • 好了使用简单脚本启动,如下:
    #!/bin/bash
    JAVA_HOME=$JAVA_HOME
    nohup java -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx4G -jar dog-provider-8001-1.0-SNAPSHOT.jar  -XX:-OmitStackTraceInFastThrow > /dev/null 2>&1 &
    
  • 启动、查看进程
    sh startServer.sh 
    ps -ef | grep java
    
    在这里插入图片描述

3.4.2 访问

3.4.2 访问问题

  • 好了,启动完成之后,就可以访问了,访问可以访问,但是IP有点问题,如下:
    在这里插入图片描述
  • 怎么让IP显示成服务器的公网IP呢?将controller里的代码改一下即可,如下:
    • 修改代码
      在这里插入图片描述

          @RequestMapping(value = "/getDogByNum/{dogNum}",method = RequestMethod.GET)
          public Object getDogByNum(@PathVariable("dogNum") Long dogNum) throws UnknownHostException {
              Map<String, Object> resultMap = new HashMap<>();
      
              InetAddress address = InetAddress.getLocalHost();
              String hostName = address.getHostName();
              System.out.println(getHostName);
      
              HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
              StringBuffer ipAddressStr = new StringBuffer();
              ipAddressStr.append(request.getScheme() + "://");
              ipAddressStr.append(request.getServerName() + ":");
              ipAddressStr.append(request.getServerPort() + "");
              ipAddressStr.append(request.getContextPath() + "/");
              System.out.println(ipAddressStr);
      
              resultMap.put("hostName",hostName);
              resultMap.put("ipAddress",ipAddressStr);
              resultMap.put("dog",dogService.getDogByNum(dogNum));
      
              return resultMap;
          }
      
      • 再次启动看效果,如下:
        在这里插入图片描述
        在这里插入图片描述

4. ribbon的负载均衡(之轮询)

4.1 在多台机器上部署服务提供者

4.1.1 注意修改yml配置文件

  • 3个服务上3个文件不同,不同说了,如下是注意点:
    • 第一点,记得要根据机器换不同的配置文件,这里是3台,112,142,175:
      	spring:
        profiles:
          active: 112
      
      在这里插入图片描述
    • 第二点,注意3台上配置的 instance-id 不能一样,否则eureka注册不上,如下:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

4.1.2 部署到3台服务器上

  • 将服务提供者部署到3台服务器上,用同样的方法把两外两台也部署上即可,并确保可以访问,如下:
    • 查看eureka注册情况,确保3台微服务都注册上来
      在这里插入图片描述

    • 并确保3台机器上是否可以独立访问:
      在这里插入图片描述

4.1 启动服务消费者

4.1.1 访问可能出现的问题

4.1.1.1 问题1:502 Bad Gateway

  • 问题描述:
    我这里是本地启动的消费者服务,启动之后访问就报,502,如下:
    org.springframework.web.client.HttpServerErrorException: 502 Bad Gateway
    
    在这里插入图片描述
  • 问题原因:
    上面已经测试本地启动没问题,怎么把服务提供者部署到服务器上之后,通过服务消费者就不能访问了呢,哦,后来才发现电脑上有代理,开着梯子呢,所以,记得关闭自己的梯子。
  • 解决问题:
    关了代理,重新访问。

4.1.1.2 问题2:Operation timed out (Connection timed out)

4.1.1.2.1 问题描述
  • 问题描述如下:
    Operation timed out (Connection timed out)
    
    Operation timed out (Connection timed out)
4.1.1.2.2 尝试排查问题
  • 排查一:确保服务提供者能正常提供服务,没有宕机;
  • 排查二:检查3台服务提供者的防火墙已经关闭;
  • 排查三:本地ping看能否通
    ping ip
    telnet ip 8001
    
  • 排查四:试试不用负载均衡
    • 去掉开启负载均衡的注解
      在这里插入图片描述
    • controller中将地址写死
      在这里插入图片描述
    • 再看效果,发现可以访问(3个IP都没问题)
      在这里插入图片描述
  • 排查五:试试本地启动服务提供者(8001),服务器上的都停掉
    • 带着负载均衡注解,如下:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    • 访问试试,也没问题
      在这里插入图片描述
      那问题到底是什么呢?哦,原来是因为IP问题,怎么解决,继续……
4.1.1.2.3 解决问题
  • 解决问题
    • 在服务提供者的配置文件里添加如下配置即可解决(主要是配置IP),如下:
      ip-address: 启动服务提供者的IP
      non-secure-port: 8001   # 可以不用配置
      
      在这里插入图片描述
4.1.1.2.4 重新启动服务看效果
  • 先启动一台,如下:
    在这里插入图片描述
    在这里插入图片描述
    可以通过消费者正常访问了,问题解决!

4.1.2 问题解决后,重启各服务,观看轮询效果

  • 这次干脆直接部署4台,将4台微服务重新部署启动,如下:
    在这里插入图片描述
  • 通过服务消费者访问,如下:
    http://localhost/consumer/dog/getDogByNum/1
    
    在这里插入图片描述
    如果部署上的话,可以简单多点几次,默认走负载均衡的是轮询机制

4.2 ribbon负载均衡架构

  • 上面的架构部署设计可以根据下图理解,如下:
    在这里插入图片描述
  • 简单解释一下:
    • 当Ribbon和Eureka配合使用的时候,Ribbon可从Eureka Server中获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。
    • 该结构包含一个Eureka服务器,4个服务提供者以及一个含有Ribbon的服务消费者。4个服务提供者向Eureka服务器注册服务,当多个URL向服务消费者发起请求时,基于Ribbon的负载均衡器能够有效地将请求分摊到不同的机器上。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫爬取双色球开奖结果源码

使用Python编写双色球爬虫&#xff1a;解析彩票数据 引言&#xff1a; 在数字化时代&#xff0c;彩票已经成为人们休闲娱乐的一种方式。而双色球无疑是最受欢迎的彩票之一&#xff0c;它的中奖概率和巨额奖金吸引了无数人的注意。在本文中&#xff0c;我们将介绍如何使用Python…

华为OD机试真题 Python 实现【知识图谱新词挖掘1】【2023Q1 100分】

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 小华负责公司知识图谱产品&#xff0c;现在要通过新词挖掘完善知识图谱。 新词挖掘: 给出一个待挖掘文本内容字符串Content和一个词的字符串word&am…

apple pencil二代平替笔哪个好用?好用的苹果笔推荐

自从ipad和其他的平板电脑都搭配上了电容笔以后&#xff0c;电容笔很好地取代了我们的手指&#xff0c;书写的效率就大大提升了&#xff0c;但由于苹果原装电容笔的价格不够人性化&#xff0c;一直高居不下给普通人带来了很大的负担&#xff0c;特别是对于学生们来说&#xff0…

6个提高图片分辨率的在线网站,真的超级实用!

在日常生活中&#xff0c;我们经常会遇到保存的图片模糊不清的情况。有时候这可能是由于保存方式不当&#xff0c;有时候则是由于图片在上传至网站时被压缩所致&#xff0c;导致画质和分辨率下降。 那么&#xff0c;有没有办法可以提高图片的分辨率和画质呢&#xff1f;事实上…

【笔记】微机原理及接口技术5 -- MCS51单片机概述

MCS-51 CPU 由两个部分组成&#xff1a;运算器和控制器 运算器&#xff1a;算术逻辑单元&#xff08;ALU&#xff09;、位处理器、累加器 ACC 等组成&#xff1b; 控制器&#xff1a;主要有内部晶振和一些定时、控制逻辑组成 存储器 拥有三个存储器地址空间 程序存储器地址…

【内网穿透】Linux服务使用宝塔面板搭建网站,并内网穿透实现公网远程访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 转载自cpolar极点云文章&#xff1a;Linux使用宝塔面板搭建网站&#xff0c;并内网穿透实现公网访问 前言 宝塔面板作为简单好用的服务器运维管理面板&#xf…

第七章 商品详情三

流程&#xff1a; 1、用户在订单服务&#xff08;192.168.232.101&#xff09;下单后&#xff0c;订单服务以生产者身份往rabbitmq&#xff08;192.168.232.104&#xff09;推送消息&#xff0c;下单后将减库存信息推送到rabbitmq 2、数据worker&#xff08;192.168.232.100&…

造船码头行车/电动葫芦限位器无线应用

一、应用背景 近年来&#xff0c;我国造船业在高技术船舶研发和建造方面持续取得新突破&#xff0c;据统计截止到2022年&#xff0c;我国造船业完工量、新接订单量、手持订单量三大指标国际市场份额均保持世界前列。连续13年位居全球居首。随着船舶制造的综合能力不断提高&…

【算法与数据结构】459、LeetCode重复的子字符串

文章目录 一、题目二、解法2.1 暴力破解法2.2 KMP算法2.3 Sunday算法2.4 官方查找算法 三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 2.1 暴力破解法 思路分析&#xff1a;子串多次循环才能构成整个…

【回溯算法part03】| 39.组合总和、40.组合总和||、131.分割回文串

目录 &#x1f388;LeetCode39. 组合总和 &#x1f388;LeetCode40.组合总和|| &#x1f388;LeetCode131.分割回文串 &#x1f388;LeetCode39. 组合总和 链接&#xff1a;39.组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 …

nuxt3 fullpage.js踩坑, fullpage.js 全屏滚动

nuxt3 fullpage.js踩坑&#xff0c; fullpage.js 全屏滚动, fullpage is underfind 我用的是 nuxt 3.6.1 1.引入 fullpage.js(3.0.1), 下载地址 github链接&#xff0c;下载后放到assets文件下 app: {head: {script: [{ src: /assets/fullpage.js, type: "text/javascript…

[BitSail] Connector开发详解系列二:SourceSplitCoordinator

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 ource Connector 本文将主要介绍创建、管理Split的角色SplitCoordinator。 SourceSplitCoordinator 大数据处理框架的核心目的就是将大规模的数据拆分成为多个合理…

皂液机低功耗红外测距感应方案 免触碰红外感应模块WTU201F2 B004

近年来&#xff0c;随着卫生意识的提高&#xff0c;自动感应设备在公共场所、家庭和工作场所中变得越来越重要。在这个领域中&#xff0c;皂液机的自动感应功能成为了关键。为了提供更为智能、高效的用户体验&#xff0c;深圳唯创知音推出了全新的皂液机红外测距感应方案——WT…

自动生成的webservice客户端设置请求消息头信息

这里讲的头消息是指发送webservice请求的HTTP头信息&#xff08;MIME 头信息&#xff09;&#xff0c;而不是SOAP报文里面的Header标签内容。 package example;import mypackage.GetOperInfoRequest; import mypackage.GetOperInfoResponse; import mypackage.Webservice11; i…

怎么把MP3文件转换成OPUS,分享这两个方法给大家!

MP3和OPUS是两种常见的音频格式&#xff0c;用于存储和传输音乐、语音等内容。然而&#xff0c;随着技术的进步和需求的变化&#xff0c;有时我们需要将MP3文件转换为OPUS格式&#xff0c;以便在特定场景下获得更好的音频体验。本文将介绍两种简单而有效的方法&#xff0c;以帮…

flutter RepaintBoundary 截屏图片下载,保存图片不清晰的问题

flutter RepaintBoundary 截屏图片下载&#xff0c;保存图片不清晰的问题 前言一、什么是RepaintBoundary二、RepaintBoundary 能干什么三、RepaintBoundary 保存图片模糊的问题四、RepaintBoundary 使用小demo总结 前言 最近工作中&#xff0c;突然遇到截屏保存图片的问题&…

宝塔安装Jenkins-图文小白教程

一、Jenkins包下载 大家可以从Jenkins官网&#xff08;https://www.jenkins.io/&#xff09;根据自己的需要下载最新的版本。 但Jenkins官网下载较慢&#xff0c;容易造成下载失败。可以去国内的开源镜像网站下载Jenkins最新版本。目前博主使用的是清华大学的开源镜像网站&…

这样建立自己的『知识管理系统』,效率翻倍

在移动互联网时代&#xff0c;我们可以轻松获取大量的知识&#xff0c;但这些知识往往是碎片化的&#xff0c;没有系统性&#xff0c;缺乏深度。尽管我们努力学习了很多知识&#xff0c;但能力的提升却变得缓慢。 为了解决这个问题&#xff0c;我们需要建立一个系统化的知识体系…

【Leetcode】27.移除元素

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的…

Gerrit REST API简单介绍

Gerrit是一款开源免费的代码审查工具&#xff0c;如果其它平台想要获取gerrit数据&#xff0c;比如统计仓库代码提交数据等信息&#xff0c;可以使用Gerrit提供的REST API来获取&#xff0c;本文记录一些我使用到的Gerrit API。 目录 准备工作gerrit APIGerrit REST API使用实例…