springcloud热部署

springcloud按照可运行jar包部署时,如果直接将业务脚本groovy打入jar则不支持热部署。

需要将业务脚本groovy放置到另一个git目录下编写,开发时使用linked目标放置到project中,部署是不打入jar中。

nhmicro框架代码地址:https://github.com/jeffreyning/nh-micro

借助nhmicro框架中micro-git-sync模块功能在启动时从git仓库中下载groovy脚本加载到springcloud应用中,
同时还可以支持动态发布,即提交新groovy到git仓库后,会自动下载并热部署到springcloud应用中。

使用micro-git-sync模块优点是:

1, 使应用按照可执行jar包运行时,也支持脚本热部署。

2, 准实时自动加载远程git中的新脚本代码。

3, 可以按照指定版本加载脚本。

配置MicroGitSync设置git远程地址和本地下载目录

如果设置了init-method="initRep",则准实时检查远程git仓库是否有代码更新,有则自动下载。

Version可以设置指定的版本,设置为head表示最新版本

cloneFlag表示启动时是否完全clone

openFlag表示是否有效,开发环境中可以设置为false,避免调试程序时从远程下载。

<bean id="gitSync" class="com.nh.micro.sync.git.MicroGitSync"
    init-method="initRep" lazy-init="false">
    <property name="localPath" value="h:/temp/git"></property>
    <property name="remotePath" value="https://github.com/nhmicro/test-sync-groovy.git"></property>
    <property name="cloneFlag" value="true"></property>
    <property name="openFlag" value="${openFlag}"></property>
    <property name="version" value="head"></property>
</bean>

设置从本地下载目录中加载groovy

注意设置depends-on确保git下载完成后在启动加载

    <bean id="groovyInitUtil" class="com.nh.micro.rule.engine.core.GroovyInitUtil"
        init-method="initGroovy" lazy-init="false" depends-on="gitSync" >
        <property name="fileList">
            <list>
                <bean class="com.nh.micro.rule.engine.core.GFileBean">
                    <property name="ruleStamp" value="true"></property>
                    <property name="jarFileFlag" value="true"></property>
                    <property name="dirFlag" value="true"></property>
                    <property name="rulePath" value="/groovy/"></property>
                </bean>
                <bean class="com.nh.micro.rule.engine.core.GFileBean">
                    <property name="ruleStamp" value="true"></property>
                    <property name="jarFileFlag" value="false"></property>
                    <property name="dirFlag" value="true"></property>
                    <property name="rulePath" value="H:/temp/git/test-sync/groovy/"></property>
                </bean>
            </list>
        </property>
    </bean>

Micro-mvc不但可以与springmvc整合还可以与springcloud整合

Springcloud的controller层改为接口注解仍使用springcloud和springboot相关注解实现服务注册路由等配置,但controller接口上需要添加@InjectGroovy注解设置接口实现的关联groovy。

package com.nh.micro.springcloud.demo.web;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.nh.micro.service.InjectGroovy;

@InjectGroovy(name="ComputeGroovy")
@RestController
public interface ComputeController {

    @RequestMapping(value = "/add" ,method = RequestMethod.GET)
    @ResponseBody
    public Integer add(@RequestParam(value="a") Integer a, @RequestParam(value="b") Integer b);

}

Spring配置中使用GroovyBeanScannerConfigurer扫描controller接口

    <bean class="com.nh.micro.service.GroovyBeanScannerConfigurer">
        <property name="scanPath" value="com.nh.micro.springcloud.demo.web"></property>
    </bean>

ComputeController接口实现ComputeGroovy.groovy

package groovy

import javax.annotation.Resource;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestParam;
import org.apache.log4j.Logger;

class ComputeGroovy {
private final Logger logger = Logger.getLogger(getClass());

//@Resource(name="discoveryClient")
//public DiscoveryClient client;
    public Integer add(@RequestParam Integer a, @RequestParam Integer b) {
        //GroovyExecUtil.execGroovyRetObj("TestGroovy", "test");

        Integer r = a + b;
        System.out.println(r);
        //ServiceInstance instance = client.getLocalServiceInstance();
        //logger.info("/add, host:" + instance.getHost() + ", service_id:" + instance.getServiceId() + ", result:" + r);
        return r;
    }
}

