SpringBoot(37)之分布式及整合Dubbo

SpringBoot(37)之分布式及整合Dubbo

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

前言

分布式应用

在分布式系统中,国内常用 Zookeeper + Dubbo 组合,而 SpringBoot 推荐使用 Spring 提供的分布式一站式解决方案 Spring + SpringBoot + SpringCloud。

image.png

Zookeeper 和 Dubbo

Zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名维护、分布式同步、组服务等。

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

image.png

整合Dubbo

安装 Zookeeper

可参考【Docker安装Zookeeper】。

Provider 工程

1、新建 Provider 工程,引入 Web 场景启动器和 Dubbo 及 Zookeeper 相关依赖:

<!-- 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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.20.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>zze.springboot.dubbo</groupId>
    <artifactId>provider-ticket</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>provider-ticket</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>
        </dependency>

        <!--引入 Dubbo 整合 SpringBoot 的场景启动器-->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.1.0</version>
        </dependency>

        <!--引入 Zookeeper 客户端工具依赖-->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>

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

</project>

2、配置 Provider 工程注册到 Zookeeper:

# application.yml
dubbo:
  application:
    name: provider-ticket # 指定服务应用名称
  registry:
    address: zookeeper://192.168.202.136:2181 # Zookeeper 服务地址
  scan:
    base-packages: zze.springboot.dubbo.ticket.service # 扫描指定包下服务注册到 Zookeeper

3、编写要注册的服务接口及其实现类:

// zze.springboot.dubbo.ticket.service.TicketService
public interface TicketService {
    public String getTicket();
}
// zze.springboot.dubbo.ticket.service.impl.TicketServiceImpl
package zze.springboot.dubbo.ticket.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
import zze.springboot.dubbo.ticket.service.TicketService;

@Component // 注册到 IoC 容器
@Service // 使用 Dubbo 的 @Service 注解标注这是一个要发布的服务
public class TicketServiceImpl implements TicketService {
    @Override
    public String getTicket() {
        return "《大话西游》";
    }
}

4、启动工程,看到 Dubbo 服务注册信息如下:

image

Consumer 工程

1、新建 Consumer 工程,引入 Web 场景启动器和 Dubbo 及 Zookeeper 相关依赖:

<!-- 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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.20.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>zze.springboot.dubbo</groupId>
    <artifactId>consumer-user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>consumer-user</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>
        </dependency>

        <!--引入 Dubbo 整合 SpringBoot 的场景启动器-->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.1.0</version>
        </dependency>

        <!--引入 Zookeeper 客户端工具依赖-->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>

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

2、配置 Zookeeper 地址:

# application.yml
dubbo:
  application:
    name: consumer-user # 配置消费者服务应用名称
  registry:
    address: zookeeper://192.168.202.136:2181 # Zookeeper 服务地址

3、拷贝 Provider 工程中服务接口到 Consumer 工程:

// zze.springboot.dubbo.ticket.service.TicketService
public interface TicketService {
    public String getTicket();
}

4、编写 Service 类,远程引用 Provider 提供的 Service 实现:

// zze.springboot.dubbo.user.service.UserService
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
import zze.springboot.dubbo.ticket.service.TicketService;

@Service
public class UserService {
    @Reference // 远程引用 Provider 提供的实现
    private TicketService ticketService;

    public String buyTicket(){
        return ticketService.getTicket();
    }
}

5、测试:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import zze.springboot.dubbo.user.service.UserService;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ConsumerUserApplicationTests {

    @Autowired
    private UserService userService;

    @Test
    public void contextLoads() {
        String s = userService.buyTicket();
        System.out.println(s);
        /*
        《大话西游》
         */
    }
}

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/springboot37.html

Buy me a cup of coffee ☕.