文章目录
一、规划
nacos至少要3台主机才能搭建集群,所以这里分配的ip是:
128.30.14.245:8848
128.30.14.249:8848
128.30.14.221:8848
二、集群配置
由于已经是集群模式,不怕丢数据,出鉴于nacos的数据量小,所以决定采取内置数据库的模式启动nacos。
** 注意,nacos的群集若使用嵌入式(内置)数据库则会同步配置中心的数据,若使用外部数据库,则不同步!**,也就是说多个nacos服务应该使用同一个数据库才能做到配置数据共享!
1、建立cluster.conf
分别在三台主机的nacos/conf下建立cluster.conf集群配置文件,将上集的ip:port填入:
128.30.14.245:8848
128.30.14.249:8848
128.30.14.221:8848
2、修改application.properties
修改这个配置文件,将数据库配置的注释掉,并且指定本机的ip:
3、建立集群启动脚本
分别于三台服务器上建立启动脚本,vi start-clust.sh, 指定为内置模式
#!/bin/bash
./startup.sh -p embedded
三、启动并测试
分别启动三台主机的start-clust.sh,当启动第一台时,tail -f logs/start.out会发现它一直在starting …,因为它在等待其他小伙伴。所以,你要继续启动其他两台主机的nacos。然后它们都能启动成功:
测试一下,在其中一台nacos里面建立一个DataID,
其他nacos里面也即时同步过去了:
再看一下节点列表,都上线了:
四、SpringCloud端nacos集群的配置
官方及网络上多是介绍利用nginx来转发到nacos集群,这个方案一旦nginx无法用域名来访问,其实是多了一重意外:nginx主机宕机了又怎么办? 所以以下介绍如何在cloud项目里面指定nacos集群参数:
1、配置discovery的参数
用逗号分隔3个nacos的ip:地址
2、配置dubbo注册器
由于新版的dubbo端支持多注册器注册,具体请参阅org.apache.dubbo.spring.boot.autoconfigure.DubboConfigurationProperties#setRegistries(Map<String, RegistryConfig> registries),传入的是map参数,所以:
3、测试
在dubbo-2.7.8.jar!/org/apache/dubbo/config/ServiceConfig.class:397
registryURLs的内容,可以得知,除了向我们配置里面的4个nacos服务器注册provider服务之外还向自己也注册了一份。
代码如下:
while(var10.hasNext()) {
URL registryURL = (URL)var10.next();
if (!"injvm".equalsIgnoreCase(url.getProtocol())) {
url = url.addParameterIfAbsent("dynamic", registryURL.getParameter("dynamic"));
URL monitorUrl = ConfigValidationUtils.loadMonitor(this, registryURL);
if (monitorUrl != null) {
url = url.addParameterAndEncoded("monitor", monitorUrl.toFullString());
}
if (logger.isInfoEnabled()) {
if (url.getParameter("register", true)) {
logger.info("Register dubbo service " + this.interfaceClass.getName() + " url " + url + " to registry " + registryURL);
} else {
logger.info("Export dubbo service " + this.interfaceClass.getName() + " to url " + url);
}
}
String proxy = url.getParameter("proxy");
if (StringUtils.isNotEmpty(proxy)) {
registryURL = registryURL.addParameter("proxy", proxy);
}
Invoker<?> invoker = PROXY_FACTORY.getInvoker(this.ref, this.interfaceClass, registryURL.addParameterAndEncoded("export", url.toFullString()));
DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);
Exporter<?> exporter = PROTOCOL.export(wrapperInvoker);
this.exporters.add(exporter);
}
}
最终向nacos发起注册url的方法:com.alibaba.nacos.client.naming.net.NamingProxy#registerService
调用com.alibaba.nacos.common.http.client.NacosRestTemplate#execute来发送数据。
最后查看一下log,已经能成功向3台nacos服务器注册上provider服务了:
INFO 12864 --- [ main] org.apache.dubbo.config.ServiceConfig : [DUBBO] Register dubbo service com.freestyle.seatabusiness.api.service.AccountService url dubbo://128.30.202.25:20880/com.freestyle.seatabusiness.api.service.AccountService?anyhost=true&application=dubbo-business-account-service-provider&bind.ip=128.30.202.25&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.freestyle.seatabusiness.api.service.AccountService&metadata-type=remote&methods=addAccount,debit&pid=12864&qos.accept.foreign.ip=false&qos.enable=false&release=2.7.8&side=provider×tamp=1640137663016 to registry registry://128.30.14.245:8848/org.apache.dubbo.registry.RegistryService?application=dubbo-business-account-service-provider&dubbo=2.0.2&group=seata-business&pid=12864&qos.accept.foreign.ip=false&qos.enable=false®istry=nacos&release=2.7.8×tamp=1640137663014, dubbo version: 2.7.8, current host: 172.23.176.1
...
INFO 12864 --- [ main] org.apache.dubbo.config.ServiceConfig : [DUBBO] Register dubbo service com.freestyle.seatabusiness.api.service.AccountService url dubbo://128.30.202.25:20880/com.freestyle.seatabusiness.api.service.AccountService?anyhost=true&application=dubbo-business-account-service-provider&bind.ip=128.30.202.25&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.freestyle.seatabusiness.api.service.AccountService&metadata-type=remote&methods=addAccount,debit&pid=12864&qos.accept.foreign.ip=false&qos.enable=false&release=2.7.8&side=provider×tamp=1640137663016 to registry registry://128.30.14.249:8848/org.apache.dubbo.registry.RegistryService?application=dubbo-business-account-service-provider&dubbo=2.0.2&group=seata-business&pid=12864&qos.accept.foreign.ip=false&qos.enable=false®istry=nacos&release=2.7.8×tamp=1640137663016
...
INFO 12864 --- [ main] org.apache.dubbo.config.ServiceConfig : [DUBBO] Register dubbo service com.freestyle.seatabusiness.api.service.AccountService url dubbo://128.30.202.25:20880/com.freestyle.seatabusiness.api.service.AccountService?anyhost=true&application=dubbo-business-account-service-provider&bind.ip=128.30.202.25&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.freestyle.seatabusiness.api.service.AccountService&metadata-type=remote&methods=addAccount,debit&pid=12864&qos.accept.foreign.ip=false&qos.enable=false&release=2.7.8&side=provider×tamp=1640137663016 to registry registry://128.30.14.221:8848/org.apache.dubbo.registry.RegistryService?application=dubbo-business-account-service-provider&dubbo=2.0.2&group=seata-business&pid=12864&qos.accept.foreign.ip=false&qos.enable=false®istry=nacos&release=2.7.8×tamp=1640137663016
...