框架rest和i18n笔记

servlet根据请求url找具体的服务
com.*.*.roa.web.DispatcherServlet.doGet
RestRegisterItem p = ResourcePoolFactory.getRestServicePool(instName).findResource(path);
com.*.*.roa.pool.RestServicePool.findResource(String path)
com.*.*.roa.pool.ResourcePool.getResource(String path)
最终Map resources.get(tempPath);

rest服务具体执行逻辑
RestRegisterItem
// 所注册的服务 private Object service;
RestMethodItem
// 方法所属对象 private Object service; // 方法 private Method method;
com.*.*.roa.common.RestRegisterItem.invokeGet
RestRegisterItem.invoke 调用ArgumentsParser.parseArgumets(this, methodItem, httpContext, response, map);
com.*.*.roa.common.methodInjector.ArgumentsParser.parseParam consumesTypes不能为空才会读取流解析json(consumes) contentType application/json(解析json)
application/xml(解析xml)
RestMethodItem methodItem;
// 对调用总线服务(方法)传入的参数做有效性校验 ParametersValidate.validateParameters(service, methodItem.getMethod(), args);
methodItem.getMethod().invoke(service, args);

ResponseWriter.writeToResponse 调用ResponseWriter.getResponseContentType
producesType produces默认是application/json,所以不需要指定注解也可以

rest服务注册过程
采用Spring Bean方式注册ROA服务
com.*.*.roa.ServicePostProcessor implements DestructionAwareBeanPostProcessor
public Object postProcessAfterInitialization(Object bean, String name)
ROA.addRestfulService(bean);

向ROA总线中增加一个Restful服务对象
void com.*.*.roa.ROA.addRestfulService(Object service) throws IllegalServiceException, DuplicateServiceException
ResourcePoolFactory.getRestServicePool(DEFAULT_INSTNAME).addResources(restItems);
com.*.*.roa.pool.ResourcePool.addResources(Map<String, T> resourceMap)
最终Map resources.putAll(resourceMap);

AOP代理
ROA服务的后置处理。AOP的代理生成在afterPropertiesSet后,需要在代理生成后进行ROA服务注册
com.*.*.biz.rest.gapi.impl.ServicePostProcessor implements DestructionAwareBeanPostProcessor
ROA.addRestfulService(bean);


加载i18n资源和前台i18n rest服务
com.*.*.biz.rest.gapi.impl.ResourceROAListener 前台i18n国际化rest服务注册监听
ResourceROAContextPath=/plat/fmapp/v1
com.*.*.biz.common.boot.ResourceContextListener i18n资源加载注册监听
resource-apps=fm

加载i18n资源监听
参数resource-apps 比如:fm
加载其他应用的pub下资源
void com.*.*.biz.common.boot.ResourceContextListener.contextInitialized(ServletContextEvent sce)
FileResourceUtil.getLanguageFromApps(resApp);
ResourceMgr.loadOthersResFile(resApp, lang);
com.*.*.i18n.ResourceMgr.loadOthersResFile(String appName, String language)
resTable.put(language + "_" + key, value);
Map resTable 存放国际化资源key对应内容
Map uiResTable 前台i18n资源

前台i18n服务注册过程
参数 ResourceROAContextPath 比如:/plat/fmapp/v1
业务资源ROA接口注册
com.*.*.biz.rest.gapi.impl.ResourceROAListener.contextInitialized(ServletContextEvent sce)
ServiceRegister.register(path, new ResourceService());
ResourcePoolFactory.getRestServicePool(DEFAULT_INSTNAME).addResources(restItems);
void com.*.*.roa.pool.ResourcePool.addResources(Map<String, T> resourceMap)
查找国际化资源
com.*.*.biz.rest.gapi.impl.ResourceService.getResources(String apps) throws ServiceException
ResourceUtil.getAppUIProperties(app);
com.*.*.i18n.ResourceMgr.getAppUIProperties(String appName, Locale locale)
uiResTable.get((new StringBuilder()).append(language).append("_").append(appName).toString())

后台i18n工具类
com.*.*.i18n.I18nUtil.getMessage(String key)
com.*.*.i18n.ResourceUtil.getMessage(String key, Object[] args, Locale locale)
com.*.*.i18n.ResourceMgr.findString(String key, Locale locale)
com.*.*.i18n.ResourceMgr.internalFindString(String messageKey, boolean isSigned, Locale locale)
resTable.get((new StringBuilder()).append(l).append("_").append(messageKey).toString())
如果找不到,内容为!key!


