开发者社区 > 云原生 > 正文

Dubbo 怎么作为 Spring Cloud 服务调用?

Dubbo 怎么作为 Spring Cloud 服务调用?

展开
收起
1358896759097293 2021-03-17 17:20:38 1125 0
2 条回答
写回答
取消 提交回答
  • 45271990@qq.com

    Dubbo 作为 Spring Cloud 服务调用 默认情况,Spring Cloud Open Feign 以及 @LoadBalancedRestTemplate 作 为 Spring Cloud 的两种服务调用方式。Dubbo Spring Cloud 为其提供了第三种选择, 即 Dubbo 服务将作为 Spring Cloud 服务调用的同等公民出现,应用可通过 Apache Dubbo 注解 @Service 和 @Reference 暴露和引用 Dubbo 服务,实现服务间多种协 议的通讯。同时,也可以利用 Dubbo 泛化接口轻松实现服务网关。

    2021-03-18 23:12:45
    赞同 展开评论 打赏
  • 下一站是幸福

    快速集成

    先说明, 大多数情况都存在一个服务节点即是Consumer 又是 Client
    

    maven配置

    pom文件中引入如下依赖

    <properties>
        <spring.boot.version>2.2.4.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR2</spring.cloud.version>
        <spring.cloud.alibaba.version>2.2.0.RELEASE</spring.cloud.alibaba.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!--spring cloud-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>
    <dependencies>
            <!--spring cloud-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>
    

    application.yaml 配置

    spring: application: name: barm-archetypes cloud: nacos: # 注册中心 discovery: server-addr: 127.0.0.1:8848

    dubbo: scan: base-packages: com.barm.archetypes.core.provider # Dubbo 服务实现类的扫描基准包 protocols: # 服务暴露的协议配置 dubbo: name: dubbo # 选用 dubbo 协议 port: -1 # 协议端口, -1 表示从 20880 开始自增端口 registry: # Dubbo 服务注册中心配置, 对应 RegistryConfig 类 address: spring-cloud://127.0.0.1:8848 cloud: subscribed-services: '' # 订阅应用列表, 默认为 * 订阅所有应用 provider: # Dubbo 服务端配置 cluster: failfast # 集群方式,可选: failover/failfast/failsafe/failback/forking retries: 0 # 远程服务调用重试次数, 不包括第一次调用, 不需要重试请设为0 timeout: 600000 # 远程服务调用超时时间(毫秒) token: true # 令牌验证, 为空表示不开启, 如果为true, 表示随机生成动态令牌 dynamic: true # 服务是否动态注册, 如果设为false, 注册后将显示后disable状态, 需人工启用, 并且服务提供者停止时, 也不会自动取消册, 需人工禁用. delay: -1 # 延迟注册服务时间(毫秒)- , 设为-1时, 表示延迟到Spring容器初始化完成时暴露服务 version: 1.0.0 # 服务版本 filter: -exception # 服务提供方远程调用过程拦截器名称, 多个名称用逗号分隔 consumer: # Dubbo 消费端配置 check: false validation: true # 是否启用JSR303标准注解验证, 如果启用, 将对方法参数上的注解进行校验 version: 1.0.0 # 默认版本 server: port: 8083

    spring.cloud.nacos : 注册中心配置, 默认使用 spring.applicatrion.name 作为注册服务名
    dubbo配置项
        scan.base-packages: Dubbo 服务实现类的扫描基准包
        protocols: 服务暴露的协议配置
        registry.address: Dubbo 服务注册中心配置
        cloud.subscribed-services: 订阅的服务列表, 默认为 * 订阅所有应用
        provider: Dubbo 服务端配置, 详情见 dubbo官方文档>schema配置参考手册> dubbo:provider
        consumer: Dubbo 消费端配置dubbo官方文档>schema配置参考手册> dubbo:consumer
    

    provider端代码端代码

    api项目目录
    
    provider
    

    package com.barm.archetypes.api.domain.dto.result;

    import lombok.Data;

    import java.io.Serializable; import java.time.LocalDateTime;

    /** * @author Allen * @version 1.0.0 * @description 用户主表DTO * @create 2020/3/6 21:27 * @e-mail allenalan@139.com * @copyright 版权所有 (C) 2020 allennote / @Data public class UserMainDTO implements Serializable { private static final long serialVersionUID = 1L; /* * 主键 */ private Long id;

    /**
     * 用户ID
     */
    private Long userId;
    
    /**
     * 用户名
     */
    private String username;
    
    /**
     * 密码
     */
    private String password;
    
    /**
     * 昵称
     */
    private String nickname;
    
    /**
     * 创建人
     */
    private String createBy;
    
    /**
     * 修改人
     */
    private String modifyBy;
    
    /**
     * 创建时间
     */
    private LocalDateTime gmtCreate;
    
    /**
     * 修改时间
     */
    private LocalDateTime gmtModify;
    
    /**
     * 版本号
     */
    private Long version;
    
    /**
     * 逻辑删 0 未删除 1 已删除
     */
    private Boolean deleted;
    
    /**
     * 冗余
     */
    private String extend;
    

    }

    package com.barm.archetypes.api.domain.dto.spec;

    import com.barm.common.domain.dto.spec.PageSpec; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString;

    import javax.validation.constraints.NotNull; import java.time.LocalDateTime;

    /** * @author Allen * @version 1.0.0 * @description UserMainPageSpec * @create 2020/3/16 13:59 * @e-mail allenalan@139.com * @copyright 版权所有 (C) 2020 allennote */ @Data @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) public class UserMainSpec extends PageSpec {

    private static final long serialVersionUID = 1L;
    
    /** 昵称*/
    private String nickname;
    /** 用户名*/
    @NotNull(message = "用户名不能为空")
    private String username;
    /** 修改时间*/
    private LocalDateTime gmtModify;
    

    }

    package com.barm.archetypes.api.provider;

    import com.barm.archetypes.api.domain.dto.result.UserMainDTO; import com.barm.archetypes.api.domain.dto.spec.UserMainSpec; import com.github.pagehelper.PageInfo;

    public interface UserMainProvider {

    PageInfo<UserMainDTO> page(UserMainSpec spec);
    

    }

    服务实现类目录
    
    providerimpl
    

    package com.barm.archetypes.core.provider.impl;

    import com.barm.archetypes.api.domain.dto.result.UserMainDTO; import com.barm.archetypes.api.domain.dto.spec.UserMainSpec; import com.barm.archetypes.api.provider.UserMainProvider; import com.barm.archetypes.core.domain.assembler.UserMainMapping; import com.barm.archetypes.data.domain.db.UserMainDO; import com.barm.archetypes.data.domain.mapper.UserMainDOMapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.apache.dubbo.config.annotation.Service; import org.springframework.stereotype.Component;

    import javax.annotation.Resource; import java.util.List;

    /** * @author Allen * @version 1.0.0 * @description UseMainProviderImpl * @create 2020/3/16 14:32 * @e-mail allenalan@139.com * @copyright 版权所有 (C) 2020 allennote */ @Service @Component public class UserMainProviderImpl implements UserMainProvider {

    @Resource
    private UserMainDOMapper userMainDOMapper;
    
    @Resource
    private UserMainMapping userMainMapping;
    
    @Override
    public PageInfo<UserMainDTO> page(UserMainSpec spec) {
        PageHelper.startPage(spec.getPage(), spec.getPageSize());
        UserMainDO params = userMainMapping.specToDO(spec);
        List<UserMainDO> list = userMainDOMapper.findByAll(params);
        return new PageInfo(userMainMapping.toDTO(list));
    }
    

    }

    持久层代码自行脑补吧. 嘿嘿嘿 consumer端代码

    我们可以通过上面的配置生出一个项目脚手架, 通过脚手架构建一个消费服务的项目,参考以前的文章
    随手写个SpringBoot的Maven脚手架
    
    引入provider-api依赖
    

    com.barm.archetypes archetypes-api 1.0.1-RELEASE

    application.yaml 配置
    

    cloud: subscribed-services: barm-archetypes version: 1.0.0

    consumer项目路径
    

    consumer

    package com.barm.order.core.facade;

    import com.barm.archetypes.api.domain.dto.result.UserMainDTO; import com.barm.archetypes.api.domain.dto.spec.UserMainSpec; import com.github.pagehelper.PageInfo;

    public interface UserMainService { PageInfo page(UserMainSpec spec); }

    package com.barm.order.core.facade.impl;

    import com.barm.archetypes.api.domain.dto.result.UserMainDTO; import com.barm.archetypes.api.domain.dto.spec.UserMainSpec; import com.barm.archetypes.api.provider.UserMainProvider; import com.barm.order.core.facade.UserMainService; import com.github.pagehelper.PageInfo; import org.apache.dubbo.config.annotation.Reference; import org.springframework.stereotype.Service;

    /** * @author Allen * @version 1.0.0 * @description UserMainServiceImpl * @create 2020/3/16 21:15 * @e-mail allenalan@139.com * @copyright 版权所有 (C) 2020 allennote */ @Service public class UserMainServiceImpl implements UserMainService {

    @Reference
    private UserMainProvider userMainProvider;
    
    @Override
    public PageInfo<UserMainDTO> page(UserMainSpec spec){
        return userMainProvider.page(spec);
    }
    

    }

    controller 接口
    

    package com.barm.order.server.controller;

    import com.barm.archetypes.api.domain.dto.spec.UserMainSpec; import com.barm.common.domain.vo.ResultVO; import com.barm.order.core.facade.UserMainService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;

    import javax.annotation.Resource;

    /** * @author Allen * @version 1.0.0 * @description UserMainController * @create 2020/3/16 21:17 * @e-mail allenalan@139.com * @copyright 版权所有 (C) 2020 allennote */ @RestController public class UserMainController {

    @Resource
    private UserMainService userMainService;
    
    @GetMapping("page")
    public ResultVO page(UserMainSpec spec){
        return new ResultVO(userMainService.page(spec));
    }
    

    }

    启动

    启动注册中心nacos
    

    docker start nacos

    启动 provider 服务
    
    2021-03-18 00:24:09
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载