springcloud alibaba nacos + dubbo

很久没来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, 总结归纳码字贴代码挺累的,溜了溜了。

猜你喜欢

转载自blog.csdn.net/qq_29410905/article/details/114436321