com.*.*.framework.FrameworkLoader加载Spring框架配置中有app下i18n加载工具类
com.*.*.i18n.ResourceInit
初始化应用WEB-INF/classes/i18n下国际化资源文件
com.*.*.i18n.ResourceMgr.addAppProperties(String appPath, String appName)
loadPropertiesFromDir(String dirPath, boolean isUI, String appName)

resTable.get("zh_CN_oss.fm.alarm.current.alarmLevel");
((Properties)uiResTable.get("zh_CN_FaultMgmtWebsite")).get("oss.fm.alarm.current.alarmLevel");

 

com.*.*.roa.util.restclient.HttpRest 超时默认是30秒
com.*.*.roa.util.restclient.RestfulOptions设置超时时间,最大1800秒,也就是30分钟
总线超时最大300秒,也就是5分钟

http://3ms.*.com/hi/group/2025819/blog_1849121.html
Restclient默认配置项
Restclient可以配置默认配置项,配置文件名称为restclient.json,应用自己定义该文件放在$APP_ROOT/etc/conf目录,如果不配置该文件则使用restclient内置的默认值。
{
"ConnectTimeout":"30000"
"thread":"200" //线程数
"idletimeout":"30000"
"timeout":"30000"
"maxConnectionPerAddr":"50"
"responseHeaderSize":20 * 1024
"requestHeaderSize":20 * 1024
}

{
"ConnectTimeout":"30000",
"thread":"200",
"idletimeout":"30000",
"timeout":"30000",
"maxConnectionPerAddr":"50",
"responseHeaderSize":"20480",
"requestHeaderSize":"20480"
}


jetty默认setMaxConnectionsPerDestination是64,QueuedThreadPool默认是200

 


JSSESocketFactoryExt conf/ssl.tomcat.properties 在rtsp/tomcat/conf下面
内容为
#########SSL options
ssl.protocols=TLSv1.2
ssl.ciphers=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA
ssl.authPeer=true
ssl.checkCN.host=false
ssl.checkCN.white=false
ssl.checkCN.white.file=white.list
ssl.allowRenegociate=false

#########certificates config
ssl.storePath=internal
ssl.trustStore=trust.jks
ssl.trustStoreType=JKS
ssl.trustStoreValue=trustStoreValue
ssl.keyStore=server.p12
ssl.keyStoreType=PKCS12
ssl.keyStoreValue=keyStoreValue
ssl.crl=revoke.crl

ssl.authPeer=true 校验对端证书
NioEndpointExt 设置ip和端口

EndPoint endPoint = new EndPoint();
String ip = endPoint.getLocalIP();
String port = endPoint.getLPort();
if (getAddress() == null)
{
InetAddress address = InetAddress.getByName(ip);
setAddress(address);
}

if (getPort() == 0)
{
setPort(Integer.parseInt(port));
}

实现读取app version中配置 etc/sysconf/amsconsolewebsite-service-1.5.json
String path = DefaultEnvUtil.getAppConfFile();
if ((null != path) && (new File(path).isFile()))
{
String processName = AppVersionUtil.getProcessName();
AppVersionJson appVersion = new AppVersionJson(path);
ProcessInfo processInfo = appVersion.getProcessInfo(processName);
Map pair = processInfo.getValue();
IpPortPair value = (IpPortPair)pair.get("local");
value.getIp();
value.getPort()
}
在tomcat配置,应用下的conf/server.xml
<Connector
URIEncoding="UTF-8"
port="0"
protocol="com.*.cloudsop.tomcat.api.ssl.Http11NioProtocolExt"
scheme="https"
sslImplementationName="com.*.cloudsop.tomcat.api.ssl.JSSEImplementationExt"
SSLEnabled="true"
secure="true"
connectionTimeout="20000"
maxPostSize="2097152"
maxHttpHeaderSize="8192"
minSpareThreads="2"
maxThreads="100"
allowTrace="false"/>

<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm" failureCount="3" lockOutTime="600" cacheSize="1000" cacheRemovalWarningTime="3600">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>

<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="false" deployOnStartup="false" errorReportValveClass="com.*.cloudsop.tomcat.api.errorpage.ErrorReportValveExt">
<Context path="/" reloadable="false" docBase="ROOT" workDir="${TOMCAT_WORK_DIR}">
<Manager className="com.*.cloudsop.tomcat.api.session.StandardManagerExt"/>
</Context>
<Valve className="com.*.cloudsop.tomcat.api.log.AccessLogValveExt" pattern="%h %l %u %t %m &quot;%U&quot; %H %s %b %{x-request-id}i"/>
</Host>
</Engine>

posted on 2018-01-27 14:32  yaoyu  阅读(547)  评论(0编辑  收藏  举报

导航