Cornerstone(基石)两种寄生方式
Cornerstone(基石)是携程框架部门研发的内部可视化组件VI的开源版本,VI产品创意来源于ebay同名产品VI,VI是validation internals的缩写,字面意思可以理解为“内部验证”。你可以将VI理解为应用的窗口。 VI的一个目标就是把原本的应用黑盒子,变成一个透明的盒子。 在携程,VI主要是一个应用及应用相关环境的可视化工具,和应用健康状态及启动管理的工具(目前已是ctrip集团健康检测和点火标准)。 将开源版本命名为cornerstone是希望在这个组件里解决更多的基础问题,让开发和运营更简单和高效。
如何使用
(特别注意:目前VI只支持JDK>=1.7应用)
VI接入有两种模式,寄生模式和自主模式。
寄生模式
如果项目有WEB容器可以使用寄生模式,否则只能接入自主模式。
web和spring项目pom.xml只需依赖vi的jar包即可使用。
com.ctrip.framework cornerstone 0.2.0-alpha 当web或spring boot应用使用默认的寄生模式接入VI后,VI会接管[应用路径]/@in的路径。 例如tomcat应用,如果部署完成后的访问根路径为http://localhost:8080/tomcat-demo, 那么可以使用 http://localhost:8080/tomcat-demo/@in 来访问VI。自主模式
项目应用中不管是否存在WEB容器都可接入自主模式。
web和spring项目pom.xml需依赖vi的jar包,以及VIServer类所需jar包。
com.ctrip.framework cornerstone 0.2.0-alpha org.eclipse.jetty jetty-servlet 9.0.0.RC2 如果项目启动报java.lang.ClassNotFoundException: javax.servlet.DispatcherType,则需要指定javax.servlet-api的版本号。 javax.servlet javax.servlet-api 3.1.0 compile 需导入VIServer.java类,然后通过bean注入进项目中,完成启动时的初始化。 其中“9999”是VI自定义的端口号。 在应用启动完成后,通过http://localhost:9999/@in来访问VI。Cornerstone(基石)源码路径:https://github.com/ctripcorp/vi
运行里面的spring-boot-example项目可快速了解VI。
import com.ctrip.framework.cs.IgniteManager;
import com.ctrip.framework.cs.StaticContentServlet;
import com.ctrip.framework.cs.SysKeys;
import com.ctrip.framework.cs.VIApiServlet;
import com.ctrip.framework.cs.servlet.AuthenticationFilter;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.DispatcherType;
import java.lang.invoke.MethodHandles;
import java.util.EnumSet;
public class VIServer {
private volatile boolean running = false;
private static Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
Server server;
ServletHandler handler;
public static ServletHandler bind(Server server, String id){
return bind(server,id,false);
}
public static ServletHandler bind(Server server, String id, boolean useVIAuthentication){
ServletHandler handler = null;
System.setProperty(SysKeys.TOMCATCONTEXTPATH, id);
try {
handler = new ServletHandler();
server.setHandler(handler);
handler.addServletWithMapping(VIApiServlet.class, "/@in/api/*");
handler.addServletWithMapping(StaticContentServlet.class, "/@in/*");
if(useVIAuthentication){
handler.addFilterWithMapping(AuthenticationFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
}
IgniteManager.ignite();
}catch (Exception e){
logger.error("start vi server failed!",e);
}
return handler;
}
public VIServer(int listenPort, boolean useVIAuthentication) throws Exception {
server = new Server(listenPort);
handler = bind(server, String.valueOf(listenPort),useVIAuthentication);
this.start();
}
public VIServer(int listenPort) throws Exception {
this(listenPort,false);
}
public VIServer(){
}
public Server getInnerServer(){
return server;
}
public ServletHandler getHandler(){
return handler;
}
synchronized public void start() throws Exception {
if(!running){
server.start();
running=true;
}
}
synchronized public void stop() throws Exception {
if(running){
server.stop();
running =false;
}
}
}