微服务综合部署——SpringBoot项目制作Docker镜像注册在Zookeeper并利用K8S技术部署

news2024/9/25 13:25:38

一、如果你要从头开发一个基于微服务架构的项目,项目中的服务最终要部署在k8s管理的镜像环境中,你认为应如何创建项目?与本次实验过程相比,哪些改进可以让开发更加合理高效?

第一步:搭建项目并制作合适的jar包

        我们可以仿照实验二中的框架来搭建我们的服务,首先搭建一个Springboot的项目,随后在这个项目中定义我们的接口规范,并且要按照预期的要求编写业务逻辑代码,实现具体的功能;其次我们可以利用Zookeeper和Dubbo来管理我们的服务,将我们的服务注册到Zookeeper服务中心,利用Dubbo的客户端界面来进行管理;最终我们要选择比较稳定的JDK版本和其他类似的配置环境,确保我们的服务可以稳定的运行,确认后利用IDEA集成的功能将整个项目打包成jar包。在这里可以直接在Windows环境下实现,打开CMD输入java -jar +XXX.jar检测是否可以正常运行,若正常运行,Dubbo是否可以检测到。其次要注意,由于要部署到K8S中,我们的Zookeeper的IP地址要将默认的127.0.0.1更改为服务器的IP,否则服务器上部署的Dubbo将无法识别到容器内的服务程序。

第二步:将jar包制作成Docker镜像并进行部署

        我们可以直接通过Dockerfile来将上一步生成的jar包制作成dubbo镜像,随后生成docker镜像后,我们可以使用docker images指令来查看本地是否生成了镜像;如果需要部署到非本地的服务器集群,那么我们需要将镜像打好标签,push到dockerhub上。随后,我们编写yaml文件来对服务进行部署。这里要注意,yaml文件和dockerfile文件中一定要加入java -jar启动指令,同时要规定好服务暴露的端口以及主机的端口,并且要保持统一。做好这些后,我们将这个deployment apply,利用K8S的指令kubectl get pods -a或kubectl describe pods来详细查看镜像的运行状态。有的时候,即便是status显示running,依然可能发生一些问题。我们一定要进入到容器内部,利用describe来检查容器内镜像是否正常启动并持续提供服务。如果这一切处理得当,我们可以在zookeeper下的bin文件夹下,打开zkCli.sh并运行./zkCli.sh。通过输入ls /dubbo/加服务的UserManager/providers即可查看到提供服务的容器的IP,这些IP是相互独立的,与我们在kubectl describe pods看到的是一致的。此时,我们调用消费者,就可以享用来自不同容器的提供者所提供的的服务了;另外,我们可以直接利用K8S技术直接对容器进行管理。

改进:

  1. 明确服务的具体需求,减少对java源代码的修改。由于部署的过程是十分繁琐的,如果一开始的源代码就存在问题,那么会一遍又一遍的进行部署,会浪费大量的开发时间。因此尽量保证一遍过。
  2. IDEA中有类似的插件,可以直接将本地与提供docker服务环境的服务器相连,我们可以利用这个插件直接将项目以镜像的形式部署到远端,而避免了中间复杂而繁琐且易出错的部署过程。这将大大节约我们的开发时间。

二、如何将实验中多个provider服务实例的负载均衡策略改为轮询调用?即在多次反复调用时轮流调用各个服务实例

        Dubbo官方提供了轮询负载均衡算法,通常是通过“轮询+权重”来进行实现。

 

算法步骤

1、计算服务提供者的总权重。

2、每个服务提供者除了始终不变的固定权重以外,需要记录服务提供者当前权重。

3、每次请求,更新所有的服务提供者的当前权重,当前权重 = 当前权重 + 固定权重。

4、从上一步得到的结果中,选择一个当前权重最大的服务提供者用于处理请求,如果存在多个,那么就看遍历的过程中先遇到哪个服务提供者就是哪一个。并且,选中的权重最大的服务提供者更新其当前权重 = 当前权重 - 总权重。

 

举一个例子

三个服务提供者的固定权重分别是10,20,50,假设其当前权重依次为0,0,0

1、计算总权重 10+20+50 = 80

2、当请求来了,更新三个服务提供者的当前权重,当前权重 = 当前权重+固定权重,依次结果为10,20,50.

3、从中选择最大的一个,也就是第三个用于处理请求,同时将其当前权重更新:当前权重 = 50 - 80 = -30

4、所以此时三个服务提供者的当前权重依次为10,20,-30

5、当第二个请求来的时候,更新三个服务提供者的当前权重,当前权重 = 当前权重+固定权重,依次结果为20,40,20

6、从重选择最大的一个,也就是第二个用于处理请求,同时将其当前权重更新:当前权重 = 40 - 80 = -40.

7、依次类推。

如果我们想使用均衡的轮询策略,那么我们只需要将上述的权重设置为均等的正值即可。具体的算法实现如下所示:

先来看一下WeightedRoundRobin对象,一个服务提供者节点,对应一个WeightedRoundRobin对象,该对象记录了服务提供者的权重,当前的权重以及上一次权重更新的时间。

 RoundRobinLoadBalance中的doSelect方法如下:

 

 

        methodWeightMap 方法权重Map用于保存服务方法提供者集群的WeightedRoundRobin对象集合。一个服务方法提供者对应一个WeightedRoundRobin。key是服务提供者的身份信息,value是WeightedRoundRobin对象。

        遍历所有的服务提供者,

        根据它的身份信息以及服务提供者的权重。

        基于身份信息得到WeightedRoundRobin对象,如果没有的话new一个。

        若缓存中的WeightedRoundRobin的权重 不等于刚得到的weight,那么就更新WeightedRoundRobin中的weight。

        WeightedRoundRobin中的当前权重自增,当前权重 = 当前权重 + 固定权重,并设置更新的时间。记录当前权重最大的节点的信息,并统计总权重。

        若服务提供者列表和map的大小不一致,说明有服务提供者挂了,那么根据WeightedRoundRobin中的lastUpdate字段,判断是否存活,移除挂了的服务提供者。对找到的最大的当前权重的服务提供者进行更新当前权重,它的当前权重 = 当前权重 - 总权重。返回最大的服务提供者节点。

        此外,还有一种利用计数器取模的方法:

        如果所有服务器的该接口方法的权重一样,则直接内部的序列计数器( sequences ) +1 然后对服务器的数量进行取模来决定调用哪个服务器上的服务;如果服务器的该接口方法的权重不一样(就是说存在预热中的服务器),则找到其中最大的权重,然后将内部的权重计数器( weightSequences ) +1 并对该最大权重数取模,然后再找出权重比该取模后的值大服务器列表,最后通过内部的序列计数器( sequences ) +1 然后对服务器列表数量进行取模来决定调用哪个服务器上的服务。

 三、实验过程中遇到的主要问题与解决办法。

        1.jar包无法找到主清单而无法运行

                加入插件

                 启动类不要放在test下,尽量放在源代码目录下

        2.打包编码报错

         3.jar在本地和服务器可以运行,但是在容器里无法持续运行

                这个问题实际上就是自己的业务逻辑的问题,一旦发现了,不要去思考到底是为什么, 

        首先尝试加入一些死循环是否可以保持进程的活性。

         4.Dubbo注册中心找不到容器中的服务

             一般出现这个问题,主要由以下几个原因:

        1.容器假running,实际上根本就没有注册上,他一直就没有成为provider。这种情况通常是由于jar包本身无法正常运行所导致,应当立即检查源代码,或者拉取的镜像是不是你的最新版本。

        2.容器跑起来了,但是就是找不找。存在两种可能,第一种,你忘记了将zookeeper注册中心的IP更改为服务器IP;第二种,业务逻辑有问题。程序在注册成功后立即终止,running的进程时间99.99%都是在启动,注册上的一瞬间就崩溃了,dubbo甚至来不 及产生任何反应。这时就应该检查业务逻辑了。

        5.如何让消费者显示调用的服务者的IP 

        我们可以在provider中添加功能,迫使其自动输出所在容器的IP。我们只需利用java自带的网络工具包即可,具体实现逻辑和代码如下图所示:

 

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

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

相关文章

回溯算法总结

目录介绍伪代码例题:解释:回溯算法中的优化去重伪代码剪枝常见题型子集例题全排列例题参考资料介绍 递归(DFS)是一个劲的往某一个方向搜索,而回溯算法建立在 DFS 基础之上的,但不同的是在搜索过程中,达到结束条件后&am…

SAP ABAP 扫描 ABAP 源代码(RS_ABAP_SOURCE_SCAN)

SAP ABAP 扫描 ABAP 源代码(RS_ABAP_SOURCE_SCAN) 引言: RS_ABAP_SOURCE_SCAN 是一个 SAP 标准 ABAP 报表程序,通过输入字符串文本,扫描 ABAP 源代码,列示查找字符串在 ABAP 源代码中出现的位置清单。本文…

20行python代码的入门级小游戏

0、背景: 作为一个python小白,今天从菜鸟教程上看了一些python的教程,看到了python的一些语法,对比起来(有其他语言功底),感觉还是非常有趣,就随手添了一点内容,改了一个…

【车载开发系列】CAN总线通信---总线报文格式

【车载开发系列】CAN总线通信—总线报文格式 CAN总线通信---总线报文格式【车载开发系列】CAN总线通信---总线报文格式一.什么是ISO15765二.ISO15765的目的三.单帧传输的概念四.多帧传输的概念五.诊断报文格式1)首帧FF2)连续帧CF3)流控帧FC4&…

【JavaScript】for循环

文章目录for循环案例1:两数相加案例2:绘制九九乘法表案例3:水仙花数案例4:绘制菱形案例5:计算表达式结果break和continue图片切换效果案例(轮播图结构)一、JavaScript代码二、HTML结构和CSS样式…

