AimodelpowerApplication.java 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package com.shkpr.service.aimodelpower;
  2. import com.global.base.component.SnowFlakeEx;
  3. import com.global.base.log.LogLevelFlag;
  4. import com.global.base.log.LogPrintMgr;
  5. import com.shkpr.service.aimodelpower.constants.LogFlagBusiType;
  6. import com.shkpr.service.aimodelpower.globalcache.GlobalData;
  7. import com.shkpr.service.aimodelpower.globalmgr.ThreadTaskMgr;
  8. import com.shkpr.service.aimodelpower.interfaces.sinks.LogPrintSink;
  9. import org.apache.catalina.connector.Connector;
  10. import org.apache.catalina.core.AprLifecycleListener;
  11. import org.apache.coyote.AbstractProtocol;
  12. import org.apache.coyote.http11.Http11AprProtocol;
  13. import org.apache.coyote.http11.Http11NioProtocol;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.boot.SpringApplication;
  16. import org.springframework.boot.autoconfigure.SpringBootApplication;
  17. import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
  18. import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
  19. import org.springframework.boot.web.server.WebServerFactoryCustomizer;
  20. import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
  21. import org.springframework.retry.annotation.EnableRetry;
  22. import org.springframework.stereotype.Component;
  23. import org.springframework.transaction.annotation.EnableTransactionManagement;
  24. import javax.annotation.PostConstruct;
  25. @EnableTransactionManagement //开启数据库事务
  26. @SpringBootApplication
  27. @EnableRetry
  28. public class AimodelpowerApplication {
  29. @Value("${global.server.apr:false}")
  30. private boolean mBUseApr = false;
  31. @Value("${server.port:9001}")
  32. private int mNPort;
  33. @Value("${global.server.id:tri.adbs.v100}")
  34. private String mStrServerId; //本服务的ID
  35. @Value("${global.machine.index:0}")
  36. private int mOwnerMachineIndex; //本服务所在的部署机器的索引编号
  37. @Value("${global.service.index:0}")
  38. private int mOwnerServiceIndex; //本服务在部署机器上的服务索引编号
  39. @Value("${global.max.tomcat.concurrent.request:10000}")
  40. private int mNMaxConcurrentRequest; //tomcat同一时刻可接收的第三方最大并发连接数(Java NIO模式下默认是10000)
  41. @Value("${global.max.tomcat.threads:200}")
  42. private int mNMaxThreads; //tomcat可启动的最大线程数(默认值为200),调优取值[200,1000]
  43. @Value("${global.max.tomcat.accept.queue:100}")
  44. private int mNMaxAcceptCounts; //tomcat启动的线程数达到最大时,接受排队的请求个数(默认值为100),调优取值[100,400]
  45. @Value("${global.switch.trace.log:true}")
  46. private boolean mBSwitchTraceLog = true; //是否开启基于TraceId的log记录
  47. public static void main(String[] args) {
  48. GlobalData.getInstance().setCpuCores(Runtime.getRuntime().availableProcessors());
  49. LogPrintMgr.getInstance().initRes(2, new LogPrintSink());//io型线程池=CPU Core*2;计算型线程池=CPU Core
  50. SpringApplication.run(AimodelpowerApplication.class, args);
  51. }
  52. @PostConstruct
  53. public void init(){
  54. ThreadTaskMgr.initThreadResource();
  55. LogPrintMgr.getInstance().setSwitchTraceLog(mBSwitchTraceLog);
  56. GlobalData.getInstance().setServerId(mStrServerId);
  57. GlobalData.getInstance().setNOwnerMachineIndex(mOwnerMachineIndex);
  58. GlobalData.getInstance().setNOwnerServiceIndex(mOwnerServiceIndex);
  59. GlobalData.getInstance().setSwitchTraceLog(mBSwitchTraceLog);
  60. SnowFlakeEx.init(mOwnerMachineIndex, mOwnerServiceIndex);
  61. }
  62. @Component
  63. class GlobalWebServerFactoryCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
  64. @Override
  65. public void customize(ConfigurableServletWebServerFactory factory) {
  66. TomcatServletWebServerFactory factoryReal = (TomcatServletWebServerFactory)factory;
  67. if (mBUseApr){
  68. factoryReal.setProtocol("org.apache.coyote.http11.Http11AprProtocol");
  69. factoryReal.addContextLifecycleListeners(new AprLifecycleListener());
  70. }
  71. factoryReal.addConnectorCustomizers(new MyTomcatConnectorCustomizer());
  72. factoryReal.setPort(mNPort);
  73. }
  74. }
  75. class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer
  76. {
  77. public void customize(Connector connector)
  78. {
  79. connector.setEnableLookups(false);
  80. if (mBUseApr){
  81. Http11AprProtocol protocol = (Http11AprProtocol) connector.getProtocolHandler();
  82. initTomcatParam(protocol);
  83. }else{
  84. Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
  85. initTomcatParam(protocol);
  86. }
  87. }
  88. private <T> void initTomcatParam(AbstractProtocol<T> protocol){
  89. /*
  90. * application.properties中的参数优先级高于代码设置的参数
  91. * 即代码设置参数后若application.properties中有同名参数,application.properties中的优先生效
  92. * */
  93. /**
  94. *Tomcat在MaxThreads和AcceptCount队列设置基础上,对请求连接多做了一层保护,也就是MaxConnections的大小限制。
  95. *当Client端的大量请求过来时,首先进入MaxThreads,MaxThreads满了则进入AcceptCount队列,
  96. *若AcceptCount队列也满了则后续的连接无法进入AcceptCount队列,无法交由工作线程处理,Client将得到connection refused或者connection reset的错误。
  97. *第二层保护就是:在acceptor线程里头进行缓冲,当连接的socket超过MaxConnections的时候,则进行阻塞等待,控制acceptor转给worker线程连接的速度,稍微缓缓,等待worker线程处理响应client。
  98. */
  99. protocol.setMaxConnections(mNMaxConcurrentRequest);
  100. protocol.setMaxThreads(mNMaxThreads);
  101. protocol.setAcceptCount(mNMaxAcceptCounts);
  102. protocol.setMinSpareThreads(mNMaxThreads/10);//初始化时创建的线程数
  103. LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO
  104. , LogFlagBusiType.BUSI_INIT.toStrValue(), this.getClass().getSimpleName()
  105. , String.format("tomcat pramas:{mode=%s max-threads=%d max-conns=%d accept-counts=%d conn-timeout=%d minSpareThreads=%d} server-id:{%s}"
  106. , mBUseApr?"Apr":"Nio"
  107. , protocol.getMaxThreads()
  108. , protocol.getMaxConnections()
  109. , protocol.getAcceptCount()
  110. , protocol.getConnectionTimeout()
  111. , protocol.getMinSpareThreads()
  112. , mStrServerId));
  113. }
  114. }
  115. }