文档章节

OSGI Http转发

l
 lvk618
发布于 2016/06/15 09:10
字数 788
阅读 6
收藏 0

在企业中,往往有很多的Http接口很多的服务,那就需要很多的ip地址或者域名以及端口号了,那是不现实的,就算现实了,对于运维人员和开发人员来说也是很不好的,多起来的时候,最后谁知道哪个域名哪个端口对于的是哪个服务呀,最终还是害惨了自己。

所以,下面,我就介绍一个http转发的实现,我们可以监听一个端口号,对于是这个端口号的所有地址进行一个拦截,然后再统一的转发出去,这样子是不是很靠谱呀,那该如何实现呢??下面来看看这个例子:


一、首先,我们先建立一个blueprint.xml文件,因为这是OSGI环境的桥梁,少不了。

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
           xmlns:camel="http://camel.apache.org/schema/blueprint"
           xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
    
    <bean id="httpDispatchErrorHandleBean" class="jmust.Common.HttpDispatchErrorHandle" />
    
    <bean id="httpDispatchErrorHandle" class="org.apache.camel.builder.DeadLetterChannelBuilder">  
        <property name="deadLetterUri" value="bean:httpDispatchErrorHandleBean"/>  
    </bean>
    
    <camelContext id="httpCamelContext" errorHandlerRef="httpDispatchErrorHandle" xmlns="http://camel.apache.org/schema/blueprint">
    
        <restConfiguration bindingMode="auto" component="restlet" port="8888" />
        
        <!-- 拦截所有的请求(timeout = 1分钟) 一个地址支持四种请求 -->
        <rest>  
            <get uri="/">  
                <to uri="vm:http-dispatch?timeout=18000" />
            </get>  
            <post uri="/">  
                <to uri="vm:http-dispatch?timeout=18000" />  
            </post>
            <delete uri="/">
                <to uri="vm:http-dispatch?timeout=18000" />
            </delete>
            <head uri="/">
                <to uri="vm:http-dispatch?timeout=18000" />
            </head>
            <put uri="/">
                <to uri="vm:http-dispatch?timeout=18000" />
            </put>
        </rest>
        
        <!-- 通用的http调度处理 -->
        <route>
            <from uri="vm:http-dispatch" />
            <to uri="log:httpDispatchProcessor?showAll=true;&multiline=true" />
            <to uri="bean:httpDispatchProcessor" />
        </route>
        
        <!-- 请求地址 -->
        <route>
            <from uri="direct-vm:/demo/test" />
            <to uri="bean:httpTestProcessor"/>
        </route>

        <!-- 请求地址 -->
        <route>
            <from uri="direct-vm:/demo/test1"/>
            <to uri="bean:httpTest1Processor"/>
        </route>
    </camelContext>
    
    <bean id="httpProducerTemplate" class="org.apache.camel.impl.DefaultProducerTemplate" init-method="start">  
         <argument ref="httpCamelContext" />  
    </bean>
    <!-- 服務註冊 -->
    <bean id="httpDispatchProcessor" class="jmust.Common.HttpDispatchProcessor">
        <property name="producerTemplate" ref="httpProducerTemplate" />
    </bean>
    
    
    <bean id="httpTestProcessor" class="jmust.Common.TestProcessor">
    </bean>
    <bean id="httpTest1Processor" class="jmust.Common.Test1Processor">
    </bean> 
</blueprint>


二、增加一个接收转发请求的Processor,让它去处理所有的请求,最终返回固定ip、端口号

import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.component.restlet.RestletConstants;
import org.restlet.engine.adapter.HttpRequest;

import jmust.Common.Utils.ExchangeUtil;
import jmust.Common.Utils.PathUtil;

/**
 * 监听特定端口转发
 * @author lvkun
 *
 */
public class HttpDispatchProcessor implements Processor{
    private CamelContext camelContext ;
    private ProducerTemplate producerTemplate;

    public void process(Exchange exchange) throws Exception {
        HttpRequest request = exchange.getIn().getHeader(RestletConstants.RESTLET_REQUEST, HttpRequest.class);
        String contextPath = PathUtil.getAbsPath(request.getHttpCall().getRequestUri());
        ExchangeUtil.sendExchage(camelContext, producerTemplate, exchange, contextPath);
    }

    public CamelContext getCamelContext() {
        return camelContext;
    }

    public void setCamelContext(CamelContext camelContext) {
        this.camelContext = camelContext;
    }

    public ProducerTemplate getProducerTemplate() {
        return producerTemplate;
    }

    public void setProducerTemplate(ProducerTemplate producerTemplate) {
        this.producerTemplate = producerTemplate;
    }
}


三、Exchange公用工具

import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.ProducerTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Exchange公用工具
 * @author lvkun
 *
 */
public class ExchangeUtil {
    private static final String DEST_COMPONENT = "direct-vm";
    private static final String FAVICON = "/favicon.ico";
    private static final Logger log = LoggerFactory.getLogger(ExchangeUtil.class);
    
