暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Dubbo与Spring Boot的集成

木一成舟 2021-10-28
289

先把demo跑起来,再看文档。这一篇先写一个最基本的demo。

Dubbo与Spring Boot的集成,按照最基本的方式,开发了三个模块。


   

首先创建dubbostudy工程,随后分别创建dubboapis,dubboprovider以及dubboconsumer三个模块,这里面

dubboapis 是对外暴露接口工程,生产者与消费者公用

dubboprovide 生产者服务

dubboconsumer 消费者服务


创建完上面三个模块后,可以先往下走,应用启动过程中可能会报缺curator相关的包的异常。最后出错了再回头来这里看下。如果是报curator相关的缺包异常,那么可以在dubboStudy的pom文件里加上如下三个引用

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.0.0</version>
</dependency>

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.0.0</version>
</dependency>

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-x-discovery</artifactId>
<version>5.1.0</version>
</dependency>


一、 dubboapis模块

创建模块后,看下他的pom文件

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dubboStudy</artifactId>
<groupId>com.ward</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>dubboapis</artifactId>

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>

</project>

这里可以不用动,因为这里就是申明接口,暴露出来服务,暂时没有什么依赖jar包。


创建实体类对象UserModel

package com.ward.models;

public class UserModel {

private Integer id;
private String username;
private String password;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

@Override
public String toString() {
return "UserModel{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}

不建议使用lombok插件,小白想知道具体原因可以详细了解下相关知识。


创建对外开放的接口UserService

package com.ward.services;

import com.ward.models.UserModel;

/**
* 对User的增删改查操作
*/
public interface UserService {

int saveUser(UserModel userModel);

int deleteUser(Long id);

int updateUser(UserModel userModel);

UserModel getUser(Long id);
}

Demo示例,简单的增删改查操作。

以上,公共的API接口部分就完成了。


二、dubboprovider模块

创建模块,添加pom依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dubboStudy</artifactId>
<groupId>com.ward</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubboprovider</artifactId>

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>

<dependencies>
<!-- 公共开放Api接口工程 -->
<dependency>
<groupId>com.ward</groupId>
<artifactId>dubboapis</artifactId>
<version>1.0</version>
</dependency>

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

<!-- dubbo 整合 spring-boot -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

添加的几个依赖,看下对应的注释。


配置文件

server:
port: 9001

dubbo:
application:
id: dubbo-provider
name: dubbo-provider
registry:
address: zookeeper://127.0.0.1:2181
#dubbo 协议端口 ,填-1,则自动分配
protocol:
port: 12501
#dubbo 扫描包地址 (一般是@Service 注解使用的包)
scan:
base-packages: com.ward.provide.services

provider:
timeout: 50000

基本的配置如上,(最后这个timeout可加可不加)

这里使用zookeeper作为注册中心,后面启动生产者和消费者的应用前要先启动Zookeeper。


创建启动类

package com.ward.provider;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class ProvideApplication {

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

一定要加EnableDubbo注解,否则接口调用过程中有问题,找不到对应的实现类等等。


创建暴露出来的UserService的具体实现业务类

package com.ward.provider.services;

import com.ward.models.UserModel;
import com.ward.services.UserService;
import org.apache.dubbo.config.annotation.DubboService;

@DubboService
public class UserServiceImpl implements UserService {
@Override
public int saveUser(UserModel userModel) {
System.out.println("Save UserModel Service");
return 0;
}

@Override
public int deleteUser(Long id) {
System.out.println("Delete UserModel Service");
return 0;
}

@Override
public int updateUser(UserModel userModel) {
System.out.println("Update UserModel Service");
return 0;
}

@Override
public UserModel getUser(Long id) {
System.out.println("Get UserModel Service");
return null;
}
}

注意,这里的@DubboService注解。一开始啥也不知道,按照习惯会使用Spring的@Service,可以试下有没有问题。我这里看到了DubboService就直接用了,没有使用Service注解。

以上,生产者provider服务就创建完毕了。


三、dubboconsumer模块

创建模块,添加pom依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dubboStudy</artifactId>
<groupId>com.ward</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubboconsumer</artifactId>

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>com.ward</groupId>
<artifactId>dubboapis</artifactId>
<version>1.0</version>
</dependency>

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

<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

这里跟provider是一样的。


配置文件

server:
port: 9002

dubbo:
application:
name: dubbo-consumer
id: dubbo-consumer
registry:
address: zookeeper://127.0.0.1:2181
protocol:
port: 12500
consumer:
timeout: 50000

跟provider也是一样的,注意端口号,应用名称和ID。


创建启动类

package com.ward.consumer;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {

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

记得加EnableDubbo注解。


创建Controller,接受外来请求

package com.ward.consumer.controllers;

import com.ward.models.UserModel;
import com.ward.services.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {

@DubboReference
private UserService userService;

**
* 添加人员
*/
@RequestMapping("/save")
public Object saveUser(@RequestBody UserModel user) {
System.out.println("【消费者服务】>> 添加人员");
return userService.saveUser(user);
}

**
* 获取人员列表
*/
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
public String listUser(@PathVariable Long id) {
System.out.println("【消费者服务】>> 获取人员列表");
UserModel userModel = userService.getUser(id);
return "Get UserModel Success!";
}

public UserService getUserService() {
return userService;
}

public void setUserService(UserService userService) {
this.userService = userService;
}
}

注意这里,Controller里引用Service的时候,用的@DubboReference注解,这里可以对比下跟以前的@Autowired注解有什么区别。(最后讲)

以上,就是消费者模块的搭建过程。


四、启动服务,看效果

下载下来zookeeper的包后,解压,进入conf文件夹下面,复制一份zoo_sample.cfg文件,改名为zoo.cfg,才可以启动,否则会报配置文件找不到的问题。

分别启动Zookeeper,Provider,Consumer应用。

使用Postman调用UserController提供出来的接口,结果如下


   

 

以上,跟代码里给出的demo结果一致,Demo搭建完毕。


五、相关注解与Spring的区别做个说明

OK,看下两组注解

  1. 申明Service的时候,@DubboService与@Service的区别

经过测试,

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

相同包下面的DubboService与Service两个注解没有区别,都可以正常使用。

但是Spring中的Service不可以使用,否则会报Zookeeper服务断开的异常。?


    2. 引用Service的时候,@DubboReference与@Autowired的区别

@Autowired是从本地IOC容器中取出注入的对象并使用;

@DubboReference是从远程IOC容器中取出注入的对象并使用。



文章转载自木一成舟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论