java版本号管理_微服务项目中如何管理依赖版本号?

本文是微服务项目代码组织形式三部曲中的第三篇,也是最后一篇,通过这三篇文章,相信大家对于如果组织微服务中的代码已经有了一个基本认知,前面两篇分别是:

第三篇相对来说要简单一些,本来没打算写,但是上周有个小伙伴问了我一个 Maven 问题,然后我就发现有的小伙伴对聚合工程的认知还是不到位,因此才有了这篇文章,想和大家再聊聊聚合工程的问题。

1.微服务架构

理论上的微服务架构和实际应用的微服务,往往会有一些差异。

理论上,在微服务架构中,各个独立的微服务可以是各种语言,像我们使用的 Eureka 注册中心,就是支持多种语言的,这样可以充分发挥各种语言的优势。如果是这样,就没有必要从项目整体上进行版本管理了,也管不了。

但是在实际操作中,考虑到团队的技术栈,现有的技术生态等因素,大部分情况下,我们可能并不会在项目中掺杂其他语言进来,比如就是用 Java 开发,相信大部分小伙伴都是这么做的。

既然统一都使用 Java 语言开发,那一个需求就随之浮出水面,就是项目依赖统一管理。

这个问题其实不是绝对的。

大型的微服务项目分属不同的团队开发,每个团队维护好自己的项目,然后通过 RPC 或者 HTTP 的方式互相之间进行交互,这种情况下,版本号也可以交由各个团队自行维护,这样版本升级的时候,就不必一起升级,可以各个团队独自完成,逐个升级。

但是这种方式又可能会带来另外一个问题,就是依赖版本的碎片化,在经过 N 多次迭代之后,可能会存在两个项目所依赖的微服务版本差异非常大。

因此,在实际操作中,有的团队会倾向于将项目版本统一管理。

统一管理也很简单,就是搞一个 parent 就行了,但是有的小伙伴容易将这种 parent 和聚合工程搞混,因此松哥这里还是和大家稍微聊一下怎么统一管理项目版本号。

2.统一管理版本号

2.1 聚合工程