原文地址:http://blog.51cto.com/13442277/2063580

时间: 2024-11-08 11:40:17

springcloud热部署的相关文章

Spring Boot 热部署

需要在pom.xml文件中加如下代码: 1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-devtools</artifactId> 5 <optional>true</optional> 6 </dependency> 7 </depe

Tomcat热部署的三种方式

热部署是指在你修改项目BUG的时候对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效.但是对配置文件的修改除外! 1.直接把项目web文件夹放在webapps里. 2.在tomcat\conf\server.xml中的<host></host>内部添加<context/>标签: <Context debug="0" docBase="D:\demo1\web" path="/demo1"

Springboot 热部署中存在冲突的问题

SpringBoot热部署有2中: 1.使用 Spring Loaded 2.使用 spring-boot-devtools 具体怎么用.自己百度! 在使用第一种时候,整合SpringBoot和通用Mapper时候,-----------------> Example 时候会出现找不到实体对应的表! 这就是冲突在的存在,具体怎么解决,我没找到方法!  当然我还是想用热部署的,我就使用了第2种,但是依然也遇到了问题 在我的项目中我加入了redis 注解什么意思自己百度:出现的异常java.lang

spring boot 之热部署(三)

热部署:当发现程序修改时自动启动应用程序. spring boot使用的是spring-boot-devtools是一个为开发者服务的一个模块.其原理用了classLoader 其中一个加载不变的类,另一个restart ClassLoader加载变得类. devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机). 不说废话,我喜欢的Coding就是简单and直接.我写代码一般都是截图,不会粘代码,目的是让你们能敲一遍,我认为程序是敲出来的不是看出来的.你们要懂

IDEA第二章----配置git、tomcat(热部署)、database,让你的项目跑起来

第一节:下载git客户端,整合idea 由于博主公司用的git版本管理,所以本系列都是基于git版本工具的,当然SVN与git配置类似.git同样支持安装版和解压版,支持各种操作系统,我这里下载的是Windows的解压版. 选择刚才解压后的文件夹,选择cmd文件夹下的git.exe,然后点击Test查看是否连接成功. 注:如果没有配置git客户端,用git地址导入项目会提示你找不到git.exe. 第二节:配置tomcat(热部署稍后会讲到) tomcat下载安装就不在累赘,博主用的是tomca

webpack-dev-server轻量级js高速打包、热部署服务器

webpack是一个打包web项目的工具 ,可以实现css,js,less,cass,html的混淆加密,minify,结合webpack-dev-server热部署,非常方便前端页面和Nodejs的开发. webpack 安装方法 npm install webpack --save-dev npm install webpack-dev-server --save-dev 执行webpack需要在项目目录有一个配置文件 webpack.config.js . var webpack = re

Java 热部署深入探索

简介 在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作.对于某些大型的应用来说,每次的重启都需 要花费大量的时间成本.虽然 osgi 架构的出现,让模块重启成为可能,但是如果模块之间有调用关系的话,这样的操作依然会让应用出现短暂的功能性休克.本文将探索如何在不破坏 Java 虚拟机现有行为的前提下,实现某个单一类的热部署,让系统无需重启就完成某个类的更新. 类加载的探

class卸载、热替换和Tomcat的热部署的分析

一 class的热替换 ClassLoader中重要的方法 loadClassClassLoader.loadClass(...) 是ClassLoader的入口点.当一个类没有指明用什么加载器加载的时候,JVM默认采用AppClassLoader加载器加载没有加载过的class,调用的方法的入口就是loadClass(…).如果一个class被自定义的ClassLoader加载,那么JVM也会调用这个自定义的ClassLoader.loadClass(…)方法来加载class内部引用的一些别的

深入探索 Java 热部署

在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作.对于某些大型的应用来说,每次的重启都需要花费大量的时间成本.虽然 osgi 架构的出现,让模块重启成为可能,但是如果模块之间有调用关系的话,这样的操作依然会让应用出现短暂的功能性休克.本文将探索如何在不破坏 Java 虚拟机现有行为的前提下,实现某个单一类的热部署,让系统无需重启就完成某个类的更新. 类加载的探索 首先