一、特殊名词介绍

二、背景、场景介绍

早期帆软产品中绝大部分的WEB服务都是通过op和cmd这两个参数来指定的。而随着产品升级到10.0以后,平台引入了spring框架,所有的旧的服务类接口对平台来说就完全没用了。相应的早期的10.0也就提供了一个新的web服务的接口HttpHandlerProvider。

这个接口目前也是插件中开放web服务使用最为广泛的接口。支持热加载。

三、接口介绍

package com.fr.decision.fun;

import com.fr.decision.webservice.url.provider.URLAliasRegister;
import com.fr.stable.fun.mark.Mutable;

/**
 * Created by loy on 2018/9/12.
 */
public interface URLAliasProvider extends URLAliasRegister, Mutable {

    String XML_TAG = "URLAliasProvider";

    int CURRENT_LEVEL = 1;

}


package com.fr.decision.webservice.url.provider;

import com.fr.decision.webservice.url.alias.URLAlias;

/**
 * Created by loy on 2018/9/18.
 */
public interface URLAliasRegister {

    URLAlias[] registerAlias();
}


package com.fr.decision.webservice.url.alias;

import com.fr.decision.webservice.url.alias.impl.DecisionURLAlias;
import com.fr.decision.webservice.url.alias.impl.PluginURLAlias;
import com.fr.decision.webservice.url.alias.impl.RawURLAlias;

/**
 * Created by loy on 2018/9/12.
 */
public class URLAliasFactory {

    ...

    public static URLAlias createPluginAlias(String aliasPath, String pluginPath) {
        return createPluginAlias(aliasPath, pluginPath, false);
    }

    public static URLAlias createPluginAlias(String aliasPath, String pluginPath, boolean isPublic) {
        return createPluginAlias(aliasPath, pluginPath, isPublic, false);
    }

    public static URLAlias createPluginAlias(String aliasPath, String pluginPath, boolean isPublic, boolean wideRange) {
        PluginURLAlias alias = new PluginURLAlias();
        alias.setShortPath(aliasPath);
        alias.setPluginPath(pluginPath);
        alias.setPublicURL(isPublic);
        alias.setWideRange(wideRange);
        return alias;
    }

}


四、支持版本

产品线

版本

支持情况

备注

FR10.0支持
BI5.1支持
BI5.1.2支持
BI5.1.3支持

五、插件注册

<extra-decision>
        <URLAliasProvider class="your class name"/>
</extra-decision>


六、原理说明

接口注册逻辑:路由别名模块(URLAliasProvider,也叫短链接模块)在加初始化时,会通过URLAliasManager#init方法读取到所有插件中申明的所有请求的别名。并注入到aliasCollection成员(URLAliasProviderContainer)中。

接口生效逻辑:产品中存在一个别名转发服务入口ShortURLService。客户端通过 /url/*调用服务,然后通过服务申明的接口方法调用到URLAliasManager#resolveAlias(path)获得原始连接进行转发生效。

七、特殊限制说明

1、一般原则上,开发时尽可能只对自身插件的请求接口进行别名的申明。以减少冲突的可能。

2、插件请求的别名的申明一共有3中方法(URLAliasFactory.createPluginAlias),总共包括四个参数。

String aliasPath:申明映射的别名(短链接)

String pluginPath:申明原插件请求的path (getPath的返回值)

boolean isPublic:申明原插件请求的开放性(isPublic的返回值)

boolean wideRange:是否非严格匹配。false表示,实际请求匹配是,必须实际path跟短链接别名path完全一致才算匹配;否则表示只要实际请求以短链接别名的path开头就算匹配。【实际开发插件过程中,尽可能使用默认的false,减少冲突的可能】

3、如果遇到特殊情况我们需要为其他插件的请求申明短链接,则可以在得到PluginURLAlias 时通过setPluginId方法进行指定具体要映射的插件(demo中就是这种情况)。

注:demo仅仅是为了分开说明接口的使用,实际开发者在开发时,尽可能按照1的要求开发,不要去给别的插件申明别名。

八、常用链接

demo地址:demo-url-alias

com.fr.decision.fun.HttpHandlerProvider

九、开源案例

免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。