0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用Spring Cloud Alibaba做了一个微服务架构的项目

jf_ro2CN3Fa 来源:CSDN 作者:pcdd 2022-10-12 10:44 次阅读

前言

最近自己用Spring Cloud Alibaba做了一个微服务架构的项目,部署的时候遇到了难题:内存不够。目前该项目有7个微服务,因为我只有一台阿里云的服务器(2C4G),所以我只能把所有的微服务部署在一台服务器上,部署方式是使用docker制作springboot的fat jar镜像,每个微服务在不加任何JVM调优参数的情况下所占内存约500M。

由于是微服务所以肯定还要部署:nacos,除此之外还用到了redis、sentinel、rocketmq、elk等(mysql买的阿里云的),光是运行这些应用就占用内存2个多G,剩下的1个多G内存在部署4个微服务后就满了,于是开始对springboot应用的内存进行初步优化:

添加JVM参数优化内存大小

>基于SpringBoot+MyBatisPlus+Vue&Element实现的后台管理系统+用户小程序,支持RBAC动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能 > >*项目地址:
        
         >*
         视频教程#JVM初始分配的内存由-Xms指定,默认是物理内存的1/64 -Xms128m >基于SpringCloudAlibaba+Gateway+Nacos+RocketMQ+Vue&Element实现的后台管理系统+用户小程序,支持RBAC动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能 > >*项目地址:
         
          >*
          视频
          教程#JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4 -Xmx128m #规定了每个线程虚拟机栈及堆栈的大小,一般情况下,256k是足够的,此配置将会影响此进程中并发线程数的大小。 -Xss256k #指定并行GC线程的数量,一般最好和
          CPU核心数量相当 -XX:ParallelGCThre
          ads=2
         
        

默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。

因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。

默认情况下,当 CPU 数量小于8, ParallelGCThreads 的值等于 CPU 数量,我的服务器是2C的所以这个参数可省略。配置完成后,启动服务发现内存确实变小了,由原来的500M降至100~200M,但不是我想要的效果,我期望的效果是达到几十M的级别。

经网上查阅大量资料得知可以使用Spring Native这门新技术来实现我的需求。(该技术正处于快速迭代阶段,变动较大,建议用于个人学习,不要用于生产)

SpringBoot项目使用Spring Native后:

应用启动速度特别快,毫秒级别

运行时更低的内存消耗,官方展示的含有Spring Boot, Spring MVC, Jackson, Tomcat的镜像大小是50M

为了达到前面的效果,代价是构建时间更长(即使是一个Hello Word构建也需要2分钟,不过主要取决于电脑配置,我的是2min左右)

Spring Native是什么

简而言之就是为了提高Java在云原生的竞争力(个人理解)。

以下内容摘抄自GitHub上Spring Native的自述文件:

Spring Native 为使用GraalVM 原生映像编译器将 Spring 应用程序编译为原生可执行文件提供 beta 支持,以提供通常设计为打包在轻量级容器中的原生部署选项。实际上,目标是在这个新平台上支持几乎未修改的 Spring Boot 应用程序。

以下内容摘抄自其他博客:

近几年“原生”一词一直泛滥在云计算、边缘计算等领域中,而原生宠幸的语言也一直都是Golang,Rust等脱离Sandbox运行的开发语言。Java得益于上世纪流行的一次编译,到处执行的理念,流行至今,但也因为这个原因,导致Java程序脱离不了JVM运行环境,使得不那么受原生程序的青睐。在云原生泛滥的今天,臃肿的JVM使Java应用程序对比其他语言显得无比的庞大,各路大神也想了很多方式让Java变的更“原生”。

实战

本次实战相关的环境信息如下:

OS:Windows10 21H1

IDE:IntelliJ IDEA 2021.2.3

JDK:graalvm-ce-java11-21.3.0

Maven:3.6.3

Docker Desktop for Windows: 20.10.12

Spring Boot:2.6.2

Spring Native:0.11.1

8d32cb1e-49d2-11ed-a3b6-dac502259ad0.png

从官方文档得知(上图)

使用 Spring Native 的应用程序应该使用 Java 11 或 Java 17 编译。

构建 Spring Boot 原生应用程序有两种主要方法:

使用Spring Boot Buildpacks 支持生成包含本机可执行文件的轻量级容器。

使用GraalVM 原生镜像 Maven 插件支持生成原生可执行文件。

经过各种踩坑后在本机上成功的使用了方法1和方法2。简单来说:

方法1就是在SpringBoot2.3后,可以使用spring-boot-maven-plugin插件来构建docker镜像,使用mvn spring-boot:build-image命令结合Docker的API来实现Spring Boot 原生应用程序的构建,成功执行后会直接生成一个docker镜像,然后run这个镜像就可以了,不用我们再写Dockerfile了,相关的参数配置都在pom.xml中配置(该插件的configuration标签下,和fabric8或spotify的docker-maven-plugin很相似)。

