nacos服务发现配置(内置/外置Tomcat部署)
一:内置Tomcat解决方案
1.springboot+nacos
1.1maven配置
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.10</version>
</dependency>
1.2参数配置
nacos:
discovery:
server-addr: xxx:8848
auto-register: true
username: xxx
password: xxx
namespace: test-namespace
register:
enabled: true
ephemeral: true
groupName: test-groupName
healthy: true
weight: 1
1.3服务列表

2.springcloud+nacos
2.1maven配置
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
1.2参数配置
spring:
application:
name: test-app
cloud:
nacos:
discovery:
group: test-group
namespace: test-namespace
password: xxx
server-addr: xxx:8848
username: xxx
1.3服务列表

二:外置Tomcat解决方案
外置Tomcat就是以war包形式部署服务
1.springboot+nacos
1.1maven配置
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.10</version>
</dependency>
1.2nacos服务注册源码
1.2.1:主要是通过NacosDiscoveryAutoRegister类监听WebServerInitializedEvent事件注册服务
@Component
public class NacosDiscoveryAutoRegister implements ApplicationListener<WebServerInitializedEvent> {
private static final Logger logger = LoggerFactory.getLogger(NacosDiscoveryAutoRegister.class);
@NacosInjected
private NamingService namingService;
@Autowired
private NacosDiscoveryProperties discoveryProperties;
@Value("${spring.application.name:}")
private String applicationName;
public NacosDiscoveryAutoRegister() {
}
public void onApplicationEvent(WebServerInitializedEvent event) {
if (this.discoveryProperties.isAutoRegister()) {
Register register = this.discoveryProperties.getRegister();
if (StringUtils.isEmpty(register.getIp())) {
register.setIp(NetUtils.localIP());
}
if (register.getPort() == 0) {
register.setPort(event.getWebServer().getPort());
}
register.getMetadata().put("preserved.register.source", "SPRING_BOOT");
register.setInstanceId("");
String serviceName = register.getServiceName();
if (StringUtils.isEmpty(serviceName)) {
if (StringUtils.isEmpty(this.applicationName)) {
throw new AutoRegisterException("serviceName notNull");
}
serviceName = this.applicationName;
}
try {
this.namingService.registerInstance(serviceName, register.getGroupName(), register);
logger.info("Finished auto register service : {}, ip : {}, port : {}", new Object[]{serviceName, register.getIp(), register.getPort()});
} catch (NacosException var5) {
throw new AutoRegisterException(var5);
}
}
}
}
1.3本地添加spring应用代码监听
注意:需开启nacos.discovery.enabled=true配置开关;
关键代码:IWebServer iWebServer = new UnEmbeddedTomcat();
register.setPort(iWebServer.getPort());
@Component
@ConditionalOnProperty(
name = {"nacos.discovery.enabled"},
havingValue = "true"
)
public class NacosDiscoveryAutoRegirsterWrapper implements ApplicationRunner {
private static final Logger log = LoggerFactory.getLogger(NacosDiscoveryAutoRegirsterWrapper.class);
@NacosInjected
private NamingService namingService;
@Autowired
private NacosDiscoveryProperties discoveryProperties;
@Value("${spring.application.name:}")
private String applicationName;
@Value("${webserver.type:tomcat}")
private String webserver;
public NacosDiscoveryAutoRegirsterWrapper() {
}
public void run(ApplicationArguments args) {
if (this.discoveryProperties.isAutoRegister()) {
Register register = this.discoveryProperties.getRegister();
if (StringUtils.isEmpty(register.getIp())) {
register.setIp(NetUtils.localIP());
}
if (register.getPort() == 0) {
if (!"tomcat".equals(this.webserver)) {
throw new AutoRegisterException("webserver not support!");
}
IWebServer iWebServer = new UnEmbeddedTomcat();
register.setPort(iWebServer.getPort());
}
if (register.getPort() == 0) {
throw new AutoRegisterException("serviceName port not found!");
} else {
register.getMetadata().put("preserved.register.source", "SPRING_BOOT WHIT UNEMBEDDED-TOMCAT");
register.setInstanceId("");
String serviceName = register.getServiceName();
if (StringUtils.isEmpty(serviceName)) {
if (StringUtils.isEmpty(this.applicationName)) {
throw new AutoRegisterException("serviceName notNull");
}
serviceName = this.applicationName;
}
try {
this.namingService.registerInstance(serviceName, register.getGroupName(), register);
log.info("Finished auto register service : {}, ip : {}, port : {}", new Object[]{serviceName, register.getIp(), register.getPort()});
} catch (NacosException var5) {
throw new AutoRegisterException("自动注册异常:" + var5);
}
}
}
}
}
获取外置容器端口:
public class UnEmbeddedTomcat implements IWebServer {
private static final Logger log = LoggerFactory.getLogger(UnEmbeddedTomcat.class);
public UnEmbeddedTomcat() {
}
public Integer getPort() {
try {
MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"), Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
if (!CollectionUtils.isEmpty(objectNames)) {
String port = ((ObjectName)objectNames.iterator().next()).getKeyProperty("port");
return Integer.parseInt(port);
}
} catch (MalformedObjectNameException var4) {
log.error("外置tomcat容器获取服务端口失败:{}", var4);
}
return 0;
}
}
获取外置容器端口代码说明:这里是从外置tomcat容器的server.xml获取对应端口的代码,其中protocol如果自行变更了,记得这里也要变更。看下图你就悟了:

1.4配置文件
nacos:
discovery:
//该开关若开启,启动外置容器兼容
enabled: true
server-addr: xxx:8848
auto-register: true
username: xxx
password: xxx
namespace: acs-common
register:
enabled: true
ephemeral: true
groupName: acs-config-center
healthy: true
weight: 1
2.springcloud+nacos
2.1maven配置
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
2.2核心代码
@Configuration
@ConditionalOnClass({NacosAutoServiceRegistration.class, NacosRegistration.class})
public class SpringCloudNacosDiscoveryAutoRegirsterWrapper {
private static final Logger log = LoggerFactory.getLogger(SpringCloudNacosDiscoveryAutoRegirsterWrapper.class);
@Autowired
private NacosRegistration registration;
@Autowired
private NacosAutoServiceRegistration nacosAutoServiceRegistration;
@Value("${webserver.type:tomcat}")
private String webserver;
public SpringCloudNacosDiscoveryAutoRegirsterWrapper() {
}
@PostConstruct
public void nacosServerRegister() {
log.info("注册服务");
if (this.registration != null) {
try {
if (this.registration.getPort() == 0) {
if (!"tomcat".equals(this.webserver)) {
throw new IllegalArgumentException("webserver not support!");
}
IWebServer iWebServer = new UnEmbeddedTomcat();
this.registration.setPort(iWebServer.getPort());
}
if (this.registration.getPort() == 0) {
throw new IllegalArgumentException("serviceName port not found!");
}
this.nacosAutoServiceRegistration.start();
log.info("Finished auto register service : {}, ip : {}, port : {}", new Object[]{this.registration.getServiceId(), this.registration.getHost(), this.registration.getPort()});
} catch (Exception var2) {
log.error("获取外部Tomcat端口异常:{}", var2);
}
}
}
}
2.3参数配置
spring:
application:
name: acs-user-center
cloud:
nacos:
discovery:
group: acs-user-center
namespace: acs-common
password: xxx
server-addr: xxx:8848
username: xxx