dubbo是一个rpc框架,用来进行微服务化数据传输的,比如我们把web层和service层分开,放在两个服务器上面,那么这本来是一个完整的系统,现在分开了,如何调用原本的功能呢?这就使用dubbo把他们连起来,进行服务调用的传输!

    dubbo这里就把service层作为服务提供者(因为一般都是web层调用service),然后web层作为服务消费者。

    服务提供者流程:框架启动的时候,会初始化服务实例,通过Proxy组件调用具体的协议(protocol),然后转换成为Exporter,这个时候框架就会打开服务端口,并记录服务实例到内存中,最后通过Registry把服务元数据注册到注册中心中,(说明:Exporter用于暴露到注册中心的对象,持有Invoker对象,也就是对Invoker进行了包装)

    消费者消费流程:消费者通过Proxy,它持有Invoker对象,然后触发invoke调用,在调用过程中需要Cluster复杂容错(如果调用失败怎么办?对通过Directory获取所有可以调用的远程服务Invoker列表(集群模式),然后进行负载均衡选出一个invoker重新进行使用),invoke会使用netty client进行传输,将数据包做序列化,然后发送,服务提供者收到数据包,要进行分包,粘包情况的处理,然后对完整数据包进行反序列化,将request放到线程池中,提供服务提供者的过滤器链,最后真正实现完成之后,返回结果到消费端!

springBoot整合dubbo,使用zookeeper作为注册中心

1.在父模块中导入包

<?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.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.myProject.gmall</groupId>
    <artifactId>gmall_parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>gmall_parent</name>
    <packaging>pom</packaging>

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

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--dubbo-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!-- zookeeper-->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.8.0</version>
        </dependency>
    </dependencies>
</project>

2.将bean和service接口,抽象出来,形成一个api模块

dubbo调用传参 dubbo如何传输对象_apache

3.服务提供端

<?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>com.myProject.gmall</groupId>
        <artifactId>gmall_parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.myProject.gmall</groupId>
    <artifactId>gmall_user_service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gmall_user_service</name>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.myProject.gmall</groupId>
            <artifactId>gmall_api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

注意看我的标签,是属于哪一个包的! 

import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
@Component
@Service
public class UserService implements IUserService {
    @Autowired
    private UserMapper userMapper;

    public List<UmsMember> getAllUser() {
        return userMapper.selectAllUser();
    }

    public List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId) {
        return null;
    }
}

  applicaiton.yml中配置

dubbo:
  application:
    name: user-service
  protocol:
    name: dubbo
    port: 20880
  registry:
    address: zookeeper://192.168.100.134:2181
    protocol: zookeeper
  scan:
    base-packages: com.myproject.gmall.user

启动类中标签开启:

@MapperScan(value = "/com.myproject.gmall.user.mapper")
@SpringBootApplication
@EnableDubbo
public class GmallUserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(GmallUserServiceApplication.class, args);
    }
}

4.消费端

pom和服务提供端是差不多的,这里就不重复了!

server:
  port: 8080
dubbo:
  application:
    name: user-web
  registry:
    address: zookeeper://192.168.100.134:2181
  consumer:
    timeout: 5000

消费代码,注意@Reference是dubbo的

@Controller
public class UserController {
    @Reference
    private IUserService userService;
    @RequestMapping("/user")
    @ResponseBody
    public List<UmsMember> getAllUser(){
        return userService.getAllUser();
    }
}

启动类

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GmallUserWebApplication {
    public static void main(String[] args) { SpringApplication.run(GmallUserWebApplication.class, args); }
}

然后就可以运行进行测试了!