SpringBoot2.X整合集成Dubbo

环境安装

Dubbo使用zookeeper作为注册中心,首先要安装zookeeper。

Windows安装zookeeper如下:

https://blog.csdn.net/qq_33316784/article/details/88563482

Linux安装zookeeper如下:

https://www.cnblogs.com/expiator/p/9853378.html

SpringBoot新建项目

如果还不清楚怎么新建SpringBoot项目,可以参考: https://www.cnblogs.com/expiator/p/15844275.html

服务提供者Dubbo-provider

创建了dubbo-provider模块,作为服务提供者。

dubbo有多种groupId,其中的org.apache.dubbo的版本,比较适合SpringBoot2.X,注解不会过期或者失效。

引入 org.apache.dubbo 的包,dubbo的版本号设置在 2.7.5 。

pom.xml如下:
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>dubbo-provider</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>dubbo-provider</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.2.2.RELEASE</spring-boot.version>
        <dubbo.version>2.7.5</dubbo.version>
        <curator.version>4.2.0</curator.version>
        <zookeeper.version>3.4.12</zookeeper.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

	<!-- dubbo,注意要使用 org.apache.dubbo的groupId -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo.version}</version>
        </dependency>

        <!-- zookeeper依赖 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>

        <!-- zookeeper的api管理依赖 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>${curator.version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
application.yml

在resources文件下添加 application.yml,配置如下:

复制代码
dubbo:
  application:
    # 应用名称
    name: dubbo-provider
  protocol:
    # 协议名称
    name: dubbo
    # 协议端口
    port: 20880
  registry:
    # 注册中心地址
    address: zookeeper://127.0.0.1:2181

server:
  # 修改端口号,避免端口冲突
  port: 8081
pojo类:

@Data 是 lombok注解,相当于getter、setter、toString等方法。

@NoArgsConstructor也是 是 lombok注解,相当于没有参数的构造方法。

@AllArgsConstructor 是包含所有参数的构造方法。

如果不用lombok,也可以自行替换成相应的方法。

复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
    private static final long serialVersionUID = -4294369157631461921L;
    Long userId;
    String userName;
    String userInfo;
}
service:
复制代码
public interface UserService {
    String getUserInfo();

    User getUserById(String userId);
}

service实现类:

注意,@service注解,引入的包是org.apache.dubbo.config.annotation.Service

复制代码
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

/**
 * 注意,@service注解,引入的包是org.apache.dubbo.config.annotation.Service
 */
@Service
@Component
public class UserServiceImpl implements UserService {

    @Override
    public String getUserInfo() {
        return "userTest";
    }

    @Override
    public User getUserById(String userId) {
        User user = new User();
        user.setUserId(Long.valueOf(userId));
        user.setUserInfo("test");
        user.setUserName("lin");
        return user;
    }

}

SpringBoot启动类:

注意:

复制代码
/**
 * 提供服务的应用配置DubboComponentScan注解,指定扫描的service所在的文件
 */
@SpringBootApplication
@DubboComponentScan("com.example.service")
public class DubboProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboProviderApplication.class, args);
    }

}

install服务提供者dubbo-provider

在idea中,对服务提供者dubbo-provider的依赖, 用Maven执行clean,并install到Maven仓库,就可以提供给其他模块使用。

服务消费者 dubbo-consumer

新建一个服务消费者 dubbo-consumer的maven项目。

pom.xml

pom.xml中,服务消费者 dubbo-consumer 的依赖跟之前的类似,只是还要引入服务提供者dubbo-provider的依赖,这样才能调用其中的Service。

复制代码
<!-- 引入服务提供者的依赖,注意版本号 -->
<dependency>
	<groupId>com.example</groupId>
	<artifactId>dubbo-provider</artifactId>
	<version>1.0-SNAPSHOT</version>
</dependency>
application.yml

类似 dubbo-provider, 可以将端口号修改为 8082,避免端口号冲突

ConsumerController 类:
复制代码
import com.example.pojo.User;
import com.example.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class ConsumerController {
    /**
     * 通过 @Reference注解调用远程服务,也就是服务提供者dubbo-provider的服务
     */
    @Reference
    private UserService userService;


    @GetMapping("/info")
    public String getUserById() {
        return userService.getUserInfo();
    }


    @GetMapping("/{id}")
    public User getUserById(@PathVariable String id) {
        return userService.getUserById(id);
    }

}
DubboConsumerApplication启动类:
复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DubboConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboConsumerApplication.class, args);
    }
}

启动项目

没有启动 zookeeper会报错:

复制代码
Caused by: java.lang.IllegalStateException: zookeeper not connected
	at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:80) ~[dubbo-2.7.5.jar:2.7.5]
	... 32 common frames omitted
  • 端口号被占用,需要修改端口号,否则会报错。

    Web server failed to start. Port 8080 was already in use.
    Action:
    Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.

  • 启动报错:

    Whitelabel Error Page
    This application has no explicit mapping for /error, so you are seeing this as a fallback.

解决方法:https://www.cnblogs.com/expiator/p/15837518.html

  • 先启动Provider,再启动Consumer

启动成功如下:

参考资料:

https://www.jb51.net/article/178946.htm

相关推荐
白狐_7985 分钟前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
流云鹤15 分钟前
03Java学习day(3)
java·学习
tqs_1234519 分钟前
Agent智能体+Skill插件引擎+Milvus混合检索 技术沉淀
java·python·milvus
卷福同学1 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端
严同学正在努力1 小时前
从备份到恢复:我用 30 分钟恢复了误删的核心业务表
android·java·数据库·ai
Csvn2 小时前
📊 SQL 入门 Day 11:CASE 表达式:SQL 里的 if-else 魔法
后端·sql
QQ_21696290962 小时前
Spring Boot 养老院管理系统:从入住、护理到费用结算的全流程实现(源码可领)
java·spring boot·后端
cxoptics2 小时前
冰洲石分束器设计与应用
java
ck-joker2 小时前
M1 Pro跑LLM实测:Ollama+LangChain4j零成本本地大模型开发,比云端API快在哪?
java·语言模型
丙氨酸長鏈3 小时前
[Bukkit插件开发]手持发射器箭矢机枪 教学文档 面向Python/C#开发者入门Java与Bukkit API
java·python·c#