方法2不需要安装docker,但要安装Visual Studio,然后执行mvn -Pnative package命令后会生成一个可执行文件(.exe),运行即可。

主要区别如下

1 环境依赖不同

方法1需要安装Docker

方法2需要安装Visual Studio(需要用到部分单个组件:2个MSVC,1个Windows 10SDK)

2 执行的maven命令不同

方法1是mvn spring-boot:build-image

方法2是mvn -Pnative package

因为每个微服务使用Docker部署而不是exe文件,所以方法1正好符合我的需求,所以后文使用Spring Boot Buildpacks的方式构建Spring Boot原生应用程序。

1 安装Graal VM(graalvm-ce-java11-windows-amd64)

8d65d798-49d2-11ed-a3b6-dac502259ad0.png8da0a8aa-49d2-11ed-a3b6-dac502259ad0.png

2 配置环境变量

8da97a48-49d2-11ed-a3b6-dac502259ad0.png8db62b94-49d2-11ed-a3b6-dac502259ad0.png8df55350-49d2-11ed-a3b6-dac502259ad0.png

针对方法1的话,上面三张图好像只用配置JAVA_HOME就行,想一次成功的话建议3个都配,后续可以自行测试。

检验是否安装成功

8e255a6e-49d2-11ed-a3b6-dac502259ad0.png

3 安装native-image

打开新的cmd,输入以下命令,等待安装

guinstallnative-image

这一步我执行失败了,解决方法就是从github上手动下载native-image,然后解压、安装

jar用WinRAR也是可以解压的,解压后如下

8e3112dc-49d2-11ed-a3b6-dac502259ad0.png

在bin目录下打开cmd,输入以下命令,等待安装

$guinstall-Lnative-image*

4 安装 Desktop for Windows

具体步骤略,按照官方文档操作即可

5 配置pom.xml

前面都是准备工作,这一步开始才是重点

首先快速创建一个Spring Boot项目,我命名为spring-native

完整的pom如下

        
        
         
          4.0.0
         
         
          
           org.springframework.boot
          
          
           spring-boot-star
           ter-parent
          
          
           2.6.2
          
          
         
         
          ltd.pcdd
         
         
          spring-native
         
         
          0.0.1-SNAPSHOT
         
         
          spring-native
         
         
          spring-native
         
         
          
           11
          
          
          
           0.11.1
          
         
         
          
           
            org.springframework.boot
           
           
            spring-boot-starter-web
           
          
          
           
            org.springframework.experimental
           
           
            spring-native
           
           
            ${spring-native.version}
           
          
         
         
          
           
            
             org.springframework.experimental
            
            
             spring-aot-maven-plugin
            
            
             0.11.1
            
            
             
              
               generate
              
              
               
                generate
               
              
             
            
           
           
            
             org.springframework.boot
            
            
             spring-boot-maven-plugin
            
            
             
             
              paketobuildpacks/builder:tiny
             
             
              
               true
              
             
            
           
          
         
         
          
           
            spring-release
           
           
            Springrelease
           
           
            https://repo.spring.io/release
           
          
         
         
          
           
            spring-release
           
           
            Springrelease
           
           
            https://repo.spring.io/release
           
          
         
        

本文介绍的是Spring Native0.11.1版本,其对应的Spring Boot版本必须是2.6.2,以上只是一个最基本的配置案例,实际开发中还需要在spring-boot-maven-plugin插件的configuration标签下配置其他许许多多的参数。

例如docker远程的地址和证书的路径、jvm调优参数、配置文件指定、docker镜像名端口仓库地址等等,最好的方法就是看spring-boot-maven-plugin的官方文档,这里以配置jvm参数为例

8e40a99a-49d2-11ed-a3b6-dac502259ad0.png

通过官方文档得知只需要在configuration标签下配置即可,例如


        
         paketobuildpacks/builder:tiny
        
        
         
          true
         
         
          
           -Xms128m
          
          
           -Xmx128m
          
          
           -Xss256k
          
          
           -XX:ParallelGCThreads=2
          
          
           -XX:+PrintGCDet
           ails
          
         
        

其他的配置参数还有很多。

6 执行maven命令

mvnclean mvn'-Dmaven.test.skip=true'spring-boot:build-image

下载完相关依赖后,电脑风扇就开始呼呼的转,查看任务管理器发现CPU利用率100%,内存使用量飙升,最后稳定在90%+。

构建成功

8e94ce6c-49d2-11ed-a3b6-dac502259ad0.png

7 创建并运行容器

查看所有镜像

8eb19c86-49d2-11ed-a3b6-dac502259ad0.png

spring-native就是构建的镜像

创建并运行容器

8ebe08d6-49d2-11ed-a3b6-dac502259ad0.png

在Docker Desktop查看日志,发现应用成功启动,启动仅耗时。,也就是59ms,果然印证了Spring Native启动是毫秒级别这句话。

8ece54ca-49d2-11ed-a3b6-dac502259ad0.png

成功调用接口

8f0f7b8a-49d2-11ed-a3b6-dac502259ad0.png

