Dubbo02【搭建provider和consumer】

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 本文来给大家介绍下基于Spring配置的方式来搭建dubbo中的服务提供端和消费端provider和consumer的搭建


 本文来给大家介绍下基于Spring配置的方式来搭建dubbo中的服务提供端和消费端

provider和consumer的搭建

1.项目结构

 项目采用Maven聚合功能,共有三个模块,结构如下:

image.png

dubbo-common

image.png

dubbo-consumer

image.png

dubbo-provider

image.png

模块说明

模块 说明

dubbo-common 公共模块,用来存放服务提供者和消费则所需的所有的接口和pojo类,实现代码的复用,dubbo-provider和dubbo-consumer都需要引入这个包,所以我们需要先 mvn clean install

dubbo-provider 服务提供者

dubbo-consumer 服务消费者

2.具体实现

2.1dubbo-common

package com.bobo.pojo;
public class Person {
  private Integer id;
  private String name;
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  @Override
  public String toString() {
    return "Person [id=" + id + ", name=" + name + "]";
  }
  public void setName(String name) {
    this.name = name;
  }
}

UserService.java

接口中定义

package com.bobo.service;
import com.bobo.pojo.Person;
public interface UserService {
  String sayHello(String name); 
    String testPojo(Person person);
}

2.2 provider

pom.xml

引入相关的依赖

<dependencies>
<!-- 依赖公共模块 -->
  <dependency>
    <groupId>com.bobo</groupId>
    <artifactId>dubbo-common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </dependency>
  <!-- 引入Spring的依赖 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.21.RELEASE</version>
  </dependency>
  <!-- 引入日志的依赖 -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.25</version>
    </dependency>
    <!-- 引入dubbo框架(服务端、客户端通用) -->
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>dubbo</artifactId>
           <version>2.5.3</version>
           <exclusions>
               <exclusion>
                   <artifactId>spring</artifactId>
                   <groupId>org.springframework</groupId>
               </exclusion>
           </exclusions>
       </dependency>
       <!-- 因为dubbo服务端需要注册服务到zk中,因此依赖zkClient包 -->
       <dependency>
           <groupId>com.github.sgroschupf</groupId>
           <artifactId>zkclient</artifactId>
           <version>0.1</version>
       </dependency>
 </dependencies>

Spring配置文件

在spring配置文件中设置dubbo的相关信息

<?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:context="http://www.springframework.org/schema/context"
    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://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.0.xsd 
    http://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="dubboProvider" />
    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry protocol="zookeeper" 
      address="192.168.88.171:2181,192.168.88.172:2181,192.168.88.173:2181"  />
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 启用monitor模块 -->
    <dubbo:monitor protocol="registry" />
    <bean id="userService" class="com.bobo.service.UserServiceImpl" />
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.bobo.service.UserService" ref="userService"
        group="dubbo"  version="1.0.0" timeout="3000"/>
</beans>

zookeeper的配置方式如下:

<dubbo:registry address="zookeeper://192.168.88.171:2181" />

或者

<dubbo:registry protocol="zookeeper" address="192.168.88.171:2181" />

如果有多个ip地址

<dubbo:registry address="zookeeper://192.168.88.171:2181?backup=192.168.88.172:2181,192.168.88.173:2181"  />

或者

<dubbo:registry protocol="zookeeper" 
      address="192.168.88.171:2181,192.168.88.172:2181,192.168.88.173:2181"  />

另外你还可以在同一个 Zookeeper 服务器上划分多个分组

<dubbo:registry id="registry1" protocol="zookeeper" address="10.20.153.10:2181" gr
oup="registry1" />
<dubbo:registry id="registry2" protocol="zookeeper" address="10.20.153.10:2181" gro
up="registry2" />

在同一个 Zookeeper 服务器上划分了两个分组,也就是会有两颗树目录,树根分别为 registry1 和 registry2。

UserServiceImpl

接口实现类

public class UserServiceImpl implements UserService {
  @Override
  public String sayHello(String name) {
     //让当前当前线程休眠2s
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("-------"+name);
        return name+"----000"; 
  }
  @Override
  public String testPojo(Person person) {
    System.out.println(person.getName()+"/t"+person.getId());
    return "你好啊...";
  }
}

log4j.properties

log4j.rootLogger=INFO,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout

测试启动

package com.bobo.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
  public static void main(String[] args) throws InterruptedException {
    ApplicationContext ac = 
        new ClassPathXmlApplicationContext("applicationContext.xml");
    //挂起当前线程,如果没有改行代码,服务提供者进程会消亡,服务消费者就发现不了提供者了
        Thread.currentThread().join();
  }
}

image.png

服务已经成功注册到了zookeeper中

在这里插入图片描述

2.3 consumer

pom.xml

引入相关的依赖

