spring boot 集成 dubbo starter 實現多註冊中心配置(yaml配置)

 spring boot  集成 dubbo後yml配置如何寫呢,下面就跟我一起看看。

三個module:

  • spring-boot-dubbo-share
  • spring-boot-dubbo-provider
  • spring-boot-dubbo-consumer

首先在spring-boot-dubbo-share模塊中定義個一個接口

【強調】

1.zookeeper的地址,替換成你們自己的,如果沒有則寫 N/A

2.share包需要被provider和consumer模塊引入

3.消費者如果寫了@Reference(url = "dubbo://localhost:28080"),那麼會忽略註冊中心的地址,走直連

package com.share.service;

/**
 * @Author: zj
 * @Date: 2019-09-23
 * @Version 1.0
 */
public interface IDubboPrintService {
    String print(String string);
}

 

完成之後,記得maven點擊clean->package->install,方便後面的provder和consumer模塊引用。

 

然後在spring-boot-dubbo-provider提供服務

首先pom.xml配置如下(注意:把第一步中的share模塊引入進去),我這裏沒寫出來,畢竟你的jar包名跟我的不一樣

 

...... 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <java.version>1.8</java.version>
        <dubbo.version>2.7.1</dubbo.version>
    </properties>

    <dependencies>
        ...
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
        </dependency>
        ...
        ...
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

yaml文件配置:

server:
  port: 8080
  servlet:
    context-path: /

# -------------------- Dubbo 配置 BEGIN --------------------
dubbo:
  #  registry: # 單註冊中心,注意屬性級別:dubbo.registry,注意多註冊中心格式:@Service(registry = {"registry1","registry2","registry3"})
  #    register: false # true(默認), false:表示服務不註冊到註冊中心(只訂閱,直連服務正常),且dubbo-admin不顯示
  #    address: zookeeper://127.0.0.1:2181
  registries: # 多註冊中心,注意屬性級別:dubbo.registries, 不同的方法可以用@Service(registry = {"registry2"}),指定不同的註冊中心
    provider1:
      register: false #默認true, false:表示服務不註冊到註冊中心
      address: zookeeper://55.55.55.82:2181
    provider2:
      register: false
      address: zookeeper://55.55.55.196:2181
    provider3:
      register: false
      address: zookeeper://55.55.55.139:2181
  application:
    name: myProvider
  #    qos-enable: true # 默認值 true, 是否允許在線運維, 配置和查詢服務
  #    qos-port: 22222 # 默認值2222
  #    qos-accept-foreign-ip: false # 默認false , 不允許遠程訪問 telnet
  scan:
    base-packages: com.privder.serivce
  protocol:
    name: dubbo
    port: 28080
  provider:
    retries: 0        # 服務提供者無需重試
    timeout: 6000     # 默認只有1s
# -------------------- Dubbo 配置 END --------------------

目錄結構

注意:開啓EnableDubbo這個註解

package com.privder;

import com.share.util.ServletContextUtil;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Import;


@SpringBootApplication
@EnableDubbo
@Import(ServletContextUtil.class)
public class DubboProviderApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(DubboProviderApplication.class, args);
    }
}
package com.privder.serivce.impl;//package com.cmb.service.dubbo.provider;

import com.share.service.IDubboPrintService;
import org.apache.dubbo.config.annotation.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


// registry指定註冊中心,默認是全部
// @Service(registry = {"provider1","provider3"})
@Service(group = "project-dubbo-provider", version = "1.0.0", registry = {"provider1", "provider2", "provider3"})
@org.springframework.stereotype.Service("DP.PrintService1")
public class IDubboPrintServiceImpl implements IDubboPrintService {
    private static final Logger logger = LoggerFactory.getLogger(IDubboPrintServiceImpl.class);

    @Override
    public String print(String str) {
        logger.info("{}-{}-{}:{}", "project1", "1.0.0", "provider1 provider2 provider3", str);
        return "provider1+provider2+provider3";
    }
}

 

接下來完成spring-boot-dubbo-consumer模塊

pom.xml跟provder類似,記得把dubbo-starter依賴加進去

消費者的yaml配置如下:

server:
  port: 8081
  servlet:
    context-path: /

