dubbo的入门学习(二)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: dubbo的入门学习(二)

dubbo的入门学习(二)

需求:

某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址;

我们现在 需要创建两个服务模块进行测试

模块 功能
订单服务web模块 创建订单等
用户服务service模块 查询用户地址等

预期测试结果:

订单服务器web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能。

20200401134307494.png这里制作的案例,三个模块都是在本地,真实环境可能是订单web模块在一台服务器A上,用户服务模块在另一台服务器B上,用户服务模块远程调用订单web模块的功能。

环境准备

所需:zookeeper、dubbo-admin管理控制台

zookeeper下载:

https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/

dubbo-admin下载:

https://github.com/apache/incubator-dubbo-ops

详细配置查看上一篇博客。

https://blog.csdn.net/qq_36654629/article/details/90052052

先将本地的zookerper服务跑起来,进入zookeeper下的bin目录,点击zkServer运行

20200401134307494.png

成功跑起服务

20200401134307494.png

运行dubbo-admin

java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

20200401134307494.png

浏览器访问:127.0.0.1:7001

默认使用root/root 登陆

20200401134307494.png

创建模块

分别创建3个maven工程项目。

20200401134307494.png

gmall-interface模块:公共接口层(model,service,exception…)

作用:定义公共接口,也可以导入公共依赖。

20200401134307494.png

  • bean
package com.atguigu.gmall.bean;
import java.io.Serializable;
/**
 * 用户地址
 * @author jp
 *  */
public class UserAddress implements Serializable {
  private Integer id;
    private String userAddress; //用户地址
    private String userId; //用户id
    private String consignee; //收货人
    private String phoneNum; //电话号码
    private String isDefault; //是否为默认地址    Y-是     N-否
    public UserAddress() {
    super();
    // TODO Auto-generated constructor stub
  }
  public UserAddress(Integer id, String userAddress, String userId, String consignee, String phoneNum,
      String isDefault) {
    super();
    this.id = id;
    this.userAddress = userAddress;
    this.userId = userId;
    this.consignee = consignee;
    this.phoneNum = phoneNum;
    this.isDefault = isDefault;
  }
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getUserAddress() {
    return userAddress;
  }
  public void setUserAddress(String userAddress) {
    this.userAddress = userAddress;
  }
  public String getUserId() {
    return userId;
  }
  public void setUserId(String userId) {
    this.userId = userId;
  }
  public String getConsignee() {
    return consignee;
  }
  public void setConsignee(String consignee) {
    this.consignee = consignee;
  }
  public String getPhoneNum() {
    return phoneNum;
  }
  public void setPhoneNum(String phoneNum) {
    this.phoneNum = phoneNum;
  }
  public String getIsDefault() {
    return isDefault;
  }
  public void setIsDefault(String isDefault) {
    this.isDefault = isDefault;
  }
}
  • Service接口
    UserService:
package com.atguigu.gmall.service;
import java.util.List;
import com.atguigu.gmall.bean.UserAddress;
/**
 * 用户服务
 * @author jp
 *
 */
public interface UserService {
  /**
   * 按照用户id返回所有的收货地址
   * @param userId
   * @return
   */
  public List<UserAddress> getUserAddressList(String userId);
}

OrderService

package com.atguigu.gmall.service;
import java.util.List;
import com.atguigu.gmall.bean.UserAddress;
public interface OrderService {
  /**
   * 初始化订单
   * @param userId
   */
  public List<UserAddress> initOrder(String userId);
}

gmall-user:用户模块(作为服务提供者,对用户接口的实现)

20200401134307494.png

pom.xml

<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.atguigu.gmall</groupId>
  <artifactId>user-server</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
    <!-- 引入gmall-interface -->
   <dependency>
   <artifactId>gmall-interface</artifactId>
   <groupId>com.atguigu.gmall</groupId>
    <version>0.0.1-SNAPSHOT</version>
   </dependency>
  <!-- 引入dubbo -->
  <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.6.2</version>
    </dependency>
      <!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-framework</artifactId>
      <version>2.12.0</version>
    </dependency>
  </dependencies>
</project>
  • service
package com.atguigu.gmall.service.impl;
import java.util.Arrays;
import java.util.List;
import com.atguigu.gmall.bean.UserAddress;
import com.atguigu.gmall.service.UserService;
public class UserServiceImpl implements UserService{
  public List<UserAddress> getUserAddressList(String userId) {
    // TODO Auto-generated method stub
    System.out.println("UserServiceImpl.....old...");
    // TODO Auto-generated method stub
    UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y");
    UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座3层(深圳分校)", "1", "王老师", "010-56253825", "N");
    /*try {
      Thread.sleep(4000);
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }*/
    return Arrays.asList(address1,address2);
  }
}

使用dubbo 改造gmall-user作为服务提供者,创建一个provider。xml文件

20200401134307494.png

<?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://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <!-- 1.指定当前服务/应用名字(同样的服务名字相同,不要和别的服务同名 -->
    <dubbo:application name="user-provider"  />
    <!-- 2.指定注册中心的位置 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <!-- 3.指定通信规则(通信协议、通信端口) -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 4. 声明需要暴露的服务接口   ref指向服务的真正实现-->
    <dubbo:service interface="com.atguigu.gmall.service.UserService" ref="userService" />
    <!-- 5.服务的实现 -->
    <bean id="userService" class="com.atguigu.gmall.service.impl.UserServiceImpl" />
</beans>
  • MainApplication.java 启动服务
