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

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-consumereureka: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.hqwc.cn/news/9675.html

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

相关文章

用户与组管理介绍

文章目录 一、服务器系统版本介绍二、用户管理1. 用户概述2. 内置账户3. 配置文件4. 用户管理命令 三、组管理1. 组概述2. 内置组&#xff08;系统自带的组&#xff09;3. 组管理命令 一、服务器系统版本介绍 Windows服务器系统&#xff1a;win2000、win2003、win2008、win2012…

charles 如何获取电脑端微信小程序接口

安装证书 设置代理端口 即可抓取美团酒店小程序的数据 从charles 可以抓取出header 请求&#xff0c;没有所谓的通过遍历循环能简单的得到数据&#xff0c;请求包含加密信息 随便改下数据就是 所以如果要得到这些数据&#xff0c;还非得通过小程序模拟人滑动获取数据&…

<QT开发> QT开发工具-之-QT应用程序打包

&#xff1c;QT开发&#xff1e; QT开发工具-之-QT应用程序打包 一 前言 笔者为什么会写这篇文章呢&#xff1f;这是因为&#xff0c;笔者使用windows QT开发了一个测试工具。目的是通过TCP/IP测试其它应用程序。首先这个QT程序是笔者自己开发的&#xff0c;所以笔者的电脑当…

【数学建模】国赛真题分析 2012 A题 葡萄酒的评价

2012 A题 葡萄酒的评价 优秀论文地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/19WGpybgM6RncxTYhx61JRA?pwdvl22 提取码&#xff1a;vl22 –来自百度网盘超级会员V6的分享 确定葡萄酒质量时一般是通过聘请一批有资质的评酒员进行品评。每个评酒员在对葡萄酒进…

万能的微信小程序个人主页:商城系统个人主页、外卖系统个人主页、购票系统个人主页等等【全部源代码分享+页面效果展示+直接复制粘贴编译即可】

前言 以下给出来四个常见的小程序个人主页,分别是商城系统个人主页,外卖系统个人主页,挂号系统个人主页,电影购票系统个人主页。包括完整的页面布局代码,完整的样式代码。使用的时候,只需要将页面代码和样式代码复制到自己项目对应的页面即可。而且可以根据已有代码只需稍…

【Go】Go 语言教程--语言变量(五)

往期教程&#xff1a; Go 语言教程–介绍&#xff08;一&#xff09;Go 语言教程–语言结构&#xff08;二&#xff09;Go 语言教程–语言结构&#xff08;三&#xff09;Go 语言教程–数据类型&#xff08;四&#xff09; 文章目录 变量声明多变量声明值类型和引用类型简短形…

Scala特证/特质【6.7 特质(Trait)】

Scala特证/特质【6.7 特质&#xff08;Trait&#xff09;】 6.7 特质&#xff08;Trait&#xff09;Java 的接口接口的作用抽象类的作用 6.7.1 特质声明6.7.2 特质基本语法6.7.3 特质叠加6.7.4 特质叠加执行顺序6.7.5 特质自身类型6.7.6 特质和抽象类的区别 &#xff08;任意内…

新颖的文档、视频交互方式:以《GPT API Unofficial Docs》和《渐构》为例

一、背景 无意中看到一份 《GPT API 非官方文档》&#xff1a;https://gpt.pomb.us/ 被网站的交互方式所吸引&#xff0c;颇为新颖&#xff0c;值得借鉴。 左侧是对应的 API 代码调用示例&#xff0c;右侧是文档的每个部分&#xff0c;滑动到对应部分&#xff0c;左侧相关的代…

【UnityDOTS 十一】SharedComponent介绍

SharedComponent介绍 SharedComponent内存图 共享组件的值数组在单独的SharedComponentDataArrary中。每个Chunk中有一个单独的Handle指向这个值。 所以这个Chunk中放的不只是ArcheType相同的Entity&#xff0c;他们所指向的ShareComponent值也是相同的。 同时修改一个Entity…

PostgreSQL如何根据执行计划进行性能调优?

EXPLAIN命令 PG中EXPLAIN命令语法格式如下&#xff1a; EXPLAIN [(option[,...])] statement EXPLAIN [ANALYZE] [VERBOSE] statement该命令的options如下&#xff1a; ANALYZE [boolean]VERBOSE [boolean]COSTS [boolean]BUFFERS [boolean]FORMAT {TEXT | XML | JSON | YAM…

20.BeautifulSoup库的安装及导入

文章目录 1.BeautifulSoup库简介2.BeautifulSoup库的安装3.BeautifulSoup和beautifulsoup4的区别4.获取网页源代码知识回顾4.1 手动获取网页的源代码4.2 requests库获取网页的源代码 5. 利用bs4库输出网页源代码6.bs4库的导入语法 1.BeautifulSoup库简介 BeautifulSoup库是Pyt…

【机器学习】机器故障的二元分类模型-Kaggle竞赛

竞赛介绍 数据集描述 本次竞赛的数据集&#xff08;训练和测试&#xff09;是从根据机器故障预测训练的深度学习模型生成的。特征分布与原始分布接近&#xff0c;但不完全相同。随意使用原始数据集作为本次竞赛的一部分&#xff0c;既可以探索差异&#xff0c;也可以了解在训…