先来说一说聚合工程,这里我就不重新写代码了,以微人事(https://github.com/lenve/vhr)为例来和大家分享。

微人事项目的服务端就是一个聚合工程。

9451d0ec6235ddf5542afe413d830882.png

我们可以来看下 vhrserver 的 pom.xml 文件:

vhr

org.javaboy

1.0-SNAPSHOT

4.0.0

vhrserver

pom

vhr-mapper

vhr-model

vhr-service

vhr-web

在这个聚合工程中,vhr-model 用来放实体类,vhr-mapper 用来放 Dao 层,vhr-server 用来放 Service 层,vhr-web 则是一个 Spring Boot 工程。

在聚合工程中,vhr-web 作为聚合工程的一部分,是无法独立打包的,因为它依赖 vhr-service,vhr-service 依赖 vhr-mapper ,而 vhr-mapper 则依赖 vhr-model。我们需要从 vhrserver 处打包,这样它会自动解决 module 之间的依赖问题。

单独给 vhr-web 打包会报如下错误:

f1b7168a10353009bbcf0d93bde74084.png

从 vhrserver 处统一打包,结果如下:

06d80fe914e12dd5b2574cf3dc2fbe3f.png

可以看到,我们需要直接打包聚合工程,内部的依赖问题会自动解决。

有人可能会问,既然前面报 Could not find artifact org.javaboy:vhr-service:pom:1.0-SNAPSHOT 错误,那我先把 vhr-service install 到本地仓库,再去打包 vhr-web 行不行?

这个是不行的,因为这是聚合工程,不能这样做,只能从聚合工程处打包。

2.2 统一管理版本号

上面说的聚合工程虽然也能实现版本号的统一管理,但是我们不能在微服务中采用这种方式。

你想一个微服务系统,包含了很多子系统,例如商品管理、交易管理、物流管理等等,要是想给商品管理打包,你还得从聚合工程处打包,打完之后,其他微服务模块也生成了各自的包,这样效率太低了。

但是我们还想实现版本号的统一管理,该怎么办呢?创建父子工程即可。这种项目结构和聚合工程很像,但是不一样,很多小伙伴会搞混,所以这里我来给大家稍微演示一下。

首先我们定义一个普通的 Maven 工程作为父工程,我把 pom.xml 文件拎出来给大家参考下:

org.springframework.boot

spring-boot-starter-parent

2.3.0.RELEASE

pom

org.javaboy.vmall

vmall

1.0-SNAPSHOT

大家可以看到,这个父工程本身也有一个 parent ,就是 Spring Boot 中的 parent。

这里的 packaging 依然是 pom,然后我们定义了 dependencyManagement,将一些不包含在 spring-boot-starter-parent 中的依赖版本进行统一管理。但是大家注意,这里没有 modules 节点,这是一个很大的不同。

接下来,我们创建其他微服务项目,在创建的过程中,可以采用平铺的方式,例如下面这样:

982e98eb276dc0f9e9ff987b80f80f2d.png

也可以做成有层次结构的父子形式,像下面这样:

1d5aa56085a23b00267e536db5dcf97b.png

两种方式都可以。

然后在各个微服务项目中,重新修改 parent 即可:

912c629eb4e8cede0fd4cdecb6b7b1b1.png

如此之后,我们就可以对各个微服务中的依赖版本进行统一管理了。

这种项目结构和聚合工程并不一样,这种项目打包,是可以独立打包的。

首先我们先将父工程 install 到本地仓库:

5b7d04faea51028edab14356fdb142f8.png

然后再去 install vmall-common 模块,最后给 vmall-app-manager 进行打包,注意,现在的 vmall-app-manager 可以独立打包,不需要从总的 parent 处进行统一打包。微服务项目中如果需要对项目版本进行统一管理,可以采用这种方式。

小伙伴们可以仔细品一品这种方式和聚合工程的差异。

3.小结

好啦,今天的内容比较简单,再结合前面已经发过的两篇文章,相信大家对于如何组织微服务项目的代码已经有一定的思路了。

如果小伙伴们觉得有收获,记得点个在看鼓励下松哥哦~

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

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

相关文章

React之函数中的this指向

我们都知道在React中使用函数时,有两种写法,一是回调函数,二是直接调用,但需要在构造函数中绑定this,只有这样,函数中的this才指向本组件 总结一下没有绑定this的函数中的this指向 不管是在本组件的元素上调…

对于刚开始使用该软件,应该在熟悉基本的markdown语法的基础上,再进行快捷键的使用!...

一级标题 # 空格 编写内容 二级标题 ## 空格 编写内容 有序内容 1.Tab 无序内容 -Tab 代码块 print("hello wrold") typora快捷键 ctrl1一级标题 添加图片 表格 CtrlT 姓名年龄职业谢国宏20IT文字加粗 24期的小伙伴们你们好 文字斜体 你好 又粗又斜 粗斜* 3**2 -- 幂…

struct和byte[]相互转换(用Marshal类实现)

转自[DotNet笔记]相当于序列化与反序列化,但是不用借助外部文件1、struct转换为byte[] 1staticbyte[] StructToBytes(objectstructObj) 2{ 3 int size Marshal.SizeOf(structObj); 4 IntPtr buffer Marshal.AllocHGlobal(size); 5 …

Get-CrmSetting返回Unable to connect to the remote server的解决办法

摘要: 微软动态CRM专家罗勇 ,回复302或者20190125可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me 。 在Dynamics 365部署管理器所在的服务器上执行Get-CrmSetting,最近…

使用ReentrantLock和Lambdas进行干净同步

最近,我在阅读一篇内容丰富的文章,内容涉及Javin Paul 1 synchronized和ReentrantLock之间的区别。 他强调了后者的优点,但并未保留一些缺点,这些缺点与正确使用所需的繁琐的try-finally块有关。 在同意他的陈述的同时&#xff0…

java 二维数组奇数金字塔_二维数组:奇数阶魔方 | 新思维:C语言程序设计

幻方,有时又称魔方,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。通常幻方由从到的连续整数组成。Siamese方法(Kraitchik 1942年,pp. 148-149)是构造奇数阶幻方的一种方法,说明如下&a…

react-性能优化

开发中遇到一个需要优化的性能,页面需要渲染很多table,而且可以自己添加table,所以就导致router改变时,清除这些DOM结构就会很慢,这就给用户造成不好的体验。 问题所在:清除渲染过多的DOM结构才导致迟缓&a…

Node.js学习(篇章一)

<node.js的特点> 采用了异步式I/O与事件驱动的架构设计&#xff0c;架构为单线程模型。 <supervisor包的作用> node.js开发项目&#xff0c;当修改项目时&#xff0c;需要终止进程重启Node.js之后才可以看到修改后的效果&#xff0c;为了解决这个问题&#xff0c;我…

WinXP启动时自动打开上次关机时未关闭的文件夹

不能自动打开上次关机时未关闭的文件夹解决方法&#xff1a; 首先运行注册表&#xff0c;解决方法&#xff1a;打开[\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced] 在右面的窗口中新建DWORD类型键值“PersistBrowsers”&#xff0c;数据为…

机器学习前沿02

自动机器学习 https://mbd.baidu.com/newspage/data/landingsuper?context%7B%22nid%22%3A%22news_9244479631915180647%22%7D&n_type1&p_from3 卷积网络的综述 https://mbd.baidu.com/newspage/data/landingsuper?context%7B%22nid%22%3A%22news_979691604239366144…

java 判断闰年和月份_java----根据输入的年月判断闰年和打印日历

import java.util.Scanner;import java.text.ParseException;import java.util.Calendar;public class Calendar {public static void main(String[] args) throws ParseException {Scanner sc new Scanner(System.in);System.out.println("请输入年份&#xff1a;"…

反应灵敏且性能卓越的Spray + Akka解决方案,以“在Java和Node.js中发挥并发性和性能”...

在我以前的文章中&#xff0c;我研究了一个虚拟的交易引擎&#xff0c;并将基于Java的阻止解决方案与基于Node.js的非阻止解决方案进行了比较。 在文章的结尾&#xff0c;我写道&#xff1a; 我怀疑在Node.js近期取得成功之后&#xff0c;越来越多的异步Java库将开始出现。 这…

百度蜘蛛(BaiduSpider)IP段详细情况介绍

123.125.68.*这个蜘蛛经常来,别的来的少,表示网站可能要进入沙盒了&#xff0c;或被者降权。 220.181.68.*每天这个IP 段只增不减很有可能进沙盒或K站。 220.181.7.*、123.125.66.* 代表百度蜘蛛IP造访&#xff0c;准备抓取你东西。 121.14.89.*这个ip段作为度过新站考察期。 2…

iframe关于滚动条的去除和保留

iframe嵌入页面后&#xff0c;我们有时需要调整滚动条&#xff0c;例如&#xff0c;去掉全部的滚动条&#xff0c;去掉右边的滚动条且保留底下的滚动条&#xff0c;去掉底下的滚动条且保留右边的滚动条。那么我们应该怎么做呢&#xff1f; 一&#xff1a;去掉全部的滚动条 第一…

拷贝构造函数与赋值函数(运算符重载)(1)

拷贝构造函数拷贝构造函数在三种情况下会被使用1.使用对象来初始化对象时2.当函数的形参是对象时3.当函数的返回值为对象时 2,3情况的本质还是1 //Test1.h #include<iostream> using namespace std; class ST { private:int a;long b; public:ST(int a0, long b0):a(a),…

GOOGLE不让我访问啦?

GOOGLE不让我访问啦? 今天上GOOGLE出现了这么一个画面,可是我就是不知道我的电脑到底中了什么毒,平常我没上什么特殊的网站,也没下载什么软件,因为这电脑我只用来做些基本的开发和看看园子里的文章而已.真不知道是怎么一回事.posted on 2007-05-05 12:46 黄尚 阅读(...) 评论(…

java条件执行方法_java 开启多线程里面如何加条件判断执行其他逻辑?

方法1&#xff1a;通过Thread类中的isAlive()方法判断线程是否处于活动状态。线程启动后&#xff0c;只要没有运行完毕&#xff0c;都会返回true。【注】如果只是要等其他线程运行结束之后再继续操作&#xff0c;可以执行t.join()&#xff0c;即&#xff1a;在t执行完毕前挂起。…

使用Jenkins / Hudson远程API检查作业状态

在进行演讲时&#xff0c;我写了一个Hudson / Jenkins插件&#xff08;适用于EclipseCon NA 2014&#xff09; &#xff0c;但我想发表有关演讲中提到的想法的博客文章。 在这篇文章中&#xff0c;我解释了如何在不使用Web界面的情况下与CI服务器进行交互。 Jenkins / Hudson远…

大数据分析和人工智能科普

一、大数据 1.1 大数据&#xff08;Big Data&#xff09; 众说纷纭&#xff01; 个人认为&#xff0c;大数据中的“大”&#xff0c;不仅仅是涉及数据规模&#xff0c;而且包含“价值“这个层面。其实无非就是大量的信息罢了&#xff0c;但是我们却能 通过各种手段从这些信息中…

Redis API的使用与理解

一、Redis 基础&#xff1a; 1、通用命令&#xff1a; keys [pattern]&#xff1a; keys * #遍历所有key&#xff1b;keys he* #以he开头的key&#xff1b; keys he[a-e]* #以‘he’开头第三个字母是a-e之间&#xff1b; keys ph? #?代码一位&#xff0c;以ph开头且字母是…