基于java+springmvc+mybatis+vue+mysql的演出道具租赁管理系统

项目介绍 前端页面: 功能:首页、道具出租、公告资讯、个人中心、后台管理 管理员后台页面: 功能:首页、个人中心、用户管理、商家管理、道具类型管理、道具出租管理、租赁订单管理、道具归还管理、我的收藏管理、系统管理 用户…

密西根大学张阳实验室郑伟博士在CASP15蛋白质结构预测大赛中斩获多项冠军

简报:在有着蛋白质结构预测领域奥林匹克竞赛之称的最新一届CASP比赛中(CASP15),密西根大学张阳教授和Peter Freddolino教授实验室的郑伟博士在多个比赛项目中获得冠军。其中D-I-TASSER算法(参赛名:“UM-TBM…

nodejs银行取号系统vue

目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.1 B/S架构 7 2.2 MySQL 介绍 7 2.3 MySQL环境配置 7 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 …

学会4种方法,掌握端到端测试处理数据..

推荐阅读: [内部资源] 想拿年薪30W的软件测试人员,这份资料必须领取~ Python自动化测试全栈性能测试全栈,挑战年薪40W 对Web应用程序运行自动化的端到端测试时,最常见的问题之一是如何处理测试数据。端到端测试通常会在通过应用…

授权服务器搭建以及授权码模式

前面的 GitHub 授权登录主要向大家展示了 OAuth2 中客户端的工作模式。对于大部分的开发者而言,日常接触到的 OAuth2 都是开发客户端,例如接入 QQ 登录、接入微信登录等。不过也有少量场景,可能需要开发者提供授权服务器与资源服务器&#xf…

Spring MVC【创建与使用】

Spring MVC【创建与使用】🍎一.Spring MVC介绍🍒1.1 什么是SpringMVC?🍒1.2 MVC 定义🍒1.3 Spring MVC 与 MVC 的区别🍒1.4 Spring MVC的基本功能🍎二. Spring MVC项目的创建🍒2.1 Spring MVC …

代码随想录DAY51 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

文章目录309.最佳买卖股票时机含冷冻期714.买卖股票的最佳时机含手续费309.最佳买卖股票时机含冷冻期 文章讲解:代码随想录 (programmercarl.com) 题目链接:309. 最佳买卖股票时机含冷冻期 - 力扣(LeetCode) 题目: …

Efficientdet源码详解

1.参数配置 最重要的参数配置如下 -p:配置文件,需要在project文件夹下新建配置文件-c:efficientdet的版本,efficientdet B0-B7-n:windows为0,linix根据自己的需求修改--batch_size:batch大小--data_path:数据集路径-p data --batch_size 16 其中&…

【Flask框架】——20 请求钩子

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接; 在请求开始时,根据需求进行权限校验; 在请求结束时,指定数据的交互格式。 …

Dubbo 1 分布式系统中的相关概念 1.1 大型互联网项目结构目标

Dubbo 【黑马程序员Dubbo快速入门,Java分布式框架dubbo教程】 【非常重要就完事儿 了】 1 分布式系统中的相关概念 文章目录Dubbo1 分布式系统中的相关概念1.1 大型互联网项目结构目标1.1.1 传统项目 和 互联网项目1.1.2 互联网项目特点1.1.3 大型互联网项目架构…

【2022.12.17】备战春招Day12——每日一题 + 76. 最小覆盖子串 + 24. 两两交换链表中的节点

【每日一题】1764. 通过连接另一个数组的子数组得到一个数组 题目描述 给你一个长度为 n 的二维整数数组 groups ,同时给你一个整数数组 nums 。 你是否可以从 nums 中选出 n 个 不相交 的子数组,使得第 i 个子数组与 groups[i] (下标从 0…

C++绘制菱形(曼哈顿距离求解:贼快!!!)

思路: 1.双重for循环遍历输出是最基本的 2.了解曼哈顿距离 (1)菱形的输入一定是奇数 (2)我们是思想是填充 * 怎么填呢?我们来画图看看 以 3*3 的矩阵为例子! 我们来看看 距离是怎么定义的…

LInux进程优先级和nice值

文章目录一 定义描述二 查看nice值2.1 使用top命令交互式查看nice值2.2 使用ps命令查看nice值2.3 查看程序调度策略三 修改nice值3.1 启动特定nice值的进程3.2 更改现有进程的nice级别一 定义描述 大部分情况下,计算机需要运行的进程数超过了计算机拥有CPU的核心数…

[附源码]Python计算机毕业设计后疫情时期社区居民管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

uni-app卖座电影多端开发纪实(二):搭建导航

@创建4个Tab页 创建一个测试页hello 在pages目录上右键,新建页面执行如图操作,即可全自动生成页面组件+页面注册(pages.json)pages.json 中会生成这么一个玩意,就是页面声明了 pages:[{"path" : "pages/hello/hello","style" :