<dependencies>
  <!-- 依赖公共模块 -->
  <dependency>
    <groupId>com.bobo</groupId>
    <artifactId>dubbo-common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </dependency>
  <!-- 依赖Spring -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.21.RELEASE</version>
  </dependency>
  <!-- log4j的依赖 -->
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.25</version>
  </dependency>
  <!-- 引入dubbo框架(服务端、客户端通用) -->
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.5.3</version>
    <exclusions>
      <exclusion>
        <artifactId>spring</artifactId>
        <groupId>org.springframework</groupId>
      </exclusion>
    </exclusions>
  </dependency>
  <!-- 因为dubbo服务端需要注册服务到zk中,因此依赖zkClient包 -->
       <dependency>
           <groupId>com.github.sgroschupf</groupId>
           <artifactId>zkclient</artifactId>
           <version>0.1</version>
       </dependency>
</dependencies>

Spring配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
     xmlns:context="http://www.springframework.org/schema/context"
     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://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.0.xsd 
    http://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->    
    <dubbo:application name="dubboConsumer" />  
    <!-- 使用zookeeper注册中心暴露发现服务地址 -->    
    <dubbo:registry  protocol="zookeeper" 
      address="192.168.88.171:2181,192.168.88.172:2181,192.168.88.173:2181" />  
       <!-- 启动monitor-->
    <dubbo:monitor protocol="registry" />        
      <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->    
    <dubbo:reference id="userService" interface="com.bobo.service.UserService" 
      group="dubbo" version="1.0.0" timeout="3000"/>    
</beans>


log4j.properties

log4j.rootLogger=INFO,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout

TsetConsumer.java

package com.bobo.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bobo.service.UserService;
public class TestConsumer {
  public static void main(String[] args) {
        ClassPathXmlApplicationContext ac = 
            new ClassPathXmlApplicationContext("applicationContext.xml");
        final UserService demoService = (UserService) ac.getBean("userService");
        System.out.println(demoService.sayHello("哈哈哈"));
    }
}

测试输出

image.png

说明服务消费者已经正常调用了服务提供方的服务了!


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
6月前
|
Dubbo 应用服务中间件 API
启动dubbo消费端过程提示No provider available for the service的问题定位与解决
启动dubbo消费端过程提示No provider available for the service的问题定位与解决
51 0
|
9月前
|
Dubbo 应用服务中间件 Apache
集成Nacos1.2.1和Dubbo2.7.6 消费者报错No provider available for the service xxx
集成Nacos1.2.1和Dubbo2.7.6 消费者报错No provider available for the service xxx
91 0
|
Dubbo 应用服务中间件
Dubbo Provider Filter 配置约束
在项目开发过程中,遇到一个provider filter 配置了多个过滤类(xxx,xxx,xxx....),但是由于别名比较长,导致整个字符串过长,启动报错。
125 0
Dubbo Provider Filter 配置约束
|
Dubbo 应用服务中间件
Dubbo Consumer响应provider变化过程
开篇  这篇文章用于分析Dubbo在Provider发生变化时Consumer感知变化并更新invoker的过程,这篇文章不会分析provider到invoker之间的转换过程,这部分过程会有单独的文章进行分析。
923 0
|
Arthas 存储 编解码
Dubbo Provider 函数执行过程
在 Dubbo 系列文章的最后,我们回过头来看一下整个 RPC 过程是如何运作起来的,本文着重介绍整个调用链路中 Provider 的函数执行过程。
|
存储 Dubbo 应用服务中间件
Dubbo Consumer 发送请求
在 Dubbo 系列文章的最后,我们回过头来看一下整个 RPC 过程是如何运作起来的,本文着重介绍整个调用链路中 Consumer 发送请求的执行过程。
|
Dubbo Java 应用服务中间件
Dubbo Provider 接收请求
在 Dubbo 系列文章的最后,我们回过头来看一下整个 RPC 过程是如何运作起来的,本文着重介绍整个调用链路中 Provider 接收请求的执行过程。
|
Dubbo 应用服务中间件 Apache
Dubbo Provider 返回结果
在 Dubbo 系列文章的最后,我们回过头来看一下整个 RPC 过程是如何运作起来的,本文着重介绍整个调用链路中 Provider 返回结果的执行过程。
|
Dubbo Java 应用服务中间件
Dubbo Consumer 接收返回值
在 Dubbo 系列文章的最后,我们回过头来看一下整个 RPC 过程是如何运作起来的,本文着重介绍整个调用链路中 Consumer 接收返回值的执行过程。
|
XML 监控 Dubbo
com.alibaba.dubbo.rpc.RpcException: No provider available from registry stable.zk.scsite.net:2181异常解决
com.alibaba.dubbo.rpc.RpcException: No provider available from registry stable.zk.scsite.net:2181异常解决
5122 0