Dubbo+nacos+springboot

说明:Dubbo不需要搭建单独的dubbo服务,服务提供方和服务消费方引入dubbo相关jar包和启动注册中心(nacos)即可。

版本 dubbo:3.0.0,nacos:2.0.0

 

1、启动nacos server

  https://www.cnblogs.com/yangyongjie/p/15188286.html

 

2、服务提供方

  1)引入依赖

    <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.0.0</version>
        </dependency>

  2)application.properties配置

server.port=8080
# dubbo
dubbo.application.name=dubbo-provider
dubbo.protocol.name=dubbo
dubbo.protocol.port=10001
# Nacos registry address
dubbo.registry.address=nacos://127.0.0.1:8848

  3)启动类上添加 @EnableDubbo

  4)对外提供的服务实现类添加 @DubboService

 

  版本2:

  参考:Dubbo 外部化配置 、 nacos dubbo

  1)引入依赖

        <!--The all in one project of dubbo-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>3.0.0</version>
        </dependency>
        <!--The Nacos registry module of Dubbo project-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>3.0.0</version>
        </dependency>
      <!--  <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.0.0</version>
        </dependency>-->

 

  2)resource目录下新建 dubbo.properties文件

## application
dubbo.application.name = dubbo-provider

## Nacos registry address
dubbo.registry.address = nacos://127.0.0.1:8848
##如果要使用自己创建的命名空间可以使用下面2种方式
#dubbo.registry.address = nacos://127.0.0.1:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
#dubbo.registry.parameters.namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932

## Dubbo Protocol
dubbo.protocol.name = dubbo
dubbo.protocol.port = 8889
# Provider @Service version
demo.service.version=1.0.0

 

  3)启动类上添加

/**
 * 注解 @EnableDubbo 激活 Dubbo注解驱动以及外部化配置,其scanBasePackages属性扫描指定Java包,
 * 将所有标注 @DubboService 的服务接口实现类暴露为 Spring Bean,随即被导出 Dubbo 服务
 */
@EnableDubbo(scanBasePackages = "com.yang.dubbo.provider.service")
@PropertySource("classpath:dubbo.properties")
@SpringBootApplication
public class DubboProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboProviderApplication.class, args);
    }

}

  4)对外提供的服务实现类添加 @DubboService

 

  说明:注解 @EnableDubbo 激活 Dubbo 注解驱动以及外部化配置,其 scanBasePackages 属性扫描指定 Java 包,将所有标注 @DubboService 的服务接口实现类暴露为 Spring Bean,随即被导出 Dubbo 服务

  @PropertySource 是 Spring Framework 3.1 引入的标准导入属性配置资源注解,它将为 Dubbo 提供外部化配置

 

3、服务消费方

  1)添加依赖如上

  2)application.properties配置

server.port=8081
dubbo.application.name=dubbo-consumer
dubbo.consumer.timeout=5000
dubbo.registry.address=nacos://127.0.0.1:8848

  3)启动类上添加 @EnableDubbo

  4)引入服务提供的jar包

    @DubboReference
    private TestService testService;

  

  版本2: 

  1)resource目录下新建 dubbo.properties文件:

## Dubbo Application info
dubbo.application.name = dubbo-consumer-gateway

## Nacos registry address
dubbo.registry.address = nacos://127.0.0.1:8848
##如果要使用自己创建的命名空间可以使用下面2种方式
#dubbo.registry.address = nacos://127.0.0.1:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
#dubbo.registry.parameters.namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932

#qos在线运维
dubbo.application.qosEnable=false
dubbo.application.qosPort=22222

  2)启动类上新增以下注解

@EnableDubbo
@PropertySource(value = "classpath:/dubbo.properties")

  3)调用dubbo接口(泛化调用)

 ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
        // serviceKey
        referenceConfig.setInterface(gatewayMethodPo.getServiceKey());
        referenceConfig.setGeneric("true");
        ReferenceConfigCache cache = ReferenceConfigCache.getCache();
        // cache.get方法中会缓存 Reference对象,并且调用ReferenceConfig.get方法启动ReferenceConfig
        GenericService genericService = cache.get(referenceConfig);
        // 注意! Cache会持有ReferenceConfig,不要在外部再调用ReferenceConfig的destroy方法,导致Cache内的ReferenceConfig失效!
        Map<String, Object> paramMap = gatewayContext.getDataMap();
        try {
            Object result = genericService.$invoke(gatewayMethodPo.getMethodName(), new String[]{"java.util.Map"}, new Object[]{paramMap});
            handleResponse.info(result);
        } catch (GatewayException e) {
            LOGGER.error("error:" + e.getMessage(), e);
            handleResponse.info(e.getErrorCode(), e.getErrorMessage());
            return false;
        }

 

 

 

4、dubbo泛化调用:

  不用引入服务提供方的jar包,可通过GenericService 调用所有服务实现

  泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 GenericService 调用所有服务实现。

 

  1)通过Spring使用泛化调用

@Configuration
public class ReferenceConfiguration {

    @Bean
    public GenericService testServiceReference() {
        ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setInterface("com.yang.dubbo.provider.service.TestService");
        referenceConfig.setGeneric("true");
        GenericService genericService = referenceConfig.get();
        return genericService;
    }

}

    在Java代码中装配testServiceReference

    @Autowired
    private GenericService testServiceReference;

    @Test
    void genericTest() {
        Object result = testServiceReference.$invoke("test", null, null);
        System.out.println(String.valueOf(result));
    }

 

   2)通过API方式泛化调用

        ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
        // serviceKey
        referenceConfig.setInterface(gatewayMethodPo.getServiceKey());
        referenceConfig.setGeneric("true");
        ReferenceConfigCache cache = ReferenceConfigCache.getCache();
        // cache.get方法中会缓存 Reference对象,并且调用ReferenceConfig.get方法启动ReferenceConfig
        GenericService genericService = cache.get(referenceConfig);
        // 注意! Cache会持有ReferenceConfig,不要在外部再调用ReferenceConfig的destroy方法,导致Cache内的ReferenceConfig失效!
        try {
            // 参数为String的情况
            // Object result = genericService.$invoke("test", new String[]{"java.lang.String"}, new Object[]{"yangyongjie"});
            // 参数为Map的情况
            // Map<String, Object> paramMap = gatewayContext.getDataMap();
            // Object result = genericService.$invoke(gatewayMethodPo.getMethodName(), new String[]{"java.util.Map"}, new Object[]{paramMap});
            // 参数类型为POJO的情况
            // 用Map表示POJO参数,如果返回值为POJO也将自动转成Map
            Map<String, Object> person = new HashMap<String, Object>(4);
            person.put("name", "xxx");
            person.put("password", "yyy");
            // 类型为接口provider的参数pojo的全路径
            Object result = genericService.$invoke(gatewayMethodPo.getMethodName(), new String[]{"com.yang.dubbo.provider.pojo.Person"}, new Object[]{person});
        } catch (GatewayException e) {
            LOGGER.error("error:" + e.getMessage(), e);
        }

 

 

 

5、使用zk作为注册配置中心

  下载zk:https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz

     

 

 

附录

  Dubbo 融合 Nacos 成为注册中心:https://nacos.io/zh-cn/docs/use-nacos-with-dubbo.html 

 

 

END.

posted @ 2021-08-16 18:29  杨岂  阅读(898)  评论(0编辑  收藏  举报