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

koupleless 合并多个微服务应用到一个应用实例(包含springcloud gateway)

koupleless

Koupleless 是一种模块化的 Serverless 技术解决方案。基础原理是拆分成了基座+模块的概念。支持模块化开发。 适用的场景:

  • 应用合并部署
  • 模块化开发
  • 模块隔离
  • 插件化
  • 优化启动速度等
  • 热启动部署

拆分原则

  • 基座加载所需的所有基础依赖
  • 模块只需要将依赖改成provider
  • 如果模块依赖基座的bean例如数据源可以使用SpringBeanFinder.getBaseBean(DataSource.class)

maven 依赖

  • 基座
<dependency>  
    <groupId>com.alipay.sofa.koupleless</groupId>  
    <artifactId>koupleless-base-starter</artifactId>  
    <version>${koupleless.runtime.version}</version>  
</dependency>

-- 插件
<build>  
    <finalName>${project.artifactId}</finalName>  
    <plugins>  
        <plugin>  
            <groupId>com.alipay.sofa.koupleless</groupId>  
            <artifactId>koupleless-base-build-plugin</artifactId>  
            <version>${koupleless.runtime.version}</version>  
            <executions>  
                <execution>  
                    <goals>  
                        <goal>add-patch</goal>  
                    </goals>  
                </execution>  
            </executions>  
        </plugin>  
        <plugin>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-maven-plugin</artifactId>  
            <executions>  
                <execution>  
                    <goals>  
                        <goal>repackage</goal>  
                    </goals>  
                </execution>  
            </executions>  
        </plugin>  
    </plugins>  
</build>
  • 模块
<dependency>  
    <groupId>com.alipay.sofa.koupleless</groupId>  
    <artifactId>koupleless-app-starter</artifactId>  
    <version>${koupleless.runtime.version}</version>  
    <scope>provided</scope>  
</dependency>

<build>  
    <finalName>${project.artifactId}</finalName>  
    <plugins>  
        <!--这里添加ark 打包插件-->  
        <plugin>  
            <groupId>com.alipay.sofa</groupId>  
            <artifactId>sofa-ark-maven-plugin</artifactId>  
            <version>${sofa.ark.version}</version>  
            <executions>  
                <execution>  
                    <id>default-cli</id>  
                    <goals>  
                        <goal>repackage</goal>  
                    </goals>  
                </execution>  
            </executions>  
            <configuration>  
                <skipArkExecutable>true</skipArkExecutable>  
                <outputDirectory>./target</outputDirectory>  
                <bizName>hh-bidding</bizName>  
                <webContextPath>bidding</webContextPath>  
                <declaredMode>true</declaredMode>  
                <packExcludesConfig>rules.txt</packExcludesConfig>  
            </configuration>  
        </plugin>  
        <plugin>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-maven-plugin</artifactId>  
            <executions>  
                <execution>  
                    <goals>  
                        <goal>repackage</goal>  
                    </goals>  
                </execution>  
            </executions>  
        </plugin>  
    </plugins>  
</build>

注意事项

  • 模块的生命周期
    模块销毁会销毁到模块的所有bean,这个时候需要注意如果引用的基座bean的话如 Datasource,可能会被销毁。所有可以,解决方法
package com.ruoyi.common.core.xss;  
  
import javax.sql.DataSource;  
import java.io.PrintWriter;  
import java.sql.Connection;  
import java.sql.SQLException;  
import java.sql.SQLFeatureNotSupportedException;  
import java.util.logging.Logger;  
  
/**  
 * @author wxl  
 */public class MyDataSource implements DataSource {  
  
    public DataSource dataSource;  
  
    public MyDataSource(DataSource dataSource) {  
        this.dataSource = dataSource;  
    }  
  
    @Override  
    public Connection getConnection() throws SQLException {  
        return dataSource.getConnection();  
    }  
  
    @Override  
    public Connection getConnection(String username, String password) throws SQLException {  
        return dataSource.getConnection(username, password);  
    }  
  
    @Override  
    public <T> T unwrap(Class<T> iface) throws SQLException {  
        return dataSource.unwrap(iface);  
    }  
  
    @Override  
    public boolean isWrapperFor(Class<?> iface) throws SQLException {  
        return dataSource.isWrapperFor(iface);  
    }  
  
    @Override  
    public PrintWriter getLogWriter() throws SQLException {  
        return dataSource.getLogWriter();  
    }  
  
    @Override  
    public void setLogWriter(PrintWriter out) throws SQLException {  
  
    }  
  
    @Override  
    public void setLoginTimeout(int seconds) throws SQLException {  
        dataSource.setLoginTimeout(seconds);  
    }  
  
    @Override  
    public int getLoginTimeout() throws SQLException {  
        return dataSource.getLoginTimeout();  
    }  
  
    @Override  
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {  
        return dataSource.getParentLogger();  
    }  
}
  • 声明新的ds
@Bean(name = "dataSource")  
@ConditionalOnMissingBean  
public DataSource dataSource() {  
 
   return new MyDataSource(SpringBeanFinder.getBaseBean(DataSource.class));  
}

spring cloud gateway 和web 应用合并问题

spring cloud gateway是webflux 和tomcat 部署到一起需要修改一些东西,基座需要引入

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-webflux</artifactId>  
</dependency>

并配置

spring.main.web-application-type=servlet
  • spring cloud gateway 应用
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})  
@EnableWebFlux  
@Import({GatewayAutoConfiguration.class})  
public class RuoYiGatewayApplication {  
    public static void main(String[] args) {  
        SpringApplication.run(RuoYiGatewayApplication.class, args);  
    }  
}
  • EnableWebFlux 启用webflux
  • @Import({GatewayAutoConfiguration.class}) 引入spring cloud gateway 配置

相关文章:

  • w259交通管理在线服务系统设计与实现
  • Nginx限流与鉴权(Nginx Traffic Limiting and Authentication)
  • JS逆向:泛微OA的前端密码加密逆向分析,并使用Python构建泛微OA登录
  • [023-01-47].第47节:组件应用 - GetWay与 Sentinel 集成实现服务限流
  • 3.17学习总结 java数组
  • Compose 实践与探索十四 —— 自定义布局
  • 第四章 搜索基础
  • python项目一键加密,极度简洁
  • 【嵌入式硬件】三款DCDC调试笔记
  • 华为OD机试 - 德州扑克 - 逻辑分析(Java 2023 B卷 200分)
  • fastapi+angular外卖系统
  • 数据结构——图
  • 【笔记】SQL进阶教程(第二版)
  • Word 小黑第22套
  • 在动平衡中倒谱(Cepstrum)
  • nodejs使用 mysql2 模块获取 mysql 中的 json字段,而不是 mysql
  • RAG概念理解与项目实战(基于LangChain框架附带GitHub源码)
  • [HelloCTF]PHPinclude-labs超详细WP-Level 0
  • Flask+Vue-Router+JWT实现登录验证
  • 蓝桥杯拔河,考察双指针,前缀和,区间处理
  • 中国以“大幅开放市场”回应贸易保护主义
  • 8小时《大师与玛格丽特》:长度可以是特点,但不是价值标准
  • 胡祥|人工智能时代:文艺评论何为?
  • IPO周报|节后首批3只新股本周申购,色谱设备龙头来了
  • 上海今日降雨降温,节后首个工作日气温回升最高可达28℃
  • 热点问答丨新加坡人民行动党缘何再赢议会选举