应用场景:多项目同时运行场景下,比如rpc,job等多个服务同时运行,因此端口号配置很有必要,
因为项目结构分rpc,job,common三个module,公用配置均配置在了common的module里面,
比如rpc的端口号是8080,而又不想把common的配置priperties文件重新拷贝一份到job上面,
因此只需要差异化一下端口号即可,那就想到在启动类上面进行端口配置。
代码部分:
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import lombok.extern.slf4j.Slf4j; import org.apache.catalina.connector.Connector; import org.apache.coyote.http11.Http11NioProtocol; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.Environment; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.util.StringUtils; import java.net.InetAddress; import java.net.UnknownHostException;
@SpringBootApplication
@EnableDubbo
@EnableAsync
@EnableScheduling
@Slf4j
public class JobStartApplication extends SpringBootServletInitializer implements WebServerFactoryCustomizer {
public static void main(String[] args) throws UnknownHostException {
ConfigurableApplicationContext application = SpringApplication.run(JobStartApplication.class, args);
Environment env = application.getEnvironment();
String ip = InetAddress.getLocalHost().getHostAddress();
String port = env.getProperty("server.port");
String path = env.getProperty("server.servlet.context-path");
if (StringUtils.isEmpty(path)) {
path = "";
}
log.info("\n----------------------------------------------------------\n\t" +
"Application is running! Access URLs:\n\t" +
"Local访问网址: \t\thttp://localhost:" + port + path + "\n\t" +
"External访问网址: \thttp://" + ip + ":" + port + path + "\n\t" +
"----------------------------------------------------------");
}
@Override
public void customize(WebServerFactory factory) {
((TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer(){
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
protocol.setPort(8081);
}
});
}
}
主要实现逻辑是实现WebServerFactoryCustomizer类的customize方法
在自定义里面使用Http11NioProtocol进行端口重设。