05.`dubbo`的简单使用

1. 官方文档

dubbo 官方文档

dubbo github 文档

2. 使用
  1. dubbo依赖

    1. 对于提供者,只需要依赖spring-cloud-starter-dubbo即可

      <!-- dubbo -->
      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-dubbo</artifactId>
      </dependency>        
      
    2. 对于消费者,还需要依赖spring-boot-starter-actuator

      <!-- 健康监测 -->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
      
      <!-- dubbo -->
      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-dubbo</artifactId>
      </dependency> 
      
    3. 无论是消费者还是提供者,都需要注册,消费者才可以将提供者的信息拉取到本地

      <!-- nacos 注册中心 -->
      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      </dependency>
      
    4. 父依赖

      <properties>
          <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
          <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
      </properties>
      
      <dependencyManagement>
          <dependencies>
              <!-- spring-cloud-dependencies -->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-dependencies</artifactId>
                  <version>${spring-cloud.version}</version>
                  <type>pom</type>
                  <scope>import</scope>
              </dependency>
      
              <!-- spring-cloud-alibaba-dependencies -->
              <dependency>
                  <groupId>com.alibaba.cloud</groupId>
                  <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                  <version>${spring-cloud-alibaba.version}</version>
                  <type>pom</type>
                  <scope>import</scope>
              </dependency>
          </dependencies>
      </dependencyManagement>
      
    5. spring-boot-starter-parentspring-cloud-dependenciesspring-cloud-alibaba-dependencies的版本要参考ali推荐的毕业版本,否则,dubbo很有可能跑不起来。参考依赖

  2. 提供者的配置文件以及启动类

    1. 主配置文件application.yml

      server:
        # 应用的端口号
        port: 8181
        
      spring:
        profiles:
          # 将 application-dubbo.yml 注册,使配置文件生效,有多个文件用 , 隔开
          active: dubbo
        application:
          # 注册到 nacos 注册中心的服务名
          name: movies-image
        cloud:
          nacos:
            discovery:
              enabled: true
              # nacos 注册中心的地址
              server-addr: 120.25.207.44:8848
              cluster-name: ${spring.application.name}
      
      • nacos的相关配置也可以抽取出去解耦
    2. dubbo的配置文件application-dubbo.yml,可以放到主配置文件中

      dubbo:
        scan:
          # 必须放在最前面
          # dubbo 服务扫描基准包
          # 一定是使用了 dubbo 注解的包
          base-packages: com.sheng.dubbo.servies.impl
        protocol:
          # dubbo 协议、http 协议、Hessian 协议、thrift 协议、RMI
          # 使用 dubbo 协议
          name: dubbo
          # dubbo 协议端口
          # -1 表示自增端口,从 20880 开始
          port: -1
        registry:
          # 注册中心的地址
          # 注册中心://注册中心ip:注册中心端口
          address: nacos://120.25.207.44:8848
        cloud:
          # 订阅的服务,默认为 * 订阅所有服务,不写上会一直有 warn 警告,而且耗费资源
          subscribed-services:
      
    3. 启动类可以使用@EnableDubbo注解标记,有可能出错

      import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
      
  3. 消费者的配置文件

    1. 主配置文件application.yml

      server:
        port: 8184
        
      spring:
        profiles:
          active: dubbo
        application:
          name: web-service
        cloud:
          nacos:
            discovery:
              enabled: true
              server-addr: 120.25.207.44:8848
              cluster-name: ${spring.application.name}
      
    2. dubbo配置文件application-dubbo.yml

      dubbo:
        # 必须写在最前面,dubbo 服务扫描的基准包
        scan:
          # 一定要写使用了 dubbo 相关注解的包
          base-packages: com.sheng.dubbo.controller
        protocol:
          name: dubbo
          port: -1
        registry:
          address: nacos://120.25.207.44:8848
          # 禁止注册到注册中心,只订阅
          register: false
        cloud:
          # 订阅的服务,一般为注册到注册中心的服务名
          # 多个服务之间用 , 隔开
          subscribed-services: movies-image,movies-service,movies-type
      
    3. 启动类可以使用@EnableDubbo注解标记,有可能出错

      import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
      
  4. dubbo 的使用

    1. 提供者

      注意:@Service,使用的是org.apache.dubbo.config.annotation.Service;

      import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
      import com.sheng.dubbo.common.StatusCodeEnum;
      import com.sheng.dubbo.commons.domain.dto.ImageDto;
      import com.sheng.dubbo.commons.service.ImageService;
      import com.sheng.dubbo.domain.entity.Image;
      import com.sheng.dubbo.mapper.ImageMapper;
      import com.sheng.dubbo.utils.CopyBeanUtils;
      import com.sheng.dubbo.utils.JudgeEmptyUtils;
      import org.apache.dubbo.config.annotation.Service;
      
      import javax.annotation.Resource;
      import java.util.List;
      
      /**
       * 说明:@Service 是 org.apache.dubbo.config.annotation.Service;
       *
       * @author sheng
       */
      @Service
      public class ImageServiceImpl implements ImageService {
          @Resource
          private ImageMapper imageMapper;
      
          @Override
          public List<ImageDto> findImageByFilmId(String id) throws Exception {
              int filmId = Integer.parseInt(id);
              // 判断 id 是否正常
              JudgeEmptyUtils.judge(filmId < 1, StatusCodeEnum.PARAMS_IS_INVALID);
              // 拼接查询条件
              QueryWrapper<Image> wrapper = new QueryWrapper<>();
              wrapper.eq(Image.COL_FILM_ID, filmId);
              List<Image> images = imageMapper.selectList(wrapper);
              // 转化为 dto
              return CopyBeanUtils.copy(images, ImageDto.class);
          }
      }
      
    2. 消费者的调用

      注意:@Reference,使用的是org.apache.dubbo.config.annotation.Reference;

      import com.sheng.dubbo.common.ResultBean;
      import com.sheng.dubbo.common.StatusCodeEnum;
      import com.sheng.dubbo.commons.domain.dto.FilmDto;
      import com.sheng.dubbo.commons.domain.dto.ImageDto;
      import com.sheng.dubbo.commons.domain.dto.TypeDto;
      import com.sheng.dubbo.commons.service.FilmService;
      import com.sheng.dubbo.commons.service.ImageService;
      import com.sheng.dubbo.commons.service.TypeService;
      import com.sheng.dubbo.domain.vo.HomeVo;
      import org.apache.dubbo.config.annotation.Reference;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      import java.util.List;
      
      /**
       * 说明:@Reference 是 org.apache.dubbo.config.annotation.Reference;
       *
       * @author sheng
       */
      @RestController
      @RequestMapping("/test")
      public class TestController {
          @Reference
          private FilmService filmService;
          @Reference
          private ImageService imageService;
          @Reference
          private TypeService typeService;
      
          @GetMapping("/test")
          public ResultBean<HomeVo> test() throws Exception {
              // 查询
              List<FilmDto> filmDtoList = filmService.findFilmByTypeId("1");
              List<ImageDto> imageDtoList = imageService.findImageByFilmId("1");
              List<TypeDto> typeDtoList = typeService.findAll();
              // 封装信息
              HomeVo homeVo = new HomeVo();
              homeVo.setFilmDtoList(filmDtoList);
              homeVo.setImageDtoList(imageDtoList);
              homeVo.setTypeDtoList(typeDtoList);
              return ResultBean.success(StatusCodeEnum.SUCCESS, homeVo);
          }
      }        
      
    3. 查看 nacos 注册中心是否成功注册,是够能成功调用

      nacos

      访问

  5. dubbo-demo 源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值