Dubbo2.7.5整合SpringBoot构建分布式系统详解

4 篇文章 0 订阅
1 篇文章 0 订阅

 

        相信大家对于Dubbo都不陌生吧,前段时间看到Dubbo的官网上放出了最新的2.7.5的版本,发现新增了不少特性,这也是自从阿里将Dubbo交给apache维护之后迎来的首次比较大的更新。官网http://dubbo.apache.org

     进入官网之后我们查看文档(http://dubbo.apache.org/zh-cn/docs/user/new-features-in-a-glance.html),首先来看第一个章节:

我们发现最新的版本是2.7.5,由于刚发布不久,所以官方并不建议在生产环境使用 ,今天我们本着学习的心态可以先来尝尝鲜。

首先我们点击文档中左侧的快速启动,进入该章节,

我们发现官方文档上的入门案例使用的是Spring的配置方式,而现在Spring官方推荐广大开发者使用SpringBoot进行开发,因此本文也使用SpringBoot来尝鲜。

首先打开idea,创建一个空项目,如下图所示:

继续点击next, 创建完成之后点击file -> new -> Module 创建一个模块,

  为了方便构建应用,我们使用Spring Initializr 来快速构建,我们先创建服务提供者,填入相应的坐标

接着我们点击next

 既然Dubbo我们今天玩最新的,那么索性SpringBoot也用最新的吧,截止到今天最新的GA版本是2.2.6,这里我们先直接next.

创建完成之后,我们创建相应的包结构,如下图如所示:

 

UserServiceImpl 的代码如下:

 

@Service
@Component
public class UserServiceImpl implements  UserService {
    @Override
    public List<Address> getUserAddressList(String userId) {

        Address address1 = new Address(1, "武汉市江汉区建银大厦7楼702", "1", "tom", "027-15416474", "Y");
        Address address2 = new Address(2, "武汉市武昌区中铁大厦36楼204", "1", "jerry", "027-56253825", "N");

        return Arrays.asList(address1,address2);
    }
}

这里需要注意的是@Service 注解我们要使用Dubbo的而不是Spring框架的,为了能加载到Spring容器中,我们同时也加上@Component注解。对于UserService接口这里我将其单独提取出来了,形成一个interface模块,将来所有的接口统一维护在interface模块。

接着我们使用同样的方法,再新建一个模块,模块的结构如下图:

我们将开发者需要使用的实体类和接口划分进该模块中,Address和UserService的代码如下图所示:


public class Address implements Serializable {
    private Integer id;
    private String userAddress; 
    private String userId; 
    private String consignee; 
    private String phoneNum; 
    private String isDefault; 

    public Address() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Address(Integer id, String userAddress, String userId, String consignee, String phoneNum,
                       String isDefault) {
        super();
        this.id = id;
        this.userAddress = userAddress;
        this.userId = userId;
        this.consignee = consignee;
        this.phoneNum = phoneNum;
        this.isDefault = isDefault;
    }

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUserAddress() {
        return userAddress;
    }
    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getConsignee() {
        return consignee;
    }
    public void setConsignee(String consignee) {
        this.consignee = consignee;
    }
    public String getPhoneNum() {
        return phoneNum;
    }
    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }
    public String getIsDefault() {
        return isDefault;
    }
    public void setIsDefault(String isDefault) {
        this.isDefault = isDefault;
    }
}
public interface UserService {

    /**
     * 按照用户id返回所有的用户地址
     * @param userId
     * @return
     */
    public List<Address> getUserAddressList(String userId);
}

 好了,我们再回到provider模块中,将interface模块的坐标在pom文件中引入即可。同时我们还要在provider模块中加入Dubbo 的坐标,完整的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wcan.dubbo</groupId>
    <artifactId>boot-dubbo-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>boot-dubbo-provider</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.5</version>
        </dependency>
        <dependency>
            <groupId>com.wcan.dubbo</groupId>
            <artifactId>boot-dubbo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.8.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

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

</project>

 大家可能有疑问Dubbo的Starter坐标从哪里来的,这里我们可以回到管网的首页,如下图:

我们点击左边的github,因为Dubbo项目的源码是托管在github上的,进入github上Dubbo 的项目页面如下图所示,:

 