package com.atguigu.gmall.service.impl;
import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApplication {
  public static void main(String[] args) throws IOException {
  ClassPathXmlApplicationContext ioc= new ClassPathXmlApplicationContext("provider.xml");
  ioc.start(); //启动容器
  System.in.read();  //阻塞一下
  }
}

运行MainApplication.java后可以在dubbo-admin 首页看到,有一个服务数。

20200401134307494.png

点击服务管理->提供者可以看到有一个服务提供者

20200401134307494.png

点击IP可以看到服务的详细信息

image.png

gmall-order-web:订单模块(作为服务消费者,调用用户模块):

image.png

pom.xml 引入 gmall-interface

<dependencies>
    <dependency>
      <groupId>com.atguigu.dubbo</groupId>
      <artifactId>gmall-interface</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
   </dependencies>
  • Service
package com.atguigu.gmall.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.atguigu.gmall.bean.UserAddress;
import com.atguigu.gmall.service.OrderService;
import com.atguigu.gmall.service.UserService;
@Service
public class OrderServiceImpl implements OrderService{
  @Autowired
  UserService userService;
  public List<UserAddress> initOrder(String userId) {
    // TODO Auto-generated method stub
    System.out.println("用户id:"+userId);
    //1、查询用户的收货地址
    List<UserAddress> addressList = userService.getUserAddressList(userId);
    for (UserAddress userAddress : addressList) {
      System.out.println(userAddress.getUserAddress());
    }
    return addressList;
  }
}

配置消费者信息,创建consumer.xml

20200401134307494.png

<?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://dubbo.apache.org/schema/dubbo"
  xmlns:context="http://www.springframework.org/schema/context"
  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.3.xsd
    http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
    http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  <context:component-scan base-package="com.atguigu.gmall.service.impl"></context:component-scan>
    <!-- 1.申明消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="consumer-provider"  />
    <!--2. 使用zookeeper广播注册中心暴露发现服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <!--3. 声明需要调用的远程服务 -->
    <dubbo:reference id="userService" interface="com.atguigu.gmall.service.UserService" />
</beans>

消费服务调用

  • MainApplication.java
package com.atguigu.gmall.service.impl;
import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.atguigu.gmall.service.OrderService;
public class MainApplication {
  public static void main(String[] args) throws IOException {
    ClassPathXmlApplicationContext ioc=new ClassPathXmlApplicationContext("consumer.xml");
    OrderService orderService=ioc.getBean(OrderService.class);
    orderService.initOrder("1");
    System.in.read();
  }
}

测试结果:

运行MainApplication.java可以在控制台看到,获取到的用户地址信息。说明订单模块调用到了用户模块的方法,获取到了用户信息。

20200401134307494.png

并能在dubbo-admin服务治理-》应用里查看到

20200401134307494.png

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
19天前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
20天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
|
9月前
|
Dubbo Java 应用服务中间件
springboot + dubbo + zookeeper入门到实战超级详解
springboot + dubbo + zookeeper入门到实战超级详解
129 0
|
10月前
|
Dubbo Java 应用服务中间件
Netty入门到超神系列-手撸简单版RPC框架(仿Dubbo)
原理还是比较简单 : 代理 + 线程池 + Netty 下面做一些解释: 首先需要定义一个统一的API接口,例:UserApi , 服务端(provider)需要实现这个接口,提供相应的方法UserApiImpl#save,客户端通过远程来调用该接口。 然后需要约定一个协议,服务器如何才能识别到客户端要调用哪个接口?:我这里用 “接口权限定名#方法名#参数” ,的方式来,因为是一个简单版本的RPC。服务端解析该内容就能匹配对应的接口的实现类,然后调用该方法。并把方法的返回值通过Netty写回给客户端 使用的编解码器都是比价简单的String的编解码器
119 0
|
5月前
|
Dubbo Java 应用服务中间件
分布式应用简单入门及SpringBoot整合Dubbo+Zookeeper
分布式应用简单入门及SpringBoot整合Dubbo+Zookeeper
48 1
|
6月前
|
Dubbo Java 应用服务中间件
微服务技术系列教程(29) - Dubbo-介绍&环境安装&入门案例
微服务技术系列教程(29) - Dubbo-介绍&环境安装&入门案例
57 0
|
10月前
|
SpringCloudAlibaba Dubbo 网络协议
十二.SpringCloudAlibaba极简入门-集成dubbo
在之前 《什么是 Spring Cloud Alibaba》一文中我们有介绍过Dubbo,除了SpringCloud以外,Dubbo它也是用来作为微服务架构落地的成熟解决方案,并且它在服务通信上比SpringCloud性能更高,这取决于它的底层实现是基于原生的TCP协议,它的定位就是一款高性能的RPC(远程过程调用)框架,所以在国内很多的企业都选择Dubbo作为微服务框架,本文章的目的是帮助同学们将Dubbo这款高性能的RPC框架集成到SpringCloud中,真正实现SpringCloud 和 Dubbo的混用。
|
10月前
|
分布式计算 监控 Dubbo
【e3项目学习二】——zk与dubbo的组合运用
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。使用dubbo-2.3.3以上版本,建议使用zookeeper注册中心。
|
12月前
|
缓存 负载均衡 监控
Dubbo-入门指南+实例
Dubbo-入门指南+实例
49 0
|
12月前
|
XML 负载均衡 监控
终于有人从入门到实战把Dubbo讲的这么清清楚楚了
很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的,但是,其实了解技术的来由及背景知识,对于理解一项技术还是有帮助的,那么,dubbo是怎么被提上日程的呢?