[dubbo学习] 简单的dubbo功能

Posted suphowe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[dubbo学习] 简单的dubbo功能相关的知识,希望对你有一定的参考价值。

1.Dubbo结构图

生产者-消费者模型,生产者和消费者都需要在注册中心进行注册,生产者生产接口,通过api暴露给消费者使用

注册中心管理服务提供方的url

监控模块负责监控管理整个流程

生产者(Provider)整个发布,订阅流程:

  • 启动容器,加载,运行服务提供者
  • 服务提供者在启动时,在注册中心发布注册自己提供的服务
  • 服务消费者在启动时,在注册中心订阅自己所需的服务。

如果存在服务失败或者变更的情况,Dubbo就进行如下的操作:

  • 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  • 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  • 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

2.Dubbo实例

2.1 zookeeper

2.1.1 zookeeper 下载

zookeeper下载:https://zookeeper.apache.org/releases.html

 

 

 

2.1.2 zookeeper安装

windows 安装

1.解压下载的压缩包

2.修改 zoo_sample.cfg 为 zoo.cfg

 

 

 3.bin目录下启动 zkServer.cmd

Linux 安装

1.解压下载的压缩包

2.修改 zoo_sample.cfg 为 zoo.cfg

3.修改zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/home/tjtl/dubbo/apache-zookeeper-3.6.1-bin/data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
admin.serverPort=8888
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true


server.1=zoo1:2888:3888

4.在 /home/tjtl/dubbo/apache-zookeeper-3.6.1-bin/ 目录下建立文件夹data

mkdir /home/tjtl/dubbo/apache-zookeeper-3.6.1-bin/data

5.在第4步建立的文件夹下建立文件myid

6.执行命令

echo “1” > myid

  "1" 对应 zoo.cfg 文件中 “server.1” 中的 “1"

7.在bin目录下启动

./zkServer.sh start-foreground

 

Linux 下安装遇到问题处理

1.报错 java.net.SocketException:Unresolved address

   处理: 在/etc/hosts中配置主机映射

127.0.0.1 master

   

2.2 dubbo-admin安装

下载Url https://github.com/apache/dubbo

修改/dubbo-admin-2.5.4/WEB-INF/dubbo.properties

dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

 使用maven自己手动打包mvn package -Dmaven.skip.test=true

 将war包放入tomcat下,执行tomcat

 访问url:http://127.0.0.1:8090/dubbo-admin-2.5.4

 访问用户名:root

 访问密码:root

 

 

 

2.3 dubbo 生产者 消费者 API

项目目录

API提供生产者的接口暴露,生产者在service中实现暴露接口,消费者通过controller进行消费

 

 

 springboot-dubbo.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>springboot-dubbo</groupId>
    <artifactId>springboot-dubbo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>dubbo-api</module>
        <module>dubbo-provider</module>
        <module>dubbo-consumer</module>
    </modules>

</project>

 2.3.1 创建生产者

 

 

 

生产者在service中进行接口实现

 

 

 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 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.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.soft</groupId>
    <artifactId>dubbo-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-provider</name>
    <description>dubbo-provider</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</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--服务提供者的接口API-->
        <dependency>
            <groupId>com.soft</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>v1.0</version>
        </dependency>

        <!-- dubbo依赖 -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

        <!-- 引入zookeeper的依赖 -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

    </dependencies>

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

</project>

  application.properties

############### dubbo 配置 ###############################
# 端口
server.port=9011
spring.dubbo.application.name=dubbo-provider
spring.dubbo.application.registry=zookeeper://IP:2181

  DubboProviderApplication.java

package com.soft.provider;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDubboConfiguration //开启Dubbo的自动配置
@SpringBootApplication
public class DubboProviderApplication {

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

}

  ProviderDemoImpl.java

package com.soft.provider.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.soft.api.service.IProviderDemo;
import org.springframework.stereotype.Component;

/**
 * dubbo 服务层测试
 * @author suphowe
 */
//使用com.alibaba.dubbo.config.annotation.Service,作用是暴露服务,不要使用Spring中的@Service
@Service
@Component
public class ProviderDemoImpl implements IProviderDemo {

    @Override
    public String providerReturnString(String name) {
        return "Provider Return:".concat(name);
    }

}

  

2.3.2 创建消费者

 

 消费者在controller中进行消费

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 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.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.soft</groupId>
    <artifactId>dubbo-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-consumer</name>
    <description>dubbo-consumer</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>

        <!--服务提供者的接口API-->
        <dependency>
            <groupId>com.soft</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>v1.0</version>
        </dependency>

        <!-- dubbo依赖 -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

        <!-- 引入zookeeper的依赖 -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
    </dependencies>

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

</project>

  application.properties

############### dubbo 配置 ###############################
# 端口
server.port=9021
spring.dubbo.application.name=dubbo-consumer
spring.dubbo.application.registry=zookeeper://Ip:2181

  DubboConsumerApplication.java

package com.soft.consumer;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDubboConfiguration //开启Dubbo的自动配置
@SpringBootApplication
public class DubboConsumerApplication {

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

}

  ConsumerController.java

package com.soft.consumer.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.soft.api.service.IProviderDemo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConsumerController {

    @Reference
    private IProviderDemo providerDemo;

    @RequestMapping(value = "/callInterfase")
    public String callInterfase() {
        String hello = providerDemo.providerReturnString("consumer test ");
        System.out.println(providerDemo.providerReturnString("consumer print "));
        return hello;
    }
}

  

2.3.3 创建API

 

 API提供生产者暴露的接口

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>springboot-dubbo</groupId>
        <artifactId>springboot-dubbo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>com.soft</groupId>
    <artifactId>dubbo-api</artifactId>
    <version>v1.0</version>


</project>

  IProviderDemo.java

package com.soft.api.service;

public interface IProviderDemo {

    String providerReturnString(String name);
}

2.4 测试

依次启动生产者和消费者

 

 范围http://127.0.0.1:9021/callInterfase

 

 

 查看http://127.0.0.1:8090/dubbo-admin-2.5.4/

 

 

Success!

以上是关于[dubbo学习] 简单的dubbo功能的主要内容,如果未能解决你的问题,请参考以下文章

dubbo基础dubbo学习过程使用经验分享及实现原理简单介绍

dubbo学习过程使用经验分享及实现原理简单介绍

Dubbo 源码学习系列 动手写dubbo核心原理

手写dubbo-2netty实现简单群聊私聊

Dubbo学习总结 01 简单介绍

Dubbo学习-4-dubbo简单案例-2-服务提供者和消费者配置