集群搭建
根据官方文档的介绍,Nacos的集群架构大致如下图所示,(省略了集中化存储信息的MySql):
下面我们就来一步步介绍,我们每一步的搭建细节。
MySql数据源配置
对于数据源的修改,我们上一篇已经说过了。我们再来复习一遍。
在进行集群部署之前,先完成对MySql数据源的初始化和配置。主要分以下两步:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
注:这里的数据库端口、用户名、密码大家按照自己的写。
集群配置
在Nacos的conf目录下有一个 cluster.conf.example,可以直接把 example扩展名去掉来使用,也可以单独创建一个 cluster.conf 文件。
在本地不同端口启动3个Nacos服务端为例,可以如下配置:
127.0.0.1:8841
127.0.0.1:8842
127.0.0.1:8843
注意:如果我们正式使用的话,要保证这个三个服务器地址是互通的。
启动实例
在完成了上面的配置之后,我们就可以开始在各个节点上启动Nacos实例,已组建Nacos集群来使用了。
由于本文中我们测试学习了本地启动多实例的情况,与真正生产部署会有一些差异,所以下面分两种情况说一下,如何启动各个Nacos实例。
本地测试
本文中,在集群配置的时候,我们设定了3个Nacos的实例都在本地,只是端口不同 ,所以我们启动Nacos的时候,需要修改不同的端口号。
下面介绍两种方法来方便启动Nacos的3个实例,
第一种:Windows环境
首先将startup.cmd复制3份,然后按照我们上面配置的端口,挨个修改。
我们打开解压后的nacos的bin目录,然后鼠标右键编辑startup.cmd文件,添加一行脚本,如下图:
注:另外两个按照这个来修改就可以了,注意端口号不可以重复。
第二种:Linux环境
首先将startup.sh文件复制3份,然后按照我们上面配置的端口,挨个修改。
我们打开解压后的nacos的bin目录,然后鼠标右键编辑startup.sh文件,添加一行脚本,如下图:
注:另外两个按照这个来修改就可以了,注意端口号不可以重复。
这里我们通过 -Dserver.port 的方式,在JVM启动的时候指定了具体的端口号,来实现在本机启动3个不同的Nacos的实例来组成集群。
修改完3个脚本之后,分别执行下面的命令就可以在本地启动Nacos集群了:
Windows
startup-8841.cmd -m standalone
startup-8842.cmd -m standalone
startup-8843.cmd -m standalone
Linux
sh startup-8841.sh
sh startup-8842.sh
sh startup-8843.sh
生产环境
在实际生产环境部署的时候,由于每个实例分布在不同的节点上,我们可以直接使用默认的启动脚本(除非要调整一些JVM参数等才需要修改)。只需要在各个节点的Nacos的 bin 目录下执行 sh startup.sh 命令即可。
Proxy配置
在Nacos的集群启动完毕之后,根据架构图所示,我们还需要提供一个统一的入口给我们用来维护以及给Spring Cloud应用访问。简单地说,就是我们需要为上面启动的3个Nacos实例做一个可以为它们实现负载均衡的访问点。这个实现的方式非常多,这里就举个用Nginx来实现简单的例子吧。
在Nginx配置文件的http段中,我们可以加入下面的配置内容:
这样,当我们访问: http://localhost:8080/nacos/的时候,就会被负载均衡的代理到之前我们启动的3个Nacos实例上了。这里我们没有配置 upstream 的具体策略,默认会使用线性轮训的方式,如果有需要,也可以配置上个更为复杂的分发策略。这部分是Nginx的使用内容,这里就不具体介绍了。
这里提一下我在尝试搭建时候碰到的一个问题,如果大家也遇到了,希望下面的说明能为大家解决问题。
错误信息如下:
2019-02-20 16:20:53,216 INFO The host [nacos_server] is not valid
Note: further occurrences of request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: The character [_] is never valid in a domain name.
at org.apache.tomcat.util.http.parser.HttpParser$DomainParseState.next(HttpParser.java:926)
at org.apache.tomcat.util.http.parser.HttpParser.readHostDomainName(HttpParser.java:822)
at org.apache.tomcat.util.http.parser.Host.parse(Host.java:71)
at org.apache.tomcat.util.http.parser.Host.parse(Host.java:45)
at org.apache.coyote.AbstractProcessor.parseHost(AbstractProcessor.java:288)
at org.apache.coyote.http11.Http11Processor.prepareRequest(Http11Processor.java:809)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
主要原因,一开始在配置 upstream 的时候,用了 nacos_server 作为名称,而在Nacos使用的Tomcat版本中不支持 _ 符号出现在域名位置,所以上面截图给出的 upstream 的名称是 nacosserver,去掉 _ 符号。
到这里,Nacos的集群搭建就完成了!我们可以通过Nginx配置的代理地址:**http://localhost:8080/nacos/**来访问Nacos,在Spring Cloud应用中也可以用这个地址来作为注册中心和配置中心的访问地址来配置。读者可以使用文末的代码示例来修改原来的Nacos地址来启动,看是否可以获取配置信息来验证集群的搭建是否成功。也可以故意的关闭某个实例,来验证Nacos集群是否还能正常服务。
深入思考
在Nacos官方文档的指引下,Nacos的集群搭建总体上还是非常顺畅的,没有什么太大的难度。但是值得思考的一个问题跟在上一篇中讲数据持久化的思考类似,作为一个注册中心和配置中心,Nacos的架构是否显得太过于臃肿?除了Nacos自身之外,还需要依赖更多的中间件来完成整套生产环境的搭建,相较于其他的可以用于服务发现与配置的中间件来说,就不那么有优势了。尤其对于小团队来说,这样的复杂度与成本投入,也是在选型的时候需要去考虑的。
注:本文摘自程序猿DD-翟永超老师,我是亲自打字学习了解。