当前位置:   article > 正文

spring boot 集成 dubbo starter 实现多注册中心配置(yaml配置)_registries dubbo-spring-boot-starter dubbo

registries dubbo-spring-boot-starter dubbo

 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"),那么会忽略注册中心的地址,走直连

  1. package com.share.service;
  2. /**
  3. * @Author: zj
  4. * @Date: 2019-09-23
  5. * @Version 1.0
  6. */
  7. public interface IDubboPrintService {
  8. String print(String string);
  9. }

 

完成之后,记得maven点击clean->package->install,方便后面的provder和consumer模块引用。

 

然后在spring-boot-dubbo-provider提供服务

首先pom.xml配置如下(注意:把第一步中的share模块引入进去),我这里没写出来,毕竟你的jar包名跟我的不一样

 

  1. ......
  2. <properties>
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  5. <maven.compiler.source>1.8</maven.compiler.source>
  6. <maven.compiler.target>1.8</maven.compiler.target>
  7. <java.version>1.8</java.version>
  8. <dubbo.version>2.7.1</dubbo.version>
  9. </properties>
  10. <dependencies>
  11. ...
  12. <dependency>
  13. <groupId>org.apache.dubbo</groupId>
  14. <artifactId>dubbo-spring-boot-starter</artifactId>
  15. <version>${dubbo.version}</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.apache.dubbo</groupId>
  19. <artifactId>dubbo</artifactId>
  20. <version>${dubbo.version}</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.apache.dubbo</groupId>
  24. <artifactId>dubbo-dependencies-zookeeper</artifactId>
  25. <version>${dubbo.version}</version>
  26. <type>pom</type>
  27. </dependency>
  28. ...
  29. ...
  30. </dependencies>
  31. <build>
  32. <plugins>
  33. <plugin>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-maven-plugin</artifactId>
  36. </plugin>
  37. </plugins>
  38. </build>

yaml文件配置:

  1. server:
  2. port: 8080
  3. servlet:
  4. context-path: /
  5. # -------------------- Dubbo 配置 BEGIN --------------------
  6. dubbo:
  7. # registry: # 单注册中心,注意属性级别:dubbo.registry,注意多注册中心格式:@Service(registry = {"registry1","registry2","registry3"})
  8. # register: false # true(默认), false:表示服务不注册到注册中心(只订阅,直连服务正常),且dubbo-admin不显示
  9. # address: zookeeper://127.0.0.1:2181
  10. registries: # 多注册中心,注意属性级别:dubbo.registries, 不同的方法可以用@Service(registry = {"registry2"}),指定不同的注册中心
  11. provider1:
  12. register: false #默认true, false:表示服务不注册到注册中心
  13. address: zookeeper://55.55.55.82:2181
  14. provider2:
  15. register: false
  16. address: zookeeper://55.55.55.196:2181
  17. provider3:
  18. register: false
  19. address: zookeeper://55.55.55.139:2181
  20. application:
  21. name: myProvider
  22. # qos-enable: true # 默认值 true, 是否允许在线运维, 配置和查询服务
  23. # qos-port: 22222 # 默认值2222
  24. # qos-accept-foreign-ip: false # 默认false , 不允许远程访问 telnet
  25. scan:
  26. base-packages: com.privder.serivce
  27. protocol:
  28. name: dubbo
  29. port: 28080
  30. provider:
  31. retries: 0 # 服务提供者无需重试
  32. timeout: 6000 # 默认只有1s
  33. # -------------------- Dubbo 配置 END --------------------

目录结构

注意:开启EnableDubbo这个注解

  1. package com.privder;
  2. import com.share.util.ServletContextUtil;
  3. import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
  7. import org.springframework.context.annotation.Import;
  8. @SpringBootApplication
  9. @EnableDubbo
  10. @Import(ServletContextUtil.class)
  11. public class DubboProviderApplication extends SpringBootServletInitializer {
  12. public static void main(String[] args) {
  13. SpringApplication.run(DubboProviderApplication.class, args);
  14. }
  15. }
  1. package com.privder.serivce.impl;//package com.cmb.service.dubbo.provider;
  2. import com.share.service.IDubboPrintService;
  3. import org.apache.dubbo.config.annotation.Service;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. // registry指定注册中心,默认是全部
  7. // @Service(registry = {"provider1","provider3"})
  8. @Service(group = "project-dubbo-provider", version = "1.0.0", registry = {"provider1", "provider2", "provider3"})
  9. @org.springframework.stereotype.Service("DP.PrintService1")
  10. public class IDubboPrintServiceImpl implements IDubboPrintService {
  11. private static final Logger logger = LoggerFactory.getLogger(IDubboPrintServiceImpl.class);
  12. @Override
  13. public String print(String str) {
  14. logger.info("{}-{}-{}:{}", "project1", "1.0.0", "provider1 provider2 provider3", str);
  15. return "provider1+provider2+provider3";
  16. }
  17. }

 

