SpringCloud Alibaba集成Dubbo实现远程服务间调用

Posted Bug解决者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud Alibaba集成Dubbo实现远程服务间调用相关的知识,希望对你有一定的参考价值。

SpringCloud Alibaba集成Dubbo实现远程服务间调用

工程创建

一、创建springBoot分模块项目,父工程:springcloud-alibaba以及子模块product-dubbo-provider、order-dubbo-consumer等

项目基本结构图如下所示:

二、依赖引入

在以上两个子模块的pom.xml文件中分别引入如下依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
        </dependency>
        <!--模板引擎依赖,即使不需要生成模板,也需要引入-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.2</version>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--Spring Cloud Alibaba-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>
        <!--Dubbo-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <!--对api的依赖-->
        <dependency>
            <groupId>com.springcloud.xxkfz</groupId>
            <artifactId>dubbo-base</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

服务生产者

一、在编写生产者服务代码之前,我们首先在dubbo-base定义一个RPC接口queryList供消费者调用。那么这个接口在哪里去实现呢?

package com.simplememory.xxkfz.service;

import java.util.List;

/**
 * @author 公众号: SimpleMemory
 * @version 1.0.0
 * @ClassName ConsumerImpl.java
 * @Description TODO
 * @createTime 2023年02月18日 20:41:00
 */
public interface IProviderService 

	List<String> queryList();



二、在product-dubbo-provider模块中创建实现类ProviderServiceImpl.java实现dubbo-base声明的queryList接口。其中@Service是Dubbo提供的注解,表示当前服务会发布成一个远程服务,不要和Spring提供的搞混哦。

package com.simplememory.xxkfz.service;

import org.apache.dubbo.config.annotation.Service;

import java.util.Arrays;
import java.util.List;

/**
 * @author 公众号: SimpleMemory
 * @version 1.0.0
 * @ClassName ProviderServiceImpl.java
 * @Description TODO
 * @createTime 2023年02月18日 20:44:00
 */
@Service
public class ProviderServiceImpl implements IProviderService 


	@Override
	public List<String> queryList() 
		return Arrays.asList("欢迎关注小小开发者公众号","私信回复【源代码】可获取代码工程资源哦");
	


三、在配置文件application.yml中配置数据源信息、dubbo相关配置等;完整配置信息如下:

# 数据源配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/xk_cloud?characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=GMT%2B8
    username: root
    password: root
  application:
    name: provider-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
server:
  port: 8050
# dubbo相关配置
dubbo:
  scan:
    # dubbo服务实现类的扫描基准包路径
    base-packages: com.simplememory.xxkfz.service
    #Dubbo服务暴露的协议配置
  protocol:
    name: dubbo
    port: 1

服务消费者

编写基本的相关代码结构

一、创建ConsumerController.java,提供查询列表数据的接口。

package com.simplememory.xxkfz.controller;

import com.simplememory.xxkfz.service.ConsumerService;
import org.springframework.beans.factory.annotation.Autowired;
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;

/**
 * @author 公众号: SimpleMemory
 * @version 1.0.0
 * @ClassName ConsumerImpl.java
 * @Description TODO
 * @createTime 2023年02月18日 20:41:00
 */
@RestController
@RequestMapping("/dubbo/consumer")
public class ConsumerController 

	@Autowired
	private ConsumerService consumerService;

	@GetMapping
	public List<String> list() 
		return consumerService.list();
	


二、创建ConsumerService.java

package com.simplememory.xxkfz.service;

import java.util.List;

/**
 * @author 公众号: SimpleMemory
 * @version 1.0.0
 * @ClassName ConsumerService.java
 * @Description TODO
 * @createTime 2023年02月18日 20:41:00
 */
public interface ConsumerService 


	List<String> list();


三、创建实现类ConsumerServiceImpl.java,并使用使用@Reference注解注入相应的service,就可以像调用本地jar包一样,调用远程服务。

package com.simplememory.xxkfz.service.impl;

import com.simplememory.xxkfz.service.ConsumerService;
import com.simplememory.xxkfz.service.IProviderService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 公众号: SimpleMemory
 * @version 1.0.0
 * @ClassName ConsumerImpl.java
 * @Description TODO
 * @createTime 2023年02月18日 20:41:00
 */
@Service
public class ConsumerServiceImpl implements ConsumerService 

	@Reference
	private IProviderService providerService;

	@Override
	public List<String> list() 
		return providerService.queryList();
	


四、在配置文件application.yml中配置基本信息,主要配置了要订阅的服务名;完整配置信息如下:

# 数据源配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/xk_cloud?characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=GMT%2B8
    username: root
    password: root
  application:
    name: consumer-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
server:
  port: 8020
#dubbo配置
#要订阅的服务名,多个用,隔开
dubbo:
  cloud:
    subscribed-services: provider-service

测试

  • 启动nacos注册中心。

  • nacos注册中心启动完成后,依次启动DubboProviderMainApplication,DubboConsumerMainApplication生产者、消费者服务,可以看到Nacos服务列表里有两个服务。

  • 在浏览器地址栏访问:http://127.0.0.1:8020/dubbo/consumer

以上是关于SpringCloud Alibaba集成Dubbo实现远程服务间调用的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud Alibaba微服务实战十四 - SpringCloud Gateway集成Oauth2.0

Spring Cloud Alibaba Dubbo 集成

SpringCloud Alibaba微服务实战三十三 - 集成灰度发布

SpringCloud Alibaba微服务运维二 - 集成ELK日志

SpringCloud - Spring Cloud Alibaba 之 Nacos,集成Ribbon

SpringCloud - Spring Cloud Alibaba 之 Nacos,RestTemplete,集成OpenFeign