• SpringCloud、Nacos与Dubbo集成


    前言

    在日常的开发过程中,都开始从传统架构项目转化为微服务架构模式,把整体项目按照功能模块或者业务等做拆分,形成很多个服务,那么服务与服务之间就会产生调用关系。

    常见的远程调用有两种,一种是Feign,另一种是Rpc。在本文介绍Dubbo Rpc与Alibaba SpringCloud、Nacos的集成。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、创建提供方项目

    项目命名为server-dubbo-provider

    1. 引入pom依赖

      <dependencies>
        <!-- 提供方Api定义 -->
          <dependency>
              <groupId>com.lee</groupId>
              <artifactId>server-dubbo-provider-api</artifactId>
              <version>1.0.0</version>
          </dependency>
          <!--阿里巴巴 nacos 服务发现-->
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
          </dependency>
          <!-- cloud-dubbo依赖 -->
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-dubbo</artifactId>
              <version>2.1.1.RELEASE</version>
          </dependency>
      </dependencies>
      
    2. 创建bootstrap.yml文件

      server:
          port: 10201
      
      spring:
          application:
              name: server-dubbo-provider #项目名称
          cloud:
              nacos:
                  discovery:
                      namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 # 命名空间id
                      server-addr: 192.168.0.130:8848  #注册中心地址
          main:
              allow-bean-definition-overriding: true
          mvc:
              throw-exception-if-no-handler-found: true
      
      # Dubbo服务配置
      dubbo:
          scan:
              base-packages: com.lee.provider.service #扫描包范围
          protocol:
              name: dubbo # 遵循的协议
              port: 19003 #dubbo服务端口
          registry:
              address: spring-cloud://localhost # 将dubbo挂载到注册中心,和<dubbo-registry address='zk地址'>一样
      
      management:
          endpoints:
              web:
                  exposure:
                      include: '*'
      

      上述配置说明

      1. spring.cloud.nacos.discovery.namespace:命名空间id
      2. spring.cloud.nacos.discovery.server-addr :注册中心地址
      3. dubbo.scan.base-packages:扫描包范围
      4. dubbo.protocol.name:遵循的协议
      5. dubbo.protocol.port:dubbo服务端口
      6. dubbo.registry.address=将dubbo挂载到注册中心,和<dubbo-registry address='zk地址'>一样
      
    3. 在server-dubbo-provider-api项目中创建服务接口

      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestParam;
      
      @RequestMapping("/dubboProvider")
      public interface IDubboProviderService {
      
          /**
           * 获取信息
           * @param info
           * @return
           */
          @GetMapping("/getRemoteDubboInfo")
          String getRemoteDubboInfo(@RequestParam(value = "info") String info);
      }
      
    4. 在server-dubbo-provider中实现IDubboProviderService接口
      server-dubbo-provider-api模块已引入在server-dubbo-provider中

      @org.apache.dubbo.config.annotation.Service
      public class DubboProviderServiceImpl implements IDubboProviderService {
          public String getRemoteDubboInfo(String info) {
              return "Dubbo Provider Response :"+info;
          }
      }
      

      Service注解一定要使用dubbo.config包中的。

    二、创建消费方项目

    项目命名为server-dubbo-consumer

    1. 引入pom依赖

       <!-- 引入provider-api -->
      <dependency>
           <groupId>com.lee</groupId>
           <artifactId>server-dubbo-provider-api</artifactId>
           <version>1.0.0</version>
       </dependency>
       <!--nacos config配置中心依赖-->
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
       </dependency>
       <!-- feign依赖 -->
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-openfeign</artifactId>
           <version>2.2.5.RELEASE</version>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
           <exclusions>
               <exclusion>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-starter-tomcat</artifactId>
               </exclusion>
           </exclusions>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-undertow</artifactId>
       </dependency>
       <!--阿里巴巴 nacos 服务发现-->
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
       </dependency>
       <!-- cloud-dubbo依赖 -->
       <dependency>
           <groupId>com.alibaba.cloud</groupId>
           <artifactId>spring-cloud-starter-dubbo</artifactId>
           <version>2.1.1.RELEASE</version>
       </dependency>
      
    2. 创建bootstrap.yml文件

      server:
          port: 10301
      
      spring:
          application:
              name: server-dubbo-consumer # 项目名称
          cloud:
              nacos:
                  discovery:
                      namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 # 命名空间
                      server-addr: 192.168.0.130:8848 #注册中心地址
                  config:
                      namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 # 命名空间
                      server-addr: 192.168.0.130:8848 #配置中心地址
          main:
              allow-bean-definition-overriding: true
          mvc:
              throw-exception-if-no-handler-found: true
      # Dubbo服务配置
      dubbo:
          protocol:
              name: dubbo # 遵循的协议
              port: 18002 # dubbo端口号,保持唯一
          registry:
              address: spring-cloud://localhost # 将dubbo挂载到注册中心
          cloud:
              subscribed-services: server-dubbo-provider #订阅的服务,可有多个,如果有多个,以逗号隔开。与Dubbo一样
      management:
          endpoints:
              web:
                  exposure:
                      include: '*'
      

      上述配置说明:

      dubbo.cloud.subscribed-services:订阅的服务,可有多个,如果有多个,以逗号隔开。与Dubbo一样
      
    3. 编写controller调用

      import com.lee.consumer.feign.ProviderFeign;
      import com.lee.service.IDubboProviderService;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.beans.factory.annotation.Value;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestParam;
      import org.springframework.web.bind.annotation.RestController;
      
      @RestController
      @RequestMapping("/consumer")
      public class ConsumerController {
      
          @Autowired
          private ProviderFeign providerFeign ;
          @Value("${consumer.name}")
          private String consumerName ;
      	@Value("${age}")
          private String age ;
          @org.apache.dubbo.config.annotation.Reference
          private IDubboProviderService iDubboProviderService ;
      
          /**
           * dubbo 远程调用
           * @param info
           * @return
           */
          @GetMapping("/getDubboRemoteInfo")
          public String getDubboRemoteInfo(@RequestParam("info") String info){
      
              return iDubboProviderService.getRemoteDubboInfo(info+",消费者名称:"+consumerName+",年龄:"+age);
          }
      
          /**
           * feign 远程调用
           * @param info
           * @return
           */
          @GetMapping("/getFeignRemoteInfo")
          public String getFeignRemoteInfo(@RequestParam("info") String info){
      
              return providerFeign.getRemoteFeignInfo(info+",消费者名称:"+consumerName);
          }
      }
      

      上述配置描述

      1. @Value("${consumer.name}")表示从nacos上获取配置
      2. @org.apache.dubbo.config.annotation.Reference:生成代理对象,就像调用本地方法一样调用远程业务方法	
      3. 配置文件读取规则:
      spring.cloud.nacos.config.prefix:为Data ID,默认为服务名称 server-dubbo-consumer
      spring.cloud.nacos.config.file-extension:默认为.properties
      spring.cloud.nacos.config.group:默认为DEFAULT_GROUP
      如果在多环境配置下可以使用spring.profile.active=online来区分加载生产或者测试环境配置
      完整的规则为${spring.cloud.nacos.config.prefix}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
      
    4. 如果有其他的一些公共配置或者比较特殊配置加载,可以使用 ext-config来实现

      nacos:
        discovery:
            namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 # 命名空间
            server-addr: 192.168.0.130:8848 #注册中心地址
        config:
            namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 # 命名空间
            server-addr: 192.168.0.130:8848 #配置中心地址
            ext-config:
                - data-id: test.properties
                  group: DEFAULT_GROUP
                  refresh: true
      
    5. 配置中心详情
      以项目名称命名的配置文件:server-dubbo-consumer.properties
      在这里插入图片描述
      以ext-config:扩展的配置文件test.properties详情:
      在这里插入图片描述

    6. 访问接口
      http://localhost:10301/consumer/getDubboRemoteInfo?info=消费者消费
      在这里插入图片描述
      可以看到consumer.name属性不会被ext-config扩展配置覆盖,而年龄这个属性只在扩展配置中存在,所以ext-config优先级小于第一种配置规则。

    项目地址:spring-cloud-nacos

    充满鲜花的世界到底在哪里
  • 相关阅读:
    Mac eclipse导入项目中文乱码问题解决
    初识Freemarker
    Mac 导入maven项目详解
    Mac iTerm2使用总结
    HTML学习笔记——标签
    仿QQ大战—界面篇
    Java之类的构造器(反射)
    JAVA之IO流(字符流)
    JAVA之IO流(字节流)
    仿QQ大战—服务器的搭建(ServerSocket)
  • 原文地址:https://www.cnblogs.com/aliases/p/14538634.html
Copyright © 2020-2023  润新知