文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot3.3 中如何实现多端口监听

2024-11-29 19:41

关注

运行效果:

图片

若想获取项目完整代码以及其他文章的项目源码,且在代码编写时遇到问题需要咨询交流,欢迎加入下方的知识星球。

项目环境与依赖配置

首先,我们需要创建一个 SpringBoot 项目,并确保项目中包含必要的依赖。以下是 pom.xml的配置:



	4.0.0
	
		org.springframework.boot
		spring-boot-starter-parent
		3.3.3
		 
	
	com.icoderoad
	multi-port-demo
	0.0.1-SNAPSHOT
	multi-port-demo
	Demo project for Spring Boot
	
	
		17
	
	
		
		
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        

		
			org.springframework.boot
			spring-boot-starter-test
			test
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	

配置多端口监听

在 SpringBoot 中,通过配置 application.yml 文件可以轻松实现多端口监听。以下是配置示例:

server:
  port: 8080 # 主端口

# 额外的端口配置
additional-ports:
  - 8081
  - 8082

编写配置类实现多端口监听

在配置文件中指定了额外的端口后,我们需要编写一个配置类,使用 Spring 的 EmbeddedWebServerFactoryCustomizer 来实现多端口监听。我们在 MultiPortConfig 类中为每个端口配置一个独立的 Spring 上下文。

package com.icoderoad.multi_port_demo.config;

import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MultiPortConfig {

    @Bean
    public ServletWebServerFactory servletWebServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addAdditionalTomcatConnectors(createConnector(8081)); // Add additional port 8081
        factory.addAdditionalTomcatConnectors(createConnector(8082)); // Add additional port 8082
        return factory;
    }

    private Connector createConnector(int port) {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setPort(port);
        return connector;
    }
}

在这个配置类中,createAndStartContext 方法为 8081 和 8082 端口创建了独立的 Spring 上下文,每个上下文对应一个配置类(Port8081Config 和 Port8082Config),这些配置类会定义对应端口下的控制器。

为每个端口创建独立的配置类

现在,我们为每个端口创建独立的配置类,这些配置类将会注册相应的控制器。

8081 端口配置类

package com.icoderoad.multi_port_demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import com.icoderoad.multi_port_demo.controller.Port8081Controller;

@Configuration
@EnableWebMvc
public class Port8081Config {

    @Bean
    public Port8081Controller port8081Controller() {
        return new Port8081Controller();
    }
}

8082 端口配置类

package com.icoderoad.multi_port_demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import com.icoderoad.multi_port_demo.controller.Port8082Controller;

@Configuration
@EnableWebMvc
public class Port8082Config {

    @Bean
    public Port8082Controller port8082Controller() {
        return new Port8082Controller();
    }
}

这些配置类会在相应的端口上下文中注册对应的控制器。

控制器类定义

定义控制器类,每个控制器类对应一个端口,之前的控制器定义无需改变:

8080 端口的控制器(保持原有配置)

package com.icoderoad.multi_port_demo.controller;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Port8080Controller {

    @GetMapping("/port8080/service")
    public ResponseEntity  service() {
    	
    	HttpHeaders headers = new HttpHeaders();
        headers.setContentType(org.springframework.http.MediaType.TEXT_PLAIN);
        headers.set(HttpHeaders.CONTENT_TYPE, "text/plain; charset=UTF-8");
        
        return new ResponseEntity<>("端口 8080 的服务数据", headers, HttpStatus.OK);
        
    }
}

8081 端口的控制器

package com.icoderoad.multi_port_demo.controller;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Port8081Controller {

	@CrossOrigin(origins = "http://localhost:8080") // 允许的前端地址
    @GetMapping("/port8081/service")
	public ResponseEntity  service() {
    	
    	HttpHeaders headers = new HttpHeaders();
        headers.setContentType(org.springframework.http.MediaType.TEXT_PLAIN);
        headers.set(HttpHeaders.CONTENT_TYPE, "text/plain; charset=UTF-8");
        
        return new ResponseEntity<>("端口 8081 的服务数据", headers, HttpStatus.OK);
        
    }
}

8082 端口的控制器

package com.icoderoad.multi_port_demo.controller;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Port8082Controller {

	@CrossOrigin(origins = "http://localhost:8080") // 允许的前端地址
    @GetMapping("/port8082/service")
	public ResponseEntity  service() {
    	
    	HttpHeaders headers = new HttpHeaders();
        headers.setContentType(org.springframework.http.MediaType.TEXT_PLAIN);
        headers.set(HttpHeaders.CONTENT_TYPE, "text/plain; charset=UTF-8");
        
        return new ResponseEntity<>("端口 8082 的服务数据", headers, HttpStatus.OK);
        
    }
}

编写前端页面

在 src/main/resources/templates 目录下创建一个简单的 index.html 页面,使用 Thymeleaf 和 Bootstrap 进行前端展示。




    SpringBoot 多端口监听
   


此应用监听多个端口,分别处理不同的请求。

主端口:8080

额外端口:8081, 8082

端口 8080 数据

加载中...

端口 8081 数据

加载中...

端口 8082 数据

加载中...

视图控制器实现

在 src/main/java/com/icoderoad/controller 目录下创建一个简单的控制器,用于处理 HTTP 请求。

package com.icoderoad.multi_port_demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class IndexController {

    @GetMapping("/")
    public String index() {
        return "index";
    }
}

上述代码中,我们创建了一个简单的控制器类,提供了一个主页和一个返回监听端口信息的接口。

启动与验证

启动 SpringBoot 应用后,在浏览器中访问 http://localhost:8080、http://localhost:8081 和 http://localhost:8082,你会发现所有端口都可以正常响应请求,说明我们已经成功实现了多端口监听。

总结

通过本文的详细讲解,我们学习了如何在 SpringBoot 中实现多端口监听。这一功能在处理不同类型的请求或暴露多个服务接口时非常有用。我们通过配置 application.yml 文件和编写自定义配置类,结合前端展示,实现了这一功能。

来源:路条编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