接下来完成spring-boot-dubbo-consumer模块

pom.xml跟provder类似,记得把dubbo-starter依赖加进去

消费者的yaml配置如下:

  1. server:
  2. port: 8081
  3. servlet:
  4. context-path: /
  5. # -------------------- Dubbo 配置 BEGIN --------------------
  6. dubbo:
  7. # registry: # 单注册中心,注意属性级别:dubbo.registry
  8. # register: false # true(默认), false:表示服务不注册到注册中心(只订阅,直连服务正常),且dubbo-admin不显示
  9. # address: zookeeper://127.0.0.1:2181
  10. registries: # 多注册中心
  11. # consumer1:
  12. # register: true #默认,false:表示服务不注册到注册中心
  13. # address: N/A
  14. # consumer2:
  15. # address: N/A
  16. # consumer3:
  17. # address: N/A
  18. consumer1:
  19. register: false #表示服务不注册到注册中心(此时下面的地址不会使用,因为comsume走直连)
  20. address: zookeeper://55.55.55.82:2181
  21. consumer2:
  22. register: false #false:表示服务不注册到注册中心(此时下面的地址不会使用,因为comsume走直连)
  23. address: zookeeper://55.55.55.196:2181
  24. consumer3:
  25. register: false #false:表示服务不注册到注册中心(此时下面的地址不会使用,因为comsume走直连)
  26. address: zookeeper://55.55.55.139:2181
  27. application:
  28. name: myConsumer
  29. scan:
  30. base-packages: com.consumer.service
  31. consumer:
  32. timeout: 3000
  33. check: false # 默认true.服务启动时候检查是否可用,服务不可用时无法启动项目, false则不检查
  34. retries: 2 # 服务重试次数
  35. # -------------------- Dubbo 配置 END --------------------

目录结构

  1. package com.consumer;
  2. import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
  6. @SpringBootApplication
  7. @EnableDubbo
  8. public class DubboConsumerApplication extends SpringBootServletInitializer {
  9. public static void main(String[] args) {
  10. SpringApplication.run(DubboConsumerApplication.class, args);
  11. }
  12. }
  1. package com.consumer.service.impl;//package com.cmb.service.consumer;
  2. import com.share.service.IDubboPrintService;
  3. import org.apache.dubbo.config.annotation.Reference;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. /**
  7. * @Author: z信息
  8. * @Date: 2019-11-08
  9. * @Version 1.0
  10. */
  11. @org.springframework.stereotype.Service
  12. public class DubboPrintConsumer {
  13. private static final Logger logger = LoggerFactory.getLogger(DubboPrintConsumer.class);
  14. // project1 与provider中的group名保持一致
  15. // @Reference(group = "project1", version = "1.0.0",url = "127.0.0.1:2181")
  16. // consumer 相当于xml中的 reference id
  17. // 如果不是直连,去掉 url = "dubbo://localhost:28080"
  18. @Reference(url = "dubbo://localhost:28080", group = "project-dubbo-provider", version = "1.0.0", registry = {"consumer1", "consumer2", "consumer3"})
  19. private IDubboPrintService printService1;
  20. public IDubboPrintService getPrintService1() {
  21. return printService1;
  22. }
  23. }

 

  1. package com.consumer.controller;
  2. import com.consumer.service.impl.DubboPrintConsumer;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. /**
  9. * @Date: 2019-08-29
  10. * @Version 1.0
  11. */
  12. @RestController
  13. public class Controller {
  14. private static final Logger logger = LoggerFactory.getLogger(Controller.class);
  15. @Autowired
  16. private DubboPrintConsumer dubboPrintConsumer;
  17. @GetMapping(value = "/dubboPrint", produces = "application/json; charset=UTF-8")
  18. public String dubboPrint() {
  19. String fromProvider= dubboPrintConsumer.getPrintService1().print("consumer1,consumer3");
  20. logger.info("Call Provider Success: {}", fromProvider);
  21. return "success";
  22. }
  23. }

 

配置完成后,启动应用,访问: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调用提示消息传递失败,一般都是你的参数没有实现序列化
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/166043
推荐阅读
相关标签
  

闽ICP备14008679号