springboot整合dubbo如何实现?有何用处?

2020-04-29 12:56:55 java常见问答 3919

我们都知道springboot是用来spring项目的“脚手架”,而dubbo呢是19年新出现在的一个RPC分布式服务框架,你知道如何在springboot中整合dubbo吗?这样整合有什么作用呢?有兴趣了解的朋友可以跟小编一起来看看。

在分布式互联网系统中,使用较多的是zookeeper+dubbo组合,而Springboot推荐使用全栈Spring,就是Springboot+SpringCloud。

Dubbo就是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以让各个层之间解耦合。从服务模型的角度来看,Dubbo采用的是一种比较简单的模型,要么是提供方提供服务,要么是消费方消费服务,那么基于这一点我们可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。

Dubbo 的RPC 调用流程,在这里主要会涉及到4个模块:

Registry:服务注册,我们一般会采取Zookeeper 作为我们的注册中心;

Provider:服务提供者(生产者),提供具体的服务实现;

Consumer:消费者,从注册中心中订阅服务;

Monitor:监控中心,RPC调用次数和调用时间监控;

下面我们的项目主要也是分为了两个模块,一部分是生产者:spring-boot-dubbo ,一部分是:spring-boot-consumer。

其实整个项目的结构非常简单,这也很符合Spring-Boot的特性,简单便捷,下面我们就开始吧。

Productor(生产者)

Pom.xml

项目依赖这块儿主要使用到了基本的Spring-Boot-Web依赖,然后可能我们需要额外引入Dubbo与Zookeeper的依赖。

<dependency>
    <groupId>io.dubbo.springboot</groupId>
    <artifactId>spring-boot-starter-dubbo</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.6</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

配置文件

由于我们底层使用的是Spring-Boot进行开发,那么我们就应该善于利用Spring-Boot给我们带来的一些优势,因此我们可以直接在Application.properties文件中配置Dubbo服务:

## Dubbo 服务提供者配置
 spring.dubbo.application.name=provider    		  --服务名称
 spring.dubbo.registry.address=zookeeper://127.0.0.1:2181   -- 注册中心地址
 spring.dubbo.protocol.name=dubbo    			  -- dubbo 协议
 spring.dubbo.protocol.port=20880
 spring.dubbo.scan=com.jaycekon.dubbo.service     --声明需要暴露的服务接口

如果说不采用Spring-Boot进行自动配置,大家还是可以参考一下的配置xml 配置的:

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 提供方应用信息 -->
    <dubbo:application name="provider"  />
    <!-- 注册中心服务地址 -->
    <dubbo:registry  protocol="zookeeper" address="127.0.0.1"  check="false" />
    <!-- 用dubbo协议-->
    <dubbo:protocol name="dubbo" port="-1" dispather="all" check="false" />
    <dubbo:provider timeout="10000"  threads="10" threadpool="fixed"   loadbalance="roundrobin"/>
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.jaycekon.dubbo.service" ref="userService"/>
</beans>

服务提供

在服务提供主要就包括两部分,一个是暴露服务,一个是服务实现。

暴露服务:即我们平常开发中所使用的的接口,这里我们创建一个 UserService 的接口,主要包括一个保存用户的方法。

import com.jaycekon.dubbo.domain.User;
public interface UserService
{
    User saveUser(User user);
}

服务实现:服务实现,与我们平常的服务一样,对接口进行实现,比较特别的是,我们这里需要使用到Dubbo的@Service注解。

import com.alibaba.dubbo.config.annotation.Service;
import com.jaycekon.dubbo.domain.User;
import com.jaycekon.dubbo.service.UserService;
@Service
public class UserServiceImpl implements UserService
{
    @Override
    public User saveUser(User user)
    {
        user.setId(1);
        System.out.println(user.toString());
        return user;
    }
}

Consumer(消费者)

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.jaycekon</groupId>
    <artifactId>spring-boot-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>spring-boot-consumer</name>
    <description>Demo project for Spring Boot</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
        <relativePath/>
        <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <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>
        </dependency>
        <!-- Spring Boot Dubbo 依赖 -->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- mvn spring-boot:run 热部署启动 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
            <version>1.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

配置文件

配置文件与生产者稍有区别:

## 避免和 server 工程端口冲突
 server.port=8081
 ## Dubbo 服务消费者配置
 spring.dubbo.application.name=consumer
 spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
 spring.dubbo.scan=com.jaycekon.dubbo.service

基于Xml 的配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 提供方应用信息 -->
    <dubbo:application name="provider"  />
    <!-- 注册中心服务地址 -->
    <dubbo:registry  protocol="zookeeper" address="${dubbo.registry.address}"  check="false" />
    <!-- 用dubbo协议-->
    <dubbo:protocol name="dubbo" port="-1" dispather="all" check="false" />
    <dubbo:provider timeout="10000"  threads="10" threadpool="fixed"   loadbalance="roundrobin"/>
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.jaycekon.dubbo.service" ref="userService"/>
</beans>

服务实现

在这里,如果我们需要调用注册服务中的相关服务,则需要实现相关的接口。

 import com.jaycekon.dubbo.domain.User;
 public interface UserService
 {
     User saveUser(User user);
 }

例如,在这里我们需要使用到生产者中的 saveUser(User user) 方法,则需要创建一个接口,然后再调用时,使用 @Reference 注解进行引用:

import com.alibaba.dubbo.config.annotation.Reference;
import com.jaycekon.dubbo.domain.City;
import com.jaycekon.dubbo.domain.User;
import org.springframework.stereotype.Component;
@Component
public class CityDubboConsumerService
{
    @Reference
    CityDubboService cityDubboService;
    @Reference
    UserService userService;
    public void printCity()
    {
        String cityName = "广州";
        City city = cityDubboService.findCityByName(cityName);
        System.out.println(city.toString());
    }
    public User saveUser()
    {
        User user = new User();
        user.setUsername("jaycekon")
            .setPassword("jaycekong824");
        return userService.saveUser(user);
    }
}

服务调用

最后,我们需要实现一个RESTful接口,提供给用户调用:

import com.jaycekon.dubbo.service.CityDubboConsumerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController
{
    @Autowired
    private CityDubboConsumerService service;
    @RequestMapping("/save")
    public Object saveUser()
    {
        return service.saveUser();
    }
}

那么以上就是本篇文章的所有内容了,还想了解更多java架构师相关信息的话,记得马上来关注本站消息哦。