当前位置: 首页 > news >正文

多微服务合并为一个服务

公司微服务细分太多,最近跟我提说需要将几个微服务合为单体,经过几天的查阅,决定用二次打包的方式进行合并,然后部署的时候在nginx改下合并的微服务转发路劲即可,不需要前端修改路劲了。

方案

采用二次打包的方式进行合并,利用maven-dependency-plugin解压插件先将各微服务的jar包解压再用maven-assembly-plugin进行合并打包为一个jar包。

合并前问题处理

1、由于包合并时,相同的类会进行覆盖,会导致找不到类等,所以存在相同包下的相同类名作用不一致的话,需要调整下各服务的包名、类

2、类注册的bean的name相同时,会导致注册bean失败,所以需要调整各服务有相同bean的name,特别是@FeignClient的contextId,因为是以contextId作为bean的name。

3、重复扫描导致重复注册等,如@EnableJpaAuditing,重复扫描,导致重复注册jpaAuditingHandler,所以在有用到@EnableJpaAuditing的类上也加上@ConditionalOnMissingBean(name="jpaAuditingHandler")条件,已经注册过的,就不需要再注册了

4、因为每个微服务都有yml配置文件,所以需要写个合并适配器,将每个微服务的yml合并一起,后续会另外开篇文件细说yml的合并。

合并步骤和代码

1、pom文件添加需要合并的微服务依赖

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><module1.version>6.1.0</module1.version><module2.version>6.1.0</module2.version><module3.version>6.1.0</module3.version>
</properties>
<dependencies>
//需要整合的微服务包,type、scope需填写正确,其中groupId、artifactId、version按需填写即可<dependency><groupId>com.lfq.module1</groupId><artifactId>module1</artifactId><version>${module1.version}</version><type>jar</type><scope>provided</scope></dependency><dependency><groupId>com.lf1.module2</groupId><artifactId>module2</artifactId><version>${module2.version}</version><type>jar</type><scope>provided</scope></dependency><dependency><groupId>com.lf1.module3</groupId><artifactId>module3</artifactId><version>${module3.version}</version><type>jar</type><scope>provided</scope></dependency>
</dependencies>

2、pom文件添加解压插件,将微服务解压到指定目录下

<!-- 将指定执行包解包到指定目录下 -->
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>unpack-classes</id><phase>package</phase><goals><goal>unpack</goal></goals><configuration><artifactItems><artifactItem><groupId>com.lfq.module1</groupId><artifactId>module1</artifactId><outputDirectory>${project.build.directory}/work/addpack/module1</outputDirectory></artifactItem><artifactItem><groupId>com.lfq.module2</groupId><artifactId>module2</artifactId><outputDirectory>${project.build.directory}/work/addpack/module2</outputDirectory></artifactItem><artifactItem><groupId>com.lfq.module3</groupId><artifactId>module3</artifactId><outputDirectory>${project.build.directory}/work/addpack/module3</outputDirectory></artifactItem></artifactItems></configuration></execution></executions>
</plugin>

3、pom文件添加合并打包插件,将解压目录下的文件和本工程代码合并打包

<!-- 将解开的执行包与本工程代码合并打包 -->
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><configuration><recompressZippedFiles>false</recompressZippedFiles></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals><configuration><archive>
<!-- 标红部分是合并后的执行包的启动类MANIFEST.MF文件,我这里选module1解压下的文件,按需配启动类 --><manifestFile>${project.build.directory}/work/addpack/module1/META-INF/MANIFEST.MF</manifestFile></archive><descriptors><descriptor>assembly.xml</descriptor>   <!-- 加载指定的assembly配置文件 --></descriptors></configuration></execution></executions>
<!-- 标红部分是合并yml处理的包,如果需要合并yml文件,需自定义适配器对yml进行合并处理,再将依赖包添加进来 -->
<!--   <dependencies><dependency><groupId>com.fql.merge</groupId><artifactId>mergeHandle</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>  -->
</plugin>

4、添加assembly.xml文件描述合并打包

