dubbo的入门学习(二)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: 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实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
6月前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
1月前
|
存储 负载均衡 监控
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
这篇文章是关于Apache Dubbo框架与Zookeeper的关系,以及如何下载、安装和启动Zookeeper的教程,包括解决启动过程中可能遇到的报错问题。
51 3
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
|
30天前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
1月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
79 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
1月前
|
Dubbo IDE Java
dubbo学习二:下载Dubbo-Admin管理控制台,并分析在2.6.1及2.6.1以后版本的变化
这篇文章是关于如何下载和部署Dubbo管理控制台(dubbo-admin)的教程,并分析了2.6.1版本及以后版本的变化。
41 0
dubbo学习二:下载Dubbo-Admin管理控制台,并分析在2.6.1及2.6.1以后版本的变化
|
2月前
|
Dubbo Java 应用服务中间件
分布式-dubbo的入门
分布式-dubbo的入门
|
6月前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
525 0
|
Dubbo Java 应用服务中间件
springboot + dubbo + zookeeper入门到实战超级详解
springboot + dubbo + zookeeper入门到实战超级详解
219 0
|
Dubbo Java 应用服务中间件
Netty入门到超神系列-手撸简单版RPC框架(仿Dubbo)
原理还是比较简单 : 代理 + 线程池 + Netty 下面做一些解释: 首先需要定义一个统一的API接口,例:UserApi , 服务端(provider)需要实现这个接口,提供相应的方法UserApiImpl#save,客户端通过远程来调用该接口。 然后需要约定一个协议,服务器如何才能识别到客户端要调用哪个接口?:我这里用 “接口权限定名#方法名#参数” ,的方式来,因为是一个简单版本的RPC。服务端解析该内容就能匹配对应的接口的实现类,然后调用该方法。并把方法的返回值通过Netty写回给客户端 使用的编解码器都是比价简单的String的编解码器
169 0
|
6月前
|
监控 负载均衡 Dubbo
分布式架构与Dubbo基础入门与实践
分布式架构与Dubbo基础入门与实践
63 1