Spring Clound Nacos服务注册示例程序+部署到Tomcat服务器的处理
一、Nacos服务注册中心
1、下载Nacos服务注册中心,下载地址https://github.com/alibaba/nacos/releases。
2、将下载下来的nacos-server-XXX.zip文件解压,找到bin文件夹下的startup.bat文件,右键选编辑用记事本打开,把里面的set MODE="cluster"改成set MODE="standalone",即把集群布置改成独立布置。
3、双击启动startup.bat,在浏览器中输入网址http://localhost:8848/nacos,即可打开页面,输入初始用户名nacos和密码nacos,进入界面。
二、创建一个Service Provider,并在Nacos里注册
1、pom.xml文件如下

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>provider</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>provider</name> <description>Demo project for Spring Boot</description> <properties> <java.version>11</java.version> <spring-cloud.version>2020.0.3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>LATEST</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2、application.properties文件里设置服务注册中心地址以及Service Provider的名称和端口
#Service Provider的名称
spring.application.name=myprovider
#Service Provider的端口 server.port=8080
#nacos服务注册中心的地址和端口,注意端口号后面没有/nacos spring.cloud.nacos.discovery.server-addr=localhost:8848
3、启动程序添加注解@EnableDiscoveryClient,代码如下:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
4、设置完成上述三步之后,在IDEA里启动程序,已经可以看到在Nacos注册中心页面上出现了myprovider这个服务。
三、部署到Tomcat
1、创建一个ServletInitializer类,继承SpringBootServletInitializer,代码如下

import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @Component public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(ProviderApplication.class); } @GetMapping("/") public String echo(){ return "helloworld"; } }
2、创建一个NacosConfig类,继承ApplicationRunner,代码如下

import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import javax.management.MBeanServer; import javax.management.ObjectName; import javax.management.Query; import java.lang.management.ManagementFactory; import java.util.Set; @Component public class NacosConfig implements ApplicationRunner { @Autowired(required = false) private NacosAutoServiceRegistration registration; @Value("${server.port}") Integer port; @Override public void run(ApplicationArguments args) { if (registration != null && port != null) { Integer tomcatPort = port; try { tomcatPort = new Integer(getTomcatPort()); } catch (Exception e) { e.printStackTrace(); } registration.setPort(tomcatPort); registration.start(); } } /** * 获取外部tomcat端口 */ public String getTomcatPort() throws Exception { MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer(); Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"), Query.match(Query.attr("protocol"), Query.value("HTTP/1.1"))); String port = objectNames.iterator().next().getKeyProperty("port"); return port; } }
3、创建一个NacosListener类,继承ApplicationListener<ApplicationReadyEvent>,代码如下

import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration; import com.alibaba.cloud.nacos.registry.NacosRegistration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Component public class NacosListener implements ApplicationListener<ApplicationReadyEvent> { @Autowired private NacosRegistration registration; @Autowired private NacosAutoServiceRegistration nacosAutoServiceRegistration; @Override public void onApplicationEvent(ApplicationReadyEvent event) { String property = event.getApplicationContext().getEnvironment().getProperty("server.port"); registration.setPort(Integer.valueOf(property)); nacosAutoServiceRegistration.start(); } @EventListener(ApplicationReadyEvent.class) public void onWebServerReady(ApplicationReadyEvent event) { String property = event.getApplicationContext().getEnvironment().getProperty("server.port"); registration.setPort(Integer.valueOf(property)); nacosAutoServiceRegistration.start(); } }
完成后,将程序导出成war文件,部署到Tomcat里。