# -------------------- Dubbo 配置 BEGIN --------------------
dubbo:
  #  registry: # 單註冊中心,注意屬性級別:dubbo.registry
  #    register: false # true(默認), false:表示服務不註冊到註冊中心(只訂閱,直連服務正常),且dubbo-admin不顯示
  #    address: zookeeper://127.0.0.1:2181
  registries: # 多註冊中心
#    consumer1:
#      register: true #默認,false:表示服務不註冊到註冊中心
#      address: N/A
#    consumer2:
#      address: N/A
#    consumer3:
#      address: N/A
    consumer1:
      register: false #表示服務不註冊到註冊中心(此時下面的地址不會使用,因爲comsume走直連)
      address: zookeeper://55.55.55.82:2181
    consumer2:
      register: false #false:表示服務不註冊到註冊中心(此時下面的地址不會使用,因爲comsume走直連)
      address: zookeeper://55.55.55.196:2181
    consumer3:
      register: false #false:表示服務不註冊到註冊中心(此時下面的地址不會使用,因爲comsume走直連)
      address: zookeeper://55.55.55.139:2181
  application:
    name: myConsumer
  scan:
    base-packages: com.consumer.service
  consumer:
    timeout: 3000
    check: false  # 默認true.服務啓動時候檢查是否可用,服務不可用時無法啓動項目, false則不檢查
    retries: 2    # 服務重試次數
# -------------------- Dubbo 配置 END --------------------

目錄結構

package com.consumer;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;


@SpringBootApplication
@EnableDubbo
public class DubboConsumerApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(DubboConsumerApplication.class, args);
    }
}
package com.consumer.service.impl;//package com.cmb.service.consumer;

import com.share.service.IDubboPrintService;
import org.apache.dubbo.config.annotation.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Author: z信息
 * @Date: 2019-11-08
 * @Version 1.0
 */

@org.springframework.stereotype.Service
public class DubboPrintConsumer {

    private static final Logger logger = LoggerFactory.getLogger(DubboPrintConsumer.class);

    // project1 與provider中的group名保持一致
    // @Reference(group = "project1", version = "1.0.0",url = "127.0.0.1:2181")
    // consumer 相當於xml中的 reference id
    // 如果不是直連,去掉 url = "dubbo://localhost:28080"
    @Reference(url = "dubbo://localhost:28080", group = "project-dubbo-provider", version = "1.0.0", registry = {"consumer1", "consumer2", "consumer3"})
    private IDubboPrintService printService1;

    public IDubboPrintService getPrintService1() {
        return printService1;
    }

}

 

package com.consumer.controller;

import com.consumer.service.impl.DubboPrintConsumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Date: 2019-08-29
 * @Version 1.0
 */

@RestController
public class Controller {
    private static final Logger logger = LoggerFactory.getLogger(Controller.class);

    @Autowired
    private DubboPrintConsumer dubboPrintConsumer;

    @GetMapping(value = "/dubboPrint", produces = "application/json; charset=UTF-8")
    public String dubboPrint() {
        String fromProvider= dubboPrintConsumer.getPrintService1().print("consumer1,consumer3");
        logger.info("Call Provider Success: {}", fromProvider);
        return "success";
    }
}

 

配置完成後,啓動應用,訪問:http://localhost:8081/dubboPrint

 

至此基本功能介紹完了。

順便說一句:在我參與的大型app後臺項目中,實際上這種dubbo-starter的yaml配置寫法其實不常用。

一般還是用【xml】dubbo-provider.xmldubbo-comsumer.xml來配置。

原因:簡單直接明瞭

 


下面分享一下我在實際工作中遇到的坑:

  • 同時配置了 XML 和 properties 文件,那麼 properties 中的配置是無效的,只有 XML 沒有配置時,properties 才生效。
  • 實際應用的時候,有些dubbo服務提供者本地是無法使用的,但是無法啓動,那麼將 dubbo check 屬性改 false(默認是true)
  • dubbo:registry 標籤的 register 屬性設置爲 false(默認是true)作用:有時候開發環境就一個註冊中心,本地開發人員都註冊服務,可能導致服務無法正常運行。當 register: false 的時候,就表示服務只訂閱,不註冊; 說簡單點就是服務是以直連的方式調用,繞過註冊中心
  • 如果dubbo調用提示消息傳遞失敗,一般都是你的參數沒有實現序列化
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章