欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springboot集成dubbo

程序员文章站 2022-04-30 19:38:06
...

前言

dubbo是一个分布式的高性能Java RPC服务治理框架。
由于之前dubbo不更新没怎么用它。不过现在已经成为Apache的一员了,所以就不用担心这个问题了。

dubbo官网:http://dubbo.apache.org,还有中文版,不错。

模块划分:
这里将接口和用到的bean放在dubbo-interface,服务提供方dubbo-provider,服务消费方dubbo-consumer。

具体使用

1.项目结构

springboot集成dubbo

父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.donny</groupId>
    <artifactId>springboot-dubbo-demo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>dubbo-interface</module>
        <module>dubbo-provider</module>
        <module>dubbo-consumer</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.7.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
</project>

2.dubbo-interface

这里定义一个UserService,并提供2个方法。

public interface UserService {
    String sayHello(String name);
    List<User> findAllUsers();
}
public class User implements Serializable{
    private Long id;
    private String name;
    private int age;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

PS:注意User要实现序列化接口。

3.dubbo-provider

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">
    <parent>
        <artifactId>springboot-dubbo-demo</artifactId>
        <groupId>com.donny</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-provider</artifactId>

    <name>dubbo-provider</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>


    <dependencies>
        <dependency>
            <groupId>com.donny</groupId>
            <artifactId>dubbo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </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>

        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.8.0</version>
        </dependency>
    </dependencies>

</project>

application.yml

server:
  port: 8080

dubbo:
  registry:
    address: localhost:2181

logging:
  level:
    root: info

dubbo-provider.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="dubbo-provider"  />

    <!-- 注册中心服务地址 -->
    <dubbo:registry id="zookeeper" protocol="zookeeper" address="${dubbo.registry.address}" />

    <!-- 用dubbo协议在30001 -->
    <dubbo:protocol name="dubbo" port="30001" />

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.donny.service.UserService" ref="userService"
                   version="1.0" registry="zookeeper"/>

    <!-- 具体服务接口的实现 -->
    <bean id="userService" class="com.donny.service.UserServiceImpl" />

</beans>

UserService实现

public class UserServiceImpl implements UserService {
    @Override
    public String sayHello(String name) {
        return "Hello," + name;
    }

    @Override
    public List<User> findAllUsers() {
        List<User> users = new ArrayList<User>(3);
        User user0 = new User();
        user0.setId(1L);
        user0.setName("张三");
        user0.setAge(18);
        users.add(user0);

        User user1 = new User();
        user1.setId(2L);
        user1.setName("李四");
        user1.setAge(28);
        users.add(user1);

        User user2 = new User();
        user2.setId(3L);
        user2.setName("王五");
        user2.setAge(38);
        users.add(user2);

        return users;
    }
}

Springboot主类

@SpringBootApplication
@ImportResource("classpath:dubbo-provider.xml")
public class DubboProviderApp
{
    public static void main( String[] args ) throws IOException {
        SpringApplication.run(DubboProviderApp.class,args);
        System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟
    }
}

4.dubbo-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">
    <parent>
        <artifactId>springboot-dubbo-demo</artifactId>
        <groupId>com.donny</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-consumer</artifactId>

    <name>dubbo-consumer</name>
    <url>http://www.example.com</url>


    <dependencies>
        <dependency>
            <groupId>com.donny</groupId>
            <artifactId>dubbo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </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>

        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.8.0</version>
        </dependency>
    </dependencies>

</project>

application.yml

server:
  port: 8081

dubbo:
  registry:
    address: localhost:2181

dubbo-consumer.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="dubbo-consumer"  />

    <!-- 注册中心服务地址 -->
    <dubbo:registry id="zookeeper" protocol="zookeeper" address="${dubbo.registry.address}" />

    <!-- 引用UserService服务-->
    <dubbo:reference id="userService" interface="com.donny.service.UserService"
                     check="false" version="1.0" url="" registry="zookeeper" protocol="dubbo" timeout="15000"/>

</beans>

Springboot主类

@SpringBootApplication
@ImportResource("classpath:dubbo-consumer.xml")
public class DubboConsumerApp
{
    public static void main( String[] args )
    {
        SpringApplication.run(DubboConsumerApp.class,args);
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DubboConsumerApp.class)
public class DubboConsumerTest
{
    @Autowired
    private UserService userService;

    @Test
    public void testSayHello() {
        String result = userService.sayHello("jack");
        System.out.println(result);
        assertEquals(result,"Hello,jack");
    }

    @Test
    public void testFindAllUers() {
        List<User> users = this.userService.findAllUsers();
        if (null != users && !users.isEmpty()) {
            for (User user : users) {
                System.out.println(user);
            }
        }

        assertNotNull(users);
        assertEquals(users.size(),3);
    }
}

PS:这里注册中心使用的zookeeper。

5.使用dubbo-spring-boot-starter

springboot提供了非常多的starter,要用什么就使用spring-boot-starter-xxx即可。dubbo也提供了相应的starter。
dubbo-spring-boot-starter的github地址:https://github.com/alibaba/dubbo-spring-boot-starter。使用还是比较简单的,这里不再赘述。

dubbo-spring-boot-starter的使用也可以参考这篇:https://blog.csdn.net/romantic112/article/details/79687942

参考:https://blog.csdn.net/qq_27384769/article/details/79465781

代码地址:https://gitee.com/tommy88/springboot-dubbo-demo

相关标签: springboot