Dubbo 怎么作为 Spring Cloud 服务调用?
Dubbo 作为 Spring Cloud 服务调用 默认情况,Spring Cloud Open Feign 以及 @LoadBalancedRestTemplate 作 为 Spring Cloud 的两种服务调用方式。Dubbo Spring Cloud 为其提供了第三种选择, 即 Dubbo 服务将作为 Spring Cloud 服务调用的同等公民出现,应用可通过 Apache Dubbo 注解 @Service 和 @Reference 暴露和引用 Dubbo 服务,实现服务间多种协 议的通讯。同时,也可以利用 Dubbo 泛化接口轻松实现服务网关。
快速集成
先说明, 大多数情况都存在一个服务节点即是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 服务
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。