广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Springboot集成GraphicsMagick
  • 618
分享到

Springboot集成GraphicsMagick

2024-04-02 19:04:59 618人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录以什么方式集成?项目集成1、将gm命令行工具引入到项目中2、在项目启动的时候自动初始化环境3、gm进程池化性能初测写在最后以什么方式集成? JNI / 命令行(im4java)

以什么方式集成?

JNI / 命令行(im4java)

在im4java官网中提到:

翻译过来就是: 从Java内部使用JNI运行本机代码始终会带来其他风险,对于长时间运行的进程(通常是WEB应用程序服务器)尤其危险。内存损坏或分段错误(可能由故意操纵的图像触发)可能会使整个服务器瘫痪。

所以我们选择使用命令行的方式进行调用。

项目集成

1、将gm命令行工具引入到项目中

SpringBoot集成linux可执行命令的时候,我们将可执行文件放在了项目的resource目录下:

这里需要有一步操作就是将文件复制到宿主机:


    private void initGM() throws Exception {
        String osName = System.getProperty("os.name").toLowerCase();
        log.info("os name: {}", osName);
        String gmPath;
        if (osName.contains("Mac")) {
            gmPath = "gm/mac/gm";
        } else if (osName.contains("linux")) {
            // 初始化容器的环境
            initPodEnv();
            gmPath = "gm/linux/gm";
        } else {
            throw new RuntimeException("非法操作系统:"+osName);
        }
        InputStream fisInjar = new ClassPathResource(gmPath).getInputStream();
        File file = File.createTempFile("GraphicsMagick", "_gm");
        file.setExecutable(true);
        GM_PATH = file.getAbsolutePath();
        //将jar包里的gm复制到操作系统的目录里
        OutputStream fosInOs = new FileOutputStream(file);
        byte[] buffer = new byte[1024];
        int readLength = fisInJar.read(buffer);
        while (readLength != -1) {
            fosInOs.write(buffer, 0, readLength);
            readLength = fisInJar.read(buffer);
        }
        IOUtils.closeQuietly(fosInOs);
        IOUtils.closeQuietly(fisInJar);
        log.info("gm初始化完毕");
    }

2、在项目启动的时候自动初始化环境

下面只对Linux进行了自动化环境安装,mac环境主要是本地开发,自己安装环境即可:


    
    private void initPodEnv() throws Exception {
        log.info("============ start init pod env ============");
        Process exec1 = Runtime.getRuntime().exec("yum install -y GCc make");
        this.printLog(exec1);
        log.info("cmd 1 exec success");
       
        Process exec2 = Runtime.getRuntime().exec("yum install -y libpng-devel libjpeg-devel libtiff-devel jasper-devel freetype-devel libtool-ltdl-devel*");
        this.printLog(exec2);
        log.info("cmd 2 exec success");
        // 打水印时缺少依赖
        Process exec3 = Runtime.getRuntime().exec("yum -y install ghostscript");
        this.printLog(exec3);
        log.info("cmd 3 exec success");
        log.info("============ init pod env success ============");
    }

3、gm进程池化

想象下,如果在每次进行图片处理都去 fork gm子进程,不仅代价大,而且在高并发情况下,容易造成子进程过多,导致系统负载飙高,上下文切换频繁。

所以将 gm进程 池化是很有必要的。

前提: gm提供batch批量模式,运行在此模式下的gm进程,会一直读取标准输入,逐行接收命令实时进行处理。

池化思路: 预先 fork 一批 gm 子进程,每次要运行命令时,从子进程池中挑选一个子进程,进行图片处理,处理完毕后归还连接。

具体架构



@ConfigurationProperties(prefix = "gm.pool")
@Data
public class GMPoolProperties {

    
    private int maxActive = 4;

    
    private int maxIdle = 4;

    
    private int minIdle = 2;

    
    private long minEvictableIdleTimeMillis = 300000L;

    
    private WhenExhaustedAction whenExhaustedAction = WhenExhaustedAction.BLOCK;

    
    private long maxWait = 5000;

    
    private boolean testWhileIdle = false;

    
    private long timeBetweenEvictionRunsMillis = 10000L;

}

性能初测

1、单线程测试: 单线程循环100次

技术 耗时 平均耗时
GraphicsMagick + im4java 2110 ms 21 ms
GraphicsMagick + im4java + 池化技术 1478 ms 15 ms

总结:性能提升约29%  
2、多线程并发测试: 并发100个线程请求

技术 耗时 平均耗时
GraphicsMagick + im4java 37901 ms 379 ms
GraphicsMagick + im4java + 池化技术 22456 ms 224 ms

总结:性能提升约41%  

写在最后

目前主流的是使用openresty(Nginx + lua)来搭建图片处理服务,使用Java的话性能可能会比较差。因为对Java技术栈比较熟悉,前期会先使用Java实现。

本文的demo版本已经上传到GitHub上,感兴趣的小伙伴可以去看下: github.com/Shanbw/Grap…

以上就是springboot集成GraphicsMagick的详细内容,更多关于Springboot集成GraphicsMagick的资料请关注编程网其它相关文章!

--结束END--

本文标题: Springboot集成GraphicsMagick

本文链接: https://www.lsjlt.com/news/126736.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Springboot集成GraphicsMagick
    目录以什么方式集成?项目集成1、将gm命令行工具引入到项目中2、在项目启动的时候自动初始化环境3、gm进程池化性能初测写在最后以什么方式集成? JNI / 命令行(im4java)...
    99+
    2022-11-12
  • SpringBoot集成webservice
    前言 之前在工作中,有时候需要去对接第三方的医院,而很多医院的his系统用的都是老技术(WebService)。一直在对接webservice接口,却不知道webservice接口是怎么实现的,这一次...
    99+
    2023-09-23
    spring boot java spring
  • springboot集成Ldap
    一、什么是Ldap 轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP,/ˈɛldæp/)是一个开放的,中立的,工业标准的应用协议,通过...
    99+
    2023-09-13
    spring boot 服务器 后端
  • Springboot集成Neo4j
    一、概述  1.为什么图形数据库?         生活在一个互联的世界中,大多数领域需要处理丰富的连接集以了解真正发生的事情。通常,我们发现项目之间的联系与项目本身一样重要。         虽然现有的关系数据库可以存储这些关...
    99+
    2023-09-05
    spring boot java spring
  • springboot集成websocket
    springboot集成websocket 1. 前言 ​ 这里我们使用springboot搭建一个轻量级的websocket服务,同时提供4个入参。使用websocket服务可以轻松和微信小程序、支付宝小程序、网页就行双向通讯,非常实用方...
    99+
    2023-08-16
    spring boot websocket java 支付宝小程序
  • SpringBoot集成 ElasticSearch
    Spring Boot 集成 ElasticSearch 对于ElasticSearch比较陌生的小伙伴可以先看看ElasticSearch的概述ElasticSearch安装、启动、操作及概念简介 好的开始啦~ 1、基础操作 1.1、导入...
    99+
    2023-08-18
    elasticsearch spring boot java maven intellij-idea
  • SpringBoot随笔-SpringBoot集成Druid
    1.Druid是什么     Druid是Java语言中最好的数据库连接池之一,Druid能够提供强大的监控和扩展功能。 2.Druid连接池的优点: 强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQ...
    99+
    2014-09-25
    SpringBoot随笔-SpringBoot集成Druid
  • springBoot(11):集成Mybatis
    一、添加依赖<!--mybatis--> <dependency>    <groupId>org.mybatis.spring.boot&...
    99+
    2022-10-18
  • springBoot(12):集成Druid
    一、添加依赖<!--mybatis-开始--> <dependency>    <groupId>org.mybatis.spring.bo...
    99+
    2022-10-18
  • springBoot(22):集成mongodb
    一、添加依赖<!-- mongodb --> <dependency>    <groupId>org.springfr...
    99+
    2022-10-18
  • springboot集成redis lettuce
    目前java操作redis的客户端有jedis跟Lettuce。在springboot1.x系列中,其中使用的是jedis,但是到了springboot2.x其中使用的是Lettuc...
    99+
    2022-11-12
  • springboot如何集成shiro
    这篇文章主要介绍了springboot如何集成shiro,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、项目整体介绍:项目整体的结构如下图所示,项目整体采用 springb...
    99+
    2023-06-15
  • SpringBoot如何集成RabbitMQ
    这篇文章主要介绍“SpringBoot如何集成RabbitMQ”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot如何集成RabbitMQ”文章能帮助大家解决问题。一、RabbitMQ...
    99+
    2023-06-30
  • SpringBoot怎样集成redis
    这篇文章给大家分享的是有关SpringBoot怎样集成redis的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。定义REmote DIctionary Server(Redis) ...
    99+
    2022-10-18
  • SpringBoot 集成Redis 过程
    Redis 介绍: Redis 服务 Redis (REmote Dictionary Server) 是一个由Salvatore Sanfilippo 完成的key-value存储...
    99+
    2022-11-12
  • springboot如何集成websocket
    这篇文章主要介绍了springboot如何集成websocket,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 原生注解pom.xml<dependency>...
    99+
    2023-06-22
  • SpringBoot如何集成swagger
    小编给大家分享一下SpringBoot如何集成swagger,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。本文简单介绍了在项目中集成swagge...
    99+
    2023-05-30
    spring boot swagger
  • Springboot如何集成Elasticsearch
    小编给大家分享一下Springboot如何集成Elasticsearch,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!集成配置步骤步骤1:加入 Maven 相关依...
    99+
    2023-06-22
  • SpringBoot如何集成Swagger3
    这篇文章主要介绍SpringBoot如何集成Swagger3,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一,什么是swagger1,  Swagger 是一个规范和完整的文档框架,   ...
    99+
    2023-06-22
  • SpringBoot如何集成MaxCompute
    这篇文章主要介绍“SpringBoot如何集成MaxCompute”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot如何集成MaxCompute”文章能帮助大家解决问题。1、SDK方...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作