Dubbo融合Nacos注册中心

研究一下Nacos注册中心,至于它的特点,下面这张图基本就说明了,可以看到它和ZooKeeper不同,保障AP而不是CP

下面还是通过本地搭建dubbo工程来一步一步研究

在此之前,一直有一个遗留问题没解决,就是我在MacOS上,Dubbo在检测本地IP地址的时候,得到的是一个错误的非法的地址,具体的问题之前写过一个帖子:

dubbo注册异常记录

正好趁今天,把本地这个问题解决一下,问题的原因说到底就是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工程 NewImage

注册中心选择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是已经注册上了

NewImage

但是订阅者列表为空,这时再启动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了

NewImage

OVER

发表回复