上图就是Dubbo项目的所有模块,这里我们直接来到当前页面的末尾:

我们可以看到,在Dubbo ecosystem章节中有一个SpringBoot  project for Dubbo的子章节,这里我们点进去,往下拉:

在下面的pom文件中我们就可以看到Dubbo的starter的坐标了。

好了回到我们项目中,这里我们还需要引入操作zookeeper的客户端工具 curator-recipes的坐标,由于我使用的zookeeper是3.4d的版本 ,因此这里curator-recipes 我选择的是2.8,好了,服务提供方的模块基本搭建完成了,这里我们现在控制台安装一下interface模块:

 安装成功之后的提示信息如下:

好了,我们的provider模块中应该不会再出现报错信息了,接着我们来配置application.properties 文件,该文件的配置内容如下:

dubbo.application.name=boot-dubbo-provider
dubbo.registry.address=192.168.137.100:2181
dubbo.registry.protocol=zookeeper

dubbo.protocol.name=dubbo
dubbo.protocol.port=20881

dubbo.monitor.protocol=registry

首先我们配置的是服务提供者的映射规则,接着是注册中心的地址和端口,这里我们使用的是zookeeper,因此协议使用的也是zookeeper协议。 这里我们可以查看文档,

好了,后面的配置是关于Dubbo协议的 ,具体的信息可以参考文档。配置文件写好了之后我们还需要在启动类上加上一个@EnableDubbo注解,该注解的功能是指定扫描包路径。这里我们可以直接加载启动类上即可,

@EnableDubbo
@SpringBootApplication
public class BootDubboProviderApplication {

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

}

 好了,准备工作已经做完了,这时候我们就可以启动服务提供模块了。

当我们出现这个错误信息的时候,一般都是zookeeper出现了问题,仔细检查zookeeper的服务是否正常,端口是否畅通,配置文件中的ip是否正确等等,这里是因为我的zookeeper还没启动,好了,启动zookeeper即可。

 

provider模块编写完成之后我们再创建一个consumer模块,该模块需要引入web模块,方便测试。创建完成之后的项目结构如下图所示:

 

接着我们编辑一下pom文件,将Dubbo的坐标和interface的坐标导入项目中即可,完整的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wcan.dubbo</groupId>
    <artifactId>boot-dubbo-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>boot-dubbo-consumer</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.5</version>
        </dependency>
        <dependency>
            <groupId>com.wcan.dubbo</groupId>
            <artifactId>boot-dubbo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.8.0</version>
        </dependency>
    </dependencies>

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

</project>

最后分别编写controller和service层的代码:

@Controller
public class UserAddressController {

    @Autowired
    private UserAddressService userAddressService;

    @ResponseBody
    @RequestMapping("/getAddressList")
    public List<Address> getAddressList(String id){
        return userAddressService.getUserAddress(id);
    }

}


@Service
public class UserAddressServiceimpl implements UserAddressService {

    @Reference
    UserService userService;

    @Override
    public List<Address> getUserAddress(String userId) {
        return userService.getUserAddressList(userId);
    }
}

同样的,我们将UserAddressService 接口放到interface模块中,


public interface UserAddressService {
	
	/**
	 * 获取用户地址列表
	 * @param userId
	 */
	public List<Address> getUserAddress(String userId);

}

好了,最后我们来配置服务消费者的配置文件,具体信息如下:

server.port=8081
dubbo.application.name=boot-dubbo-consumer
dubbo.registry.address=zookeeper://192.168.137.100:2181
dubbo.monitor.protocol=registry

最后我们启动服务,打开postman访问http://localhost:8081/getAddressList?id=1 即可看到服务调用的效果了

最后我们来看一下最新版Dubbo的控制台,首先我们回到官方文档上,我们查看左下角的运维管理章节:

 

选择第一个章节,控制太介绍,如下图:

 

我们打开git终端,执行上述命令即可,启动控制台之后访问的界面如下所示:

可以看到我们发布的服务了。好了关于最新版本的Dubbo整合SpringBoot就先介绍到这里了。下次有空的话我们一起来构建一下Dubbo的源码。 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值