    public static void sendExchage(CamelContext camelContext,ProducerTemplate producerTemplate,Exchange exchange,String contextPath){
        if(!FAVICON.equals(contextPath)&&!"/".equals(contextPath))
        {
            String route = DEST_COMPONENT + ":" +contextPath;
            log.info("redirect endpoint {}", route);
            Exchange exch = producerTemplate.send(route, exchange);
            if(exch != null && exch.getOut() != null){
                exchange.getOut().setBody(exch.getOut().getBody());
            }
        }
        else if(FAVICON.equals(contextPath))
        {
            exchange.getOut().setBody("");
        }
    }
    
}


四、封装获取相对路径的工具

import javax.servlet.http.HttpServletRequest;

/**
 * 获取路径方法
 * @author lvkun
 *
 */
public class PathUtil {
    /**
     * 获取相对路径
     * @param contextPath
     * @return
     */
    public static String getAbsPath(String contextPath)
    {
        int index = contextPath.indexOf('?');
        if(index > -1)
        {
            return contextPath.substring(0, index);
        }
        return contextPath;
    }
    
    /**
     * 获取方式
     * @param request
     * @return
     */
    public static String getContentType(HttpServletRequest request){
        String contentType = request.getContentType();
        if(contentType!=null&&contentType.contains("multipart/form-data")){
            contentType = "multipart/form-data";
        }else if(contentType!=null&&contentType.contains("text/plain")){
            contentType = "text/plain";
        }
        return contentType;
    }
}


五、
jmust.Common.TestProcessor   <pre name="code" class="html">jmust.Common.Test1Processor
就不创建了,运用的时候创建,并继承Camel的Processor即可。


完毕!

本文转载自:http://blog.csdn.net/lk10207160511/article/details/50374463

上一篇: OSGI HttpServlet
下一篇: DES加密之3DES
l
粉丝 3
博文 80
码字总数 792
作品 0
广州
私信 提问
利用 R-OSGi 实现分布式 OSGi 应用

OSGi(Open Service Gateway Initiative)是业界中最知名的 Java 模块化技术规范,其核心设计思想是面向服务的组件模型(Service-Oriented Component Model)。OSGi 发展至今已经得到了众多企...

IBMdW
2012/06/27
1K
2
分享一个查看java源代码的网站grepcode

http://grepcode.com/faq#search-q What can I search for on GrepCode ? GrepCode can be used to find: Java projects Java classes, interfaces, enums, annotations (Java Types) Java m......

asdfsx
2011/03/18
3.4K
0
探索 Eclipse 的 OSGi 控制台

从 V3.0 开始,Eclipse 通过选择开放服务网关协议(Open Services Gateway Initiative,OSGi)来替换先前版本中不稳定的 Eclipse 插件技术,从而实现了一次巨大飞跃。这次转变对于用户来说几...

银月光海
2014/04/11
128
1
android利用apkplug框架实现主应用与插件通讯(传递任意对象)实现UI替换

时光匆匆,乍一看已半年过去了,经过这半年的埋头苦干今天终于有满血复活了。 利用apkplug框架实现动态替换宿主Activity中的UI元素,以达到不用更新应用就可以更换UI样式的目的。 先看效果图:...

梁大帅
2014/04/29
680
1
OSGi与Maven、Eclipse PlugIn的区别

osgi 的框架 apache felix equinox osgi的bundle 、 maven 的 module 、 Eclipse 的 PlugIn 的区别。。。。 OSGi与Maven Maven也具有模块化系统的特征;但是它只是一个编译时工具,而不是运行...

owensliu
2014/11/04
415
0

没有更多内容

加载失败,请刷新页面

加载更多

[mycat]PartitionByString分片报错

java.lang.RuntimeException: error,check your partitionScope definition.at io.mycat.route.util.PartitionUtil.<init>(PartitionUtil.java:69) PartitionUtil.java 注意:其中count,l......

Danni3
24分钟前
8
0
OSChina 周三乱弹 —— 魂淡!不是这种粪发涂墙

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @小小编辑推荐歌曲《10/10》- Rex Orange County 《10/10》- Rex Orange County 手机党少年们想听歌,请使劲儿戳(这里) @奋斗的小牛 :上午...

小小编辑
36分钟前
622
8
Arduino教程:认识Arduino控制板

@toc 1.1 课程说明 认识Arduino控制板的各个部分, 1.2 器材 名称 数量 规格 Arduino uno控制板 1 R3 1.3 UNO电路: UNO参数 名称 参数说明 工作电压: 5V 输入电压: 接上USB时无须外部供电...

acktomas
42分钟前
6
0
WeUI框架

WeUI框架 WeUI是一套小程序的UI框架,所谓UI框架就是一套界面设计方案,有了组件,我们可以用它来拼接出一个内容丰富的小程序,而有了UI框架,我们就可以让我们的小程序变得更加美观。 体验W...

达达前端小酒馆
45分钟前
5
0
Rainbond 5.1.8发布,应用网关支持多IP网络接入

2019年10月23日,Rainbond发布5.1.8版本,本次版本更新带来了应用网关对多IP的支持, 第三方组件对域名实例的支持 等新功能和修复若干BUG。 Rainbond:支撑企业应用的开发、架构、交付和运维的...

好雨云帮
46分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部