研究一下Nacos注册中心,至于它的特点,下面这张图基本就说明了,可以看到它和ZooKeeper不同,保障AP而不是CP
下面还是通过本地搭建dubbo工程来一步一步研究
在此之前,一直有一个遗留问题没解决,就是我在MacOS上,Dubbo在检测本地IP地址的时候,得到的是一个错误的非法的地址,具体的问题之前写过一个帖子:
正好趁今天,把本地这个问题解决一下,问题的原因说到底就是InetAddress.getLocalHost()方法先获取hostname,然后根据hostname获取ipaddr得到的ipaddr不准确
比如直接打印结果
public class HelloTest { public static void main(String[] args) throws UnknownHostException { System.out.println(InetAddress.getLocalHost()); } }
输出的结果却是:2019/0.0.7.227
说到底这种方法十分奇怪,当然这不是我关心的,这里我就直接按要求将$hostname指向我希望的IP地址就行了
(1)设置-共享-电脑名称,设置hostname,配置2019,会默认填充为2019.local
(2)接着直接命令设定
sudo scutil --set HostName 2019.local sudo scutil --set ComputerName 2019.local
(3)直接ping本地hostname,能够正常得到地址即可
~ ping 2019.local PING 2019.local (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.036 ms 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.091 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.095 ms
再去执行上面的sout,可以得到:2019.local/127.0.0.1
上面这个问题解决后,首先来创建dubbo服务,这里我安装了阿里做的一个IDEA插件Cloud Toolkit,安装插件之后可以直接新建Apache Dubbo工程
注册中心选择Nacos,配置采取注解方式,就不用XML了
接着需要安装一下Nacos服务,下载nacos-server,地址:https://github.com/alibaba/nacos/releases
默认server端口是8848,如果要修改可以改这个地方
vim conf/application.properties server.port=8848
启动nacos
tar zxvf nacos-server-1.1.4.tar.gz cd nacos/bin sh startup.sh -m standalone
这个时候,可以直接打开nacos控制台页面:http://localhost:8848/nacos
用户名和密码:nacos/nacos
能够直接登录上去,说明nacos安装无误
然后启动dubbo工程的provider,结果报错了
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2019-10-26 00:22:50.688 ERROR 26029 --- [ main] o.s.boot.SpringApplication : Application run failed
这么看来还是nacos哪里和dubbo配置的有问题导致注册不上,可以将provider里的application.properties注册配置修改为直连,如下
## Dubbo Registry dubbo.registry.address=N/A
假如这样provider启动没问题,说明dubbo工程provider没问题,还是得看nacos,查询了半天也没找到原因,因为nacos-server我下的是最新版本,但是dubbo版本相对老一点,试着dubbo换一个新版本2.7.3,重新试了下,呵,还真的就不报错了,可见应该是两者兼容性有问题
dubbo version: 2.7.3, current host: 192.168.0.100 2019-10-26 10:37:47.371 INFO 28826 --- [ main] c.lihua.provider.DubboProviderBootstrap : Started DubboProviderBootstrap in 2.15 seconds (JVM running for 2.695) 2019-10-26 10:37:47.375 INFO 28826 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await...
那么再来看nacos控制台,dubbo是已经注册上了
但是订阅者列表为空,这时再启动consumer,可以在provider挂起的地方看到打印日志,来自interface的implementions里
2019-10-26 10:51:33.588 INFO 29086 --- [:12345-thread-2] com.lihua.provider.DemoServiceImpl : Hello Provider, request from consumer: /192.168.0.100:49500 2019-10-26 10:51:33.634 WARN 29086 --- [erverWorker-3-1] o.a.d.remoting.transport.AbstractServer : [DUBBO] All clients has disconnected from /192.168.0.100:12345. You can graceful shutdown now., dubbo version: 2.7.3, current host: 192.168.0.100
但是有一点,consumer里每次执行就只消费一次,无法看到nacos控制台服务列表的消费者,因此加一个for循环,持续打印
package com.lihua.consumer; import com.lihua.DemoService; import org.apache.dubbo.config.annotation.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Bean; @EnableAutoConfiguration public class DubboConsumerBootstrap { private final Logger logger = LoggerFactory.getLogger(getClass()); @Reference(version = "1.0.0") private DemoService demoService; public static void main(String[] args) { SpringApplication.run(DubboConsumerBootstrap.class).close(); } @Bean public ApplicationRunner runner() { for (int i = 0; i < 20; i++) { demoService.sayHello("LiHui Provider"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } return args -> logger.info(demoService.sayHello("Provider")); } }
同样provider会打印出
2019-10-26 11:13:08.726 INFO 29086 --- [12345-thread-22] com.lihua.provider.DemoServiceImpl : Hello LiHui Provider, request from consumer: /192.168.0.100:50535
这样就可以看到consumer了
OVER