草庐IT

还在crud?快来学习架构设计啦---微服务下的依赖管理(maven篇)

T-OPEN 2023-08-11 原文

文章目录

一、前言

2023年口罩放开的第一年,大多数人都是想着重新开始,抓住金三银四的好时机,找到心仪的工作和符合岗位要求的人才,一起整装出发。我们理想的状态是,经济已经在恢复了,那么就业市场也应该恢复了。然而现实是残酷的,海投无回应依然是常态。据互联网第三方平台统计,企业用人需求每月新增10万+,Java人才缺口高达42.5万,并以每年20%左右的速度增长。然而招聘市场却割裂严重,HR抱怨招人难,程序员抱怨拿不到offer。这是为何?拨开现象看本质:无非是双方需求错位。
在IT业发展初始阶段,初级Java程序员足以满足企业需求,但IT业发展至今,行业细分越发精细,企业需求也随时改变,要求程序员 “来之即用”,拥有更多解决复杂问题的能力。

最直观的表现就是,企业招聘要求再度提高,并在薪资上不断加码。

以下是字节2020年和2022年发布的Java程序员招聘启事:

单从招聘启事上可以看出,想要在2022年找到和2020年薪资、级别差不多的工作,Java程序员需要更加丰富的技能。(只会curd是不可能找到好工作了
互联网的已经今非昔比了,迭代极快,在这过程中,公司业务可能会发生颠覆式的调整,技术栈会随之改变。这仅仅是一家公司,互联网行业包罗万象,整体产品创新、迭代速度极快。随着新行业、新技术、新产品的出现,相应的业务需求也会不断衍生。

互联网行业 “不进则退,慢进亦退”,程序员亦是如此。对于用人要求持续增高的互联网企业来说,高级Java程序员才是当下市场最紧缺的。只会crud程序员 很有可能被现在的 GPT们(chatGPT,GPT4.0)取代了。可以看一下我之前让chatGPT 给我写的python程序,不得不说太厉害了。chatGPT对于一个python初学者有什么用?
前摇略长了 咳咳 ,接下来我们开始步入正题。maven想必大家都用过,不过一般我们一般做项目的时候,都是架构师搭好了框架,我们进去进行 crud 补充点业务逻辑就行了,长此以往,我们的架构设计能力就废了,当我们想跳槽涨薪时,毫无竞争力,故我们需要在工作之余学习一些架构设计相关的东西,比如我们最常用的依赖工具maven,maven的使用很简单。但是想用好还是需要一些学习的,本文将从现在的流行的微服务框架springcloud 依赖管理切入,深入剖析一些大厂微服务的包管理应该是怎么样的。

二、实战

学一门技术的最好的就是去官方文档里看看,比如我们要学习 SpringCloud 就可以看以下几个资源:

我们在springcloud官方文档的 overview 中可以看到spring官方是如何建议我们使用的springcloud:
图一:

如上图所示这是让我们先引入 springcloud包管理依赖的pom,这种写法并不会把springcloud 的所有包依赖引入我们的工程,相当于一个声明。当你的工程里需要用到某一个依赖的时候,只要需要像下图一样写上需要引入的包的 <groupId><artifactId>.

可能有的友友就有点好奇这里我们并没有指定版本,maven能成功引入吗?,其实是能引入成功的,因为我们在第一步的 引入 springcloud包管理依赖的pom 已经帮我们定义好了 springcloud <version> .

2.1 创建父工程统一依赖的版本管理

这里拿一个我写过的项目做介绍,这是一个建议的商城项目,源代码地址: https://gitee.com/T-OPEN/skywalking-demo

  • ratel-skywalking-common 项目的公共包,用来存放通用的工具类以及需要在各个服务之间需要传递的实体类。
  • ratel-skywalking-gateway 网关。
  • ratel-skywalking-goods 商品服务。
  • ratel-skywalking-order 订单服务。订单服务会调用商品服务,来获取某一个订单里包含的商品详情。
  • ratel-skywalking-notice 通知服务。

首选我们我们需要新建一个空的父工程用来管理pom,这里使用dependencyManagement统一管理子模块的依赖版本,版本号使用获取方式,方便后期修改维护:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.ratel.skywalking</groupId>
    <artifactId>ratel-skywalking-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ratel-skywalking-parent</name>
    <description>Demo of Spring Cloud project for skywalking</description>

    <packaging>pom</packaging>

    <modules>
        <module>ratel-skywalking-common</module>
        <module>ratel-skywalking-gateway</module>
        <module>ratel-skywalking-goods</module>
        <module>ratel-skywalking-order</module>
        <module>ratel-skywalking-notice</module>
    </modules>

    <properties>
        <skywalking.demo.verion>0.0.1-SNAPSHOT</skywalking.demo.verion>
        <java.version>1.8</java.version>
        <spring.boot.version>2.3.12.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR12</spring.cloud.version>
        <spring.cloud.alibaba.version>2.2.8.RELEASE</spring.cloud.alibaba.version>
        <lombok.version>1.18.20</lombok.version>
        <hutool.version>5.8.11</hutool.version>
        <skywalking.version>8.9.0</skywalking.version>
        <knife4j.version>3.0.3</knife4j.version>
        <ratel-skywalking.verion>0.0.1-SNAPSHOT</ratel-skywalking.verion>
    </properties>

    <dependencyManagement>

        <dependencies>
            <!-- 统一依赖管理 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.apache.skywalking</groupId>
                <artifactId>apm-toolkit-logback-1.x</artifactId>
                <version>${skywalking.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.skywalking</groupId>
                <artifactId>apm-toolkit-trace</artifactId>
                <version>${skywalking.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.skywalking</groupId>
                <artifactId>apm-toolkit-opentracing</artifactId>
                <version>${skywalking.version}</version>
            </dependency>

            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>${hutool.version}</version>
            </dependency>

            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-spring-boot-starter</artifactId>
                <version>${knife4j.version}</version>
            </dependency>

            <dependency>
                <groupId>com.ratel.skywalking</groupId>
                <artifactId>ratel-skywalking-common</artifactId>
                <version>${ratel-skywalking.verion}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.2 创建公共使用的 common工程

ratel-skywalking-common 是整个工程的公共类的,他的pom内容如下,这里我们首选引入引入父工程依赖 方便依赖管理,为了方便开发 我们引入了 lombok

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!--引入父工程依赖 方便依赖管理-->
    <parent>
        <groupId>com.ratel.skywalking</groupId>
        <artifactId>ratel-skywalking-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>ratel-skywalking-common</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <!--lombok相关-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>none</mainClass>     <!-- 取消查找本项目下的Main方法:为了解决Unable to find main class的问题 -->
                    <classifier>execute</classifier>    <!-- 为了解决依赖模块找不到此模块中的类或属性 -->
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

大家可以注意我这里引入 lombok时并没有 指定的 <version> ,但是查看依赖管理,已经成功引入的了 lombok,版本号是 1.18.20,这也是正我们在 父工程pom中声明的lombok的版本。

然后在工程里创建 GoodsEntity ,方便在 ratel-skywalking-order 调用 ratel-skywalking-goods 时 GoodsEntity的传递,而不是 分别在2个工程里定义2遍。后续只需要在 2个工程里引入 ratel-skywalking-common 工程即可。

2.3 创建子工程并引入父工程的依赖以及公共工程

这里我们以 创建 ratel-skywalking-order 工程为例,剩下来的 ratel-skywalking-gateway,ratel-skywalking-goods, ratel-skywalking-notice 都差不多。pom内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.ratel.skywalking</groupId>
        <artifactId>ratel-skywalking-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>ratel-skywalking-order</artifactId>
    <name>ratel-skywalking-order</name>
    <description>ratel-skywalking-order</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

       <!--springboot相关-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--nacos相关-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

       <!--openfegin相关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--lombok相关-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

        <!--skywalking相关-->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-opentracing</artifactId>
        </dependency>

        <!--hutool工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>

        <!--knife4j接口文档-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
        </dependency>

       <!--本项目的公共实体类,公共utils等 -->
        <dependency>
            <groupId>com.ratel.skywalking</groupId>
            <artifactId>ratel-skywalking-common</artifactId>
        </dependency>

        <dependency>
            <groupId>com.ratel.skywalking</groupId>
            <artifactId>ratel-skywalking-goods-api</artifactId>
            <version>${skywalking.demo.verion}</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

这里我们首选引入引入父工程依赖 ratel-skywalking-parent 方便依赖管理,然后引入公共工程:ratel-skywalking-common 和其他一些依赖。为了方便展示效果,这里我们只需要处理 按照同样的方法 新建ratel-skywalking-gateway,ratel-skywalking-goods, , ratel-skywalking-notice 本次演示用不到可以不管了。想偷懒的小伙伴也可以直接把我上文的提到的源码下载下来,直接编译启动也行。

2.4 搭建启动环境

由于我们的服务是微服务,故还需要一个nacos,具体环境搭建可以参考 skywalking从入门到精通(一)-环境搭建
启动脚本路径:\nacos-server-2.0.1\nacos\bin\startup-standalone.cmd
我们本机测试使用nacos的单机模式即可。

启动以后打开浏览器访问 http://localhost:8848/nacos/#/login 登录即可。默认的账号密码: nacos / nacos

2.5 启动程序开始验证

我们可以先启动 ratel-skywalking-gateway,然后启动 ratel-skywalking-orderratel-skywalking-goods,启动完成以后
我们在nacos上看到我们的三个服务均已启动成功。

接下来我们就可以访问接口 :http://localhost:9010/ratel-order/order/getOrder 进行测试了。

三、总结

上面一系列讲解都是比较基础的微服务下的依赖管理方式, 希望大家能有所收获,大家如果有什么疑问可以评论留言告诉我,我看到都会及时解答各位的疑问。

有关还在crud?快来学习架构设计啦---微服务下的依赖管理(maven篇)的更多相关文章

  1. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  8. ruby - 有什么方法可以告诉 sidekiq 一项工作依赖于另一项工作 - 2

    有什么方法可以告诉sidekiq一项工作依赖于另一项工作,并且在后者完成之前无法开始? 最佳答案 仅使用Sidekiq;答案是否定的。正如DickieBoy所建议的那样,您应该能够在依赖作业完成时将其启动。像这样。#app/workers/hard_worker.rbclassHardWorkerincludeSidekiq::Workerdefperform()puts'Doinghardwork'LazyWorker.perform_async()endend#app/workers/lazy_worker.rbclassLaz

  9. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  10. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

随机推荐