<assembly>
<!-- id自定义 --><id>lfq</id><formats><!-- 打为jar包 --><format>jar</format></formats><includeBaseDirectory>false</includeBaseDirectory><fileSets><!-- 先将本工程内容输出 --><fileSet><directory>${project.build.directory}/classes</directory><outputDirectory>BOOT-INF/classes</outputDirectory></fileSet><!-- 输出解压目录下的内容 --><fileSet><directory>${project.build.directory}/work/addpack/module1</directory><outputDirectory>.</outputDirectory>
<!-- 这里是module1下的DbDataController类不需要输出参与合并打包,即打包后的jar包没有DbDataController类,按需配置 --><excludes><exclude>**/DbDataController.class</exclude></excludes></fileSet><fileSet><directory>${project.build.directory}/work/addpack/module2</directory><outputDirectory>.</outputDirectory>
<!-- 这里是module2下的application.yml不需要输出参与合并打包,按需配置 --><excludes><exclude>**/application.yml</exclude></excludes></fileSet><fileSet><directory>${project.build.directory}/work/addpack/module3</directory><outputDirectory>.</outputDirectory></fileSet></fileSets><!--标红部分是对yml文件合并处理,如果没有实现,可去掉 --> <containerDescriptorHandlers><containerDescriptorHandler><handlerName>yml-merge</handlerName><configuration><filePattern>.*/application.yml</filePattern><outputPath>BOOT-INF/classes/application.yml</outputPath></configuration></containerDescriptorHandler></containerDescriptorHandlers><!-- 本工程依赖 --><dependencySets><dependencySet><unpack>false</unpack><useProjectArtifact>false</useProjectArtifact><outputDirectory>BOOT-INF/lib</outputDirectory></dependencySet></dependencySets>
</assembly>

后续执行clean install 即可得到一个jar包。

相关文章:

多微服务合并为一个服务

公司微服务细分太多&#xff0c;最近跟我提说需要将几个微服务合为单体&#xff0c;经过几天的查阅&#xff0c;决定用二次打包的方式进行合并&#xff0c;然后部署的时候在nginx改下合并的微服务转发路劲即可&#xff0c;不需要前端修改路劲了。 方案 采用二次打包的方式进行…...

Springboot企业级开发--开发入门01

目录 目录 一.Spring Boot的主要特点和优势包括&#xff1a; 二.Spring Boot的核心功能可以归纳为以下几点&#xff1a; 三.Springboot是如何解决问题&#xff1f; Spring Boot 是一个开源的Java框架&#xff0c;其设计目标是为了简化新Spring应用的初始搭建以及开发过程。…...

bash和sh和./的区别

bash和sh和./的区别 今天在执行一个脚本的时候&#xff0c;用的是sh script.sh&#xff0c;执行报错&#xff0c;使用bash script.sh执行时就能成功&#xff0c;才知道sh和bash是不一样的 sh sh表示 Bourne Shell&#xff0c;是 Unix 系统上的一种基本的命令解释器。它也可以…...

LeetCode 3:寻找最长不含重复字符的子串长度

LeetCode 3&#xff1a;寻找最长不含重复字符的子串长度 在字符串处理中&#xff0c;寻找最长不含重复字符的子串长度是一个经典问题。 问题描述 给定一个字符串 s &#xff0c;我们需要找出其中不含有重复字符的最长子串的长度。 解决方案 我们可以使用滑动窗口的方法来解…...

【自然语言处理四-从矩阵操作角度看 自注意self attention】

自然语言处理四-从矩阵操作角度看 自注意self attention 从矩阵角度看self attention获取Q K V矩阵注意力分数softmax注意力的输出再来分析整体的attention的矩阵操作过程从矩阵操作角度看&#xff0c;self attention如何解决问题的&#xff1f;W^q^ W^k^ W^v^这三个矩阵怎么获…...

Unity脚本,串行端口的握手协议(流控制)

在Unity的SerialPort构造函数中&#xff0c;流控制并没有被直接包含。流控制&#xff0c;也被称为握手&#xff0c;是一种过程&#xff0c;它管理数据的传输速度&#xff0c;以防止接收方被发送方发送的数据量所淹没。 在.NET的SerialPort类中&#xff0c;流控制是通过Handshak…...

2023 re:Invent 用 Amazon Q 打造你的知识库

前言 随着 ChatGPT 的问世&#xff0c;我们迎来了许多创新和变革的机会。一年一度的亚马逊云科技大会 re:Invent 也带来了许多前言的技术&#xff0c;其中 Amazon CEO Adam Selipsky 在 2023 re:Invent 大会中介绍 Amazon Q 让我印象深刻&#xff0c;这预示着生成式 AI 的又一…...

ChatGPT 国内快速上手指南

