很久没来csdn写文章,说来惭愧,游戏(亡者/恰鸡/云顶/某抖)使我快乐,学习让我秃顶。
但工作之余还是会经常来转转,看到我一点点上涨的几十个粉丝,我觉得是时候祭出大杀器(来一篇水文)了。
基调: 通过注册中心(nacos)与dubbo之间的协作完成服务的注册发现及服务间的远程调用。
环境: springcloudAlibaba 2.2.5, springboot 2.3.0
具体可参考 alibaba github 项目介绍
开始前需要启动nacos,详见: Nacos 快速开始
启动后打开 http://localhost:8848/nacos/index.html ,账号密码都是 nacos 。
创建一个公共的api模块,所有需要暴露的api接口都可以在这里定义。其他模块都要依赖这个模块
<dependency>
<groupId>com.hansin</groupId>
<artifactId>api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
创建两个版本都为2.3.0.RELEASE的springboot项目,取名order (作为消费者)/ user ( 作为生产者),并在两个项目添加必要依赖
<!-- Dubbo Spring Cloud Starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
值得注意的是,以上 artifact 未指定版本(version),因此,还需显示地声明 `<dependencyManagement>` :
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
user bootstrap.properties
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.name=order-provider-dev.properties
dubbo.protocol.name=dubbo
dubbo.protocol.port=20881
dubbo.scan.base-packages=com.hansin.user.service
dubbo.registry.address=spring-cloud://127.0.0.1:8848
spring.main.allow-bean-definition-overriding=true
dubbo.consumer.check=false
dubbo.cloud.subscribed-services=order
user application.properties
server.port=9001
spring.application.name=user
management.endpoints.web.exposure.include=*
需要暴露的service实现类用@DubboService
@DubboService
public class UserServiceImpl implements com.hansin.api.user.service.UserService {
@Override
public UserModel getUserDetail(Integer userId) {
// 模拟从db查询用户,直接返回结果
UserModel userModel = new UserModel();
userModel.setUserId(62);
userModel.setAccount("hansin2");
userModel.setNickName("hansin");
return userModel;
}
}
user启动类@EnableDiscoveryClient
相对应的在order模块配置
order application.properties
server.port=9000
spring.application.name=order
management.endpoints.web.exposure.include=*
order bootstrap.properties
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.name=order-provider-dev.properties
dubbo.cloud.subscribed-services=user
dubbo.consumer.check=false
spring.main.allow-bean-definition-overriding=true
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.registry.address=spring-cloud://127.0.0.1:8848
调用其他模块service时使用@DubboReference 标注service,代码中直接调用就行
@DubboReference
UserService userService;
@GetMapping
public ApiResult<UserModel> getOrderDetail(@RequestParam(required = false, defaultValue = "1") Integer orderId) {
OrderModel orderDetail = orderService.getOrderDetail(orderId);
UserModel userDetail = userService.getUserDetail(62);
if (userDetail != null) {
orderDetail.setUserId(userDetail.getUserId());
orderDetail.setAccount(userDetail.getAccount());
orderDetail.setNickName(userDetail.getNickName());
}
return new ApiResult().setData(orderDetail);
}
order启动类@EnableDiscoveryClient
接下来启动两个项目,启动后在nacos监控页面可看到注册的服务
使用postman工具模拟请求调用order的getOrderDetail方法获取订单信息返回数据
可以看到返回的对象中包含了在UserServiceImpl中定义的用户信息,证明服务间调用是没有问题的。
可能说的不够细(很粗?),代码在 私人github ,需要自取。
文章参考springcloudAlibaba 源码demo, 总结归纳码字贴代码挺累的,溜了溜了。