dubbo 搭建 學習教程 配置 附GitHub 源碼 ( 二 )

原文鏈接:https://blog.csdn.net/weixin_40533111/article/details/83658248 作者四月天五月雨^_^,轉載請註明出處,謝謝

聲明

本文參考dubbo官網:http://dubbo.apache.org/en-us/docs/user/preface/architecture.html

基礎架構,理論篇可參考:dubbo使用小全 分析 理解 附GitHub 源碼 ( 一 )
其他重要功能可參考:dubbo使用小全 分析 理解 附GitHub 源碼 ( 三 )

1.搭建簡單工程:

在springboot大行其道的今天,本文用純註解方式使用dubbo,註冊中心可用zookeeper,redis等需要單獨搭建,本文采用multicast廣播方式,可用於測試,生產上建議zookeeper

1.依賴

   <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.4</version>
        </dependency>
        <!--補充dubbo依賴的netty包-->
        <dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-core</artifactId>
            <version>3.1.2</version>
        </dependency>

2.provider

2.1 服務提供方配置信息,以後的各種使用,基本都在此處

/**
 * @author peichanglei
 * @date 2018/11/02 12:16
 */
@Configuration
public class DubboProviderConfig {
    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("provider-test");
        return applicationConfig;
    }

    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("multicast://224.5.6.7:1234");
        registryConfig.setClient("curator");
        return registryConfig;
    }

    @Bean
    public ProviderConfig providerConfig() {
        ProviderConfig providerConfig = new ProviderConfig();

        /**
         * 集羣容錯模式,設置重試次數(不含第一次)
         */
        providerConfig.setRetries(2);
        return providerConfig;
    }
}

2.2.具體提供的服務,真實的項目中需單獨打包此接口,讓提供,消費雙方方使用
在這裏插入圖片描述
2.3 application啓動類上加暴露服務掃描

@SpringBootApplication
@DubboComponentScan(basePackages = "com.lei.record.service.impl")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2.4實現服務,對外暴露

import com.alibaba.dubbo.config.annotation.Service;
import com.lei.record.service.UserService;

/**
 * @author peichanglei
 * @date 2018/11/02 2:00
 */
@Service(timeout = 3000)
public class UserServiceImpl implements UserService {
    @Override
    public String getUser(Long id) {
        return "provider user " + id;
    }
}

注意:此處使用dubbo的Service註解暴露,不能是spring的

3.consumer

3.1服務提供方配置信息,以後的各種使用,基本都在此處

@Configuration
public class DubboConfiguration {
    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("consumer-test1");
        //經典錯誤導致:dubbo的qos默認端口爲22222,區別於應用端口和dubbo服務端口,如果在一臺機器上啓動超過1個dubbo服務,就會衝突,不管是provider還是consumer
        applicationConfig.setQosPort(22223);
        return applicationConfig;
    }

    @Bean
    public ConsumerConfig consumerConfig() {
        ConsumerConfig consumerConfig = new ConsumerConfig();
        consumerConfig.setTimeout(3000);
        //啓動時檢查,默認爲true,當服務不可用或多個應用存在循環依賴,需關閉檢測,以防啓動失敗,若後面時間中,服務恢復,dubbo的心跳檢查會自動連上
        consumerConfig.setCheck(false);
        return consumerConfig;
    }

    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("multicast://224.5.6.7:1234");
        registryConfig.setClient("curator");
        return registryConfig;
    }
}

3.2 引入定義好的接口jar包,不在贅述
3.3 application啓動類上加引用服務包的掃描

@SpringBootApplication
@DubboComponentScan(basePackages = "com.lei.record.service")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3.4服務消費

@Controller
public class User {
    @Reference
    private UserService userService;

    @RequestMapping(value = "getName", method = {RequestMethod.GET}, produces = "application/json")
    @ResponseBody
    public String getName() {
        String result;
        if (userService != null) {
            String user = userService.getUser(12L);
            System.out.println("調用成功------" + user);
            result = "調用成功------" + user;
        } else {
            System.out.println("調用失敗------");
            result = "調用失敗------";
        }
        return result;
    }
}

import com.alibaba.dubbo.config.annotation.Reference註解可注入可使用的服務

4,至此,一個基於dubbo的生產消費架構搭建完成

頁面訪問顯示調用成功
在這裏插入圖片描述
以上爲簡單調用,更多的配置信息科參考下篇.

5.遇到的問題

1.provider正常啓動了,當consumer啓動時,端口被佔用:錯誤復現如下:

2018-11-02 17:09:50.253  INFO 68880 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-11-02 17:09:50.253  INFO 68880 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2018-11-02 17:09:50.795 ERROR 68880 --- [           main] com.alibaba.dubbo.qos.server.Server      :  [DUBBO] qos-server can not bind localhost:22222, dubbo version: 2.6.2, current host: 192.168.244.1

java.net.BindException: Address already in use: bind
	at sun.nio.ch.Net.bind0(Native Method) ~[na:1.8.0_171]
	at sun.nio.ch.Net.bind(Net.java:433) ~[na:1.8.0_171]
	at sun.nio.ch.Net.bind(Net.java:425) ~[na:1.8.0_171]
	at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) ~[na:1.8.0_171]
	at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:130) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:558) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1358) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:501) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:486) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:1019) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:254) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:366) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
	at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_171]

乍一看錯誤爲端口被佔,條件反射就工程的接口和dubbo服務的接口,更改後發現問題依舊,花了好一會才發現是dubbo的qos端口被佔
在這裏插入圖片描述
,這也是個人的思維死角,只看到了明顯的現象,以爲就是原因,沒有繼續向上翻,耗費了點時間,這裏算是給自己的成長,以後再排除問題就的先仔細閱讀堆棧信息,定位真實有用的信息後,再解決.
去配置中心,改掉即可
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章