ChatGPT简介 ChatGPT是由OpenAI团队研发的自然语言处理模型&#xff0c;该模型在大量的互联网文本数据上进行了预训练&#xff0c;使其具备了深刻的语言理解和生成能力。 GPT拥有上亿个参数&#xff0c;这使得ChatGPT在处理各种语言任务时表现卓越。它的训练使得模型能够理解上…...

Docker 常用操作命令备忘

Docker 一旦设置好了环境&#xff0c;日常就只要使用简单命令就可以运行和停止。 于是&#xff0c;我每次用的时候&#xff0c;都想不起来一些关键性的命令到底怎么用&#xff0c;特此记录。 一、镜像管理 从公有仓库拉取镜像 &#xff08;对于使用苹果电脑 M1/M2/M3 芯片的 …...

BUU [CISCN2019 华东南赛区]Web4

BUU [CISCN2019 华东南赛区]Web4 题目描述&#xff1a;Click to launch instance. 开题&#xff1a; 点击链接&#xff0c;有点像SSRF 使用local_file://协议读到本地文件&#xff0c;无法使用file://协议读取&#xff0c;有过滤。 local_file://协议&#xff1a; local_file…...

【卷积神经网络中用1*1 卷积有什么作用或者好处呢?】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;深度学习 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 1*1 卷积有什么作用或者好处呢 作用降维和增加非线性特征组合和交互网络的宽度和深度调整全连接替代增强…...

分布式系统概念及其应用

分布式系统概念及其应用 随着互联网的飞速发展&#xff0c;数据量和计算需求不断增加&#xff0c;传统的集中式系统已经无法满足这些需求。因此&#xff0c;分布式系统应运而生&#xff0c;它通过将计算任务分散到多台计算机上&#xff0c;实现高效的计算和存储。本文将介绍分…...

数据报文转换

报文转换 &#x1f353;JSON&#x1f352;&#x1f352;JSON多字段映射成一个实体对象&#x1f352;&#x1f352;JSON反序列化为一个带有泛型的JAVA类型 &#x1f353;xml &#x1f353;JSON &#x1f352;&#x1f352;JSON多字段映射成一个实体对象 <dependency><…...

Python爬虫-付费代理推荐和使用

付费代理的使用 相对免费代理来说&#xff0c;付费代理的稳定性更高。本节将介绍爬虫付费代理的相关使用过程。 1. 付费代理分类 付费代理分为两类&#xff1a; 一类提供接口获取海量代理&#xff0c;按天或者按量收费&#xff0c;如讯代理。 一类搭建了代理隧道&#xff0…...

kubectl使用及源码阅读

目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述 k8s 版本 v1.24.16 kubectl的职责 1.主要的…...

C++面试宝典第32题:零钱兑换

题目 给定不同面额的硬币coins和一个总金额amount,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,则返回-1。说明:你可以认为每种硬币的数量是无限的。 示例1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = …...

pyspark分布式部署随机森林算法

前言 分布式算法的文章我早就想写了&#xff0c;但是一直比较忙&#xff0c;没有写&#xff0c;最近一个项目又用到了&#xff0c;就记录一下运用Spark部署机器学习分类算法-随机森林的记录过程&#xff0c;写了一个demo。 基于pyspark的随机森林算法预测客户 本次实验采用的…...

【Python笔记-设计模式】中介者模式

一、说明 中介者模式是一种行为设计模式&#xff0c;减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互&#xff0c;迫使它们通过一个中介者对象进行合作。 (一) 解决问题 降低系统中对象之间的直接通信&#xff0c;将复杂的交互转化为通过中介者进行的间接交…...

大语言模型构建的主要四个阶段(各阶段使用的算法、数据、难点以及实践经验)

大语言模型构建通常包含以下四个主要阶段&#xff1a;预训练、有监督微调、奖励建模和强化学习&#xff0c;简要介绍各阶段使用的算法、数据、难点以及实践经验。 预训练 需要利用包含数千亿甚至数万亿 单词的训练数据&#xff0c;并借助由数千块高性能 GPU 和高速网络组成的…...

[云原生] 二进制安装K8S(中)部署网络插件和DNS

书接上文&#xff0c;我们继续部署剩余的插件 一、K8s的CNI网络插件模式 2.1 k8s的三种网络模式 K8S 中 Pod 网络通信&#xff1a; &#xff08;1&#xff09;Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容器是不会跨宿主机的&#xff09;共享…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...