在Docker Desktop查看占用内存,仅28M左右。

8f25f43c-49d2-11ed-a3b6-dac502259ad0.png

不使用Spring Native启动应用

8f41ff1a-49d2-11ed-a3b6-dac502259ad0.png8f4bd38c-49d2-11ed-a3b6-dac502259ad0.png

启动耗时3s,占用内存高达511M,高下立判。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    8626

    浏览量

    84312
  • JVM
    JVM
    +关注

    关注

    0

    文章

    155

    浏览量

    12166

原文标题:这样做优化,实现 0.059s 启动一个SpringBoot项目!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何用ACM简化你的SpringCloud微服务环境配置管理

    的差别,而这往往是bug和重大故障隐藏之所。总结 在本文中,我们以 测试和生产连接不同的数据库,配置不同的数据源(包括连接池)参数为例,介绍了如何将阿里云配置中心ACM与 Spring Clo
    发表于02-02 14:18

    EDAS再升级!全面支持SpringCloud应用

    服务器的不断增加对于运维人员也是 极大的挑战。开发、测试、线上环境差异性,交付流程越来越复杂,新应用上线不仅效率低,而且风险高。为了优化 Spring
    发表于02-02 15:20

    使用阿里云ACM简化你的SpringCloud微服务环境配置管理

    和重大故障隐藏之所。总结在本文中,我们以 测试和生产连接不同的数据库,配置不同的数据源(包括连接池)参数为例,介绍了如何将阿里云配置中心ACM与 Spring Cloud
    发表于07-04 17:16

    DubboCloudNative 之路的实践与思考

    架构师翟永超(《 Spring Cloud 微服务实战》的作者)。他告知 Consul 表现不错,并在跨 DC(数据中心)方面也比较稳定:他的答复让我增强了 Consul 的信心,稍显
    发表于07-05 16:05

    使用SpringCloud与Docker实战微服务

    使用 Spring Cloud与Docker实战 微服务
    发表于09-09 08:31 7次下载
    使用<b class='flag-5'>Spring</b> <b class='flag-5'>Cloud</b>与Docker实战<b class='flag-5'>微服务</b>

    微服务优势_微服务架构的好处与不足

    微服务 组小 服务的方式来构建 应用, 服务独立运
    发表于02-23 11:24 4345次阅读

    简单分析Java高可用集群和微服务架构

    可能大部分读者都在想,为什么在这以 dubbo、 spring cloud为代表的 微服务时代,我要还要整理这种已经“过时”高可用集群 架构
    的头像 发表于05-03 18:17 2004次阅读
    简单分析Java高可用集群和<b class='flag-5'>微服务</b><b class='flag-5'>架构</b>

    RabbitRpc基于springcloud微服务rpc调用

    ./oschina_soft/gitee- spring-cloud-rabbitrpc.zip
    发表于06-14 09:51 1次下载
    RabbitRpc基于<b class='flag-5'>spring</b> <b class='flag-5'>cloud</b>的<b class='flag-5'>微服务</b>rpc调用

    微服务架构技术栈选型解读

    微服务治理中心框架 Apache Dubbo分布式RPC框架 Spring Cloud Alibaba分布式应用
    的头像 发表于12-29 14:35 1432次阅读

    SpringCloud】基于微服务架构的智慧工地监管平台源码带APP

    技术 架构微服务开发语言:Java 开发工具:Idea 前端框架:Vue 后端框架: Spring Cloud数 据 库:My
    的头像 发表于08-28 11:10 535次阅读
    【<b class='flag-5'>Spring</b> <b class='flag-5'>Cloud</b> 】基于<b class='flag-5'>微服务</b><b class='flag-5'>架构</b>的智慧工地监管平台源码带APP

    SpringCloud微服务架构:实现分布式系统的无缝协作

    在深入 Spring Cloud之前,让我们首先了解 下什么是 微服务 架构微服务
    的头像 发表于10-12 16:21 438次阅读
    SpringCloud<b class='flag-5'>微服务</b><b class='flag-5'>架构</b>:实现分布式系统的无缝协作

    SpringCloud:打造可扩展的微服务网关

    Spring CloudGateway是 基于 SpringFramework 5和Project Reactor的反应式编程模型的
    的头像 发表于10-22 10:03 385次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Cloud</b> :打造可扩展的<b class='flag-5'>微服务</b>网关

    springcloud微服务架构

    Spring Cloud 开源的 微服务 架构框架,它提供了
    的头像 发表于11-23 09:24 841次阅读

    dubbo和springcloud区别

    Dubbo和 Spring Cloud是两 非常流行的 微服务框架,各有自己的特点和优势。在本文中,我们将详细介绍Dubbo和 Spring
    的头像 发表于12-04 14:47 1169次阅读

    SpringCloudGateway网关框架

    Spring CloudGateway网关框架 本软件 微服务 架构中采用 Spring Cloud
    的头像 发表于08-22 09:58 103次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Cloud</b> Gateway网关框架