四、Dubbo——Demo

1 dubbo-helloworld xml版
1)需求
某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址;我们现在 需要创建两个服务模块进行测试

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

测试预期结果:订单服务web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能。

2)工程架构
根据 dubbo《服务化最佳实践》
(1)分包
建议将服务接口,服务模型,服务异常等均放在 API 包中,因为服务模型及异常也是 API 的一部分,同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。如果需要,也可以考虑在 API 包中放置一份 spring 的引用配置,这样使用方,只需在 spring 加载过程中引用此配置即可,配置建议放在模块的包目录下,以免冲突,如:com/alibaba/china/xxx/dubbo-reference.xml。

(2)粒度
服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo 暂未提供分布式事务支持。服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸。不建议使用过于抽象的通用接口,如:Map query(Map),这样的接口没有明确语义,会给后期维护带来不便。

在这里插入图片描述

3)创建空工程,新建3个模块
(1)新建一个empty project (maven)
新建3个moudle(maven)
order-service(具体实现)
user-service(具体实现)
common-interface(提取所有的接口和bean)
配置好maven环境变量

(2)user-service moudle
a)添加maven依赖

<dependencies>
    <!-- 引入dubbo -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.6.2</version>
    </dependency>
	<!-- 由于我们使用zookeeper作为注册中心,所以需要操作zookeeper
dubbo 2.6以前的版本引入zkclient操作zookeeper 
dubbo 2.6及以后的版本引入curator操作zookeeper
下面两个zk客户端根据dubbo版本2选1即可
-->
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.10</version>
    </dependency>
    <!-- curator-framework -->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>2.12.0</version>
    </dependency>

    <dependency>
        <groupId>com.tang</groupId>
        <artifactId>common-interface</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

b )新建UserAddress Bean模型

public class UserAdress implements Serializable {
    private Integer id;
    private String userAddress;
    private String userId;
    private String consignee;
    private String phoneNum;
    private String isDefault;

    public UserAdress(Integer id, String userAddress, String userId, String consignee, String phoneNum, String isDefault) {
        this.id = id;
        this.userAddress = userAddress;
        this.userId = userId;
        this.consignee = consignee;
        this.phoneNum = phoneNum;
        this.isDefault = isDefault;
    }
}

c )编写UserService接口以及UserServiceImpl实现类

public interface UserService {

    public List<UserAdress> getUserAddressList(String userId);

}

public class UserServiceImpl implements UserService {

    public List<UserAdress> getUserAddressList(String userId){

        UserAdress u1=new UserAdress(1,"ezhou","123","","15168242649","y");
        UserAdress u2=new UserAdress(1,"ezhou","123","","15168242649","y");
        return Arrays.asList(u1,u2);
    }

}

d)新建provider.xml配置文件(dubbo服务提供者配置),编辑文件
参考开发文档:dubbo.apache.org/zh-cn/docs/user/quick-start.html

<?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://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.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">

    <!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) -->
    <dubbo:application name="userserviceprovider"></dubbo:application>

    <!-- 2、指定注册中心的位置 -->
    <!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>

    <!-- 3、指定通信规则(通信协议?通信端口) -->
    <dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>

    <!-- 4、暴露服务   ref:指向服务的真正的实现对象 -->
    <dubbo:service interface="com.service.UserService"
                   ref="userService">
       <!-- <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> -->
    </dubbo:service>

    <!--统一设置服务提供方的规则  -->
    <dubbo:provider timeout="1000"></dubbo:provider>

    <!-- 服务的实现 -->
    <bean id="userService" class="com.tang.service.impl.UserServiceImpl"></bean>

</beans>

e)编写测试代码UserApplication

新建 UserApplication

public class UserApplication {

    public static void main(String[] args) throws IOException{
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("classpath:provider.xml");
        System.in.read();

    }
}

f)启动user-service 进行测试
查看dubbo服务管理界面是否有对应的服务提供者,具体参考https://mp.csdn.net/mdeditor/95346703#

在zk安装bin目录下 启动zkServer脚本
java -jar 执行dubbo-admin的maven打包文件
localhost:7001访问
在这里插入图片描述

(3) order-service moudle 订单模块(调用用户模块)

a ) 添加maven依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tang</groupId>
    <artifactId>order-service</artifactId>
    <version>1.0-SNAPSHOT</version>
<dependencies>
    <dependency>
        <groupId>com.tang</groupId>
        <artifactId>common-interface</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.6.2</version>
    </dependency>

    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.10</version>
    </dependency>
    <!-- curator-framework -->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>2.12.0</version>
    </dependency>
</dependencies>

b)编写OrderService接口以及OrderServiceImpl实现

public interface OrderService {

    /**
     * 初始化订单,查询用户的所有地址并返回
     * @param userId
     * @return
     */
    public List<UserAdress> initOrder(String userId);
}

@Service
public class OrderServiceImpl implements OrderService {
    @Resource
    UserService userService;

    /**
     * 初始化订单,查询用户的所有地址并返回
     * @param userId
     * @return
     */
    public List<UserAdress> initOrder(String userId){

        return userService.getUserAddressList(userId);
    }
}

c)编写consumer.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>


<context:component-scan base-package=“com.service.impl”></context:component-scan>

<dubbo:application name=“orderserviceconsumer”></dubbo:application>

<!-- 2、指定注册中心的位置 -->
<!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
<dubbo:reference id="userService" interface="com.service.UserService"></dubbo:reference>

d)编写测试代码

public class OrderApplication {
    public static void main(String[] args) throws IOException{
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("classpath:consumer.xml");
        OrderService orderService =context.getBean(OrderService.class);
        List<UserAdress> address=orderService.initOrder("1");
        System.out.println(address.get(0).toString());
        System.in.read();
    }
}

e) 测试调用
访问orderService的initOrder请求,会调用UserService获取用户地址;
调用成功。说明我们order已经可以调用远程的UserService了;
目前无法调用,因为UserAdress与UserService在用户moudel工程中,需要将这些被第三方调用的接口和bean单独提取出来作为一个moudel工程为其他调用者提供maven依赖

(4)common-interface modile 公共接口层(bean,service,exception…)
作用:定义公共接口,也可以导入公共依赖
a)将user-service moule中的接口和bean实体提取到common-interface modile
b)将order-service moule中的接口和bean实体提取到common-interface modile
c ) 将 common-interface modile 的maven 坐标信息添加到 user-service moule和
order-service moule 的pom.xml文件中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(5)启动 user-service,order-service
查看dubbo服务管理界面
在这里插入图片描述
在这里插入图片描述

2 注解版
与xml版基本相同,不同的地方如下
1)服务提供方
<dubbo:application name=“gmall-user”></dubbo:application>
<dubbo:registry address=“zookeeper://localhost:2181” />
<dubbo:protocol name=“dubbo” port=“20880” />
<dubbo:annotation package=“com.atguigu.gmall.user.impl”/>需要暴露的接口的包
import com.alibaba.dubbo.config.annotation.Service;
import com.atguigu.gmall.bean.UserAddress;
import com.atguigu.gmall.service.UserService;
import com.atguigu.gmall.user.mapper.UserAddressMapper;

@Service //使用dubbo提供的service注解,注册暴露服务
public class UserServiceImpl implements UserService {

@Autowired
UserAddressMapper userAddressMapper;

2 ) 服务消费方
<dubbo:application name=“gmall-order-web”></dubbo:application>
<dubbo:registry address=“zookeeper://118.24.44.169:2181” />
<dubbo:annotation package=“com.atguigu.gmall.order.controller”/>需要调用的接口的包

@Controller
public class OrderController {

@Reference  //使用dubbo提供的reference注解引用远程服务
UserService userService;
Dubbo是一个分布式服务框架,可以实现服务的注册与发现、远程通信、负载均衡等功能。为了学习和使用Dubbo,我们可以搭建一个Dubbo demo来进行实践。 首先,我们需要准备好开发环境。我们可以使用Maven构建项目,代码使用Java编写。可以选择任意一个Java开发工具,比如Eclipse或者IntelliJ IDEA。 接下来,我们需要下载Dubbo的安装包。可以从Dubbo的官方网站上进行下载,选择适合自己的版本。然后解压到本地目录。 然后,我们创建一个Maven项目,并在pom.xml文件中添加Dubbo的依赖。可以在Dubbo的安装包中找到pom.xml的路径,将其复制到我们的项目中。 在项目中创建一个服务提供者和一个服务消费者的模块。服务提供者是一个提供服务的服务端,服务消费者是一个调用服务的客户端。 在服务提供者模块中,我们需要定义一个接口,并实现该接口。接口定义了服务的功能,实现类为具体的业务逻辑。 在服务消费者模块中,我们需要配置Dubbo的相关信息,比如注册中心的地址以及要消费的服务提供者的接口。然后我们可以通过调用该接口的方法来使用远程服务。 最后,我们分别启动服务提供者和服务消费者模块。可以通过命令行或者在开发工具中直接运行。 通过以上的步骤,我们就成功搭建了一个Dubbo demo。我们可以在服务提供者和服务消费者之间进行远程调用,并观察调用结果。这个demo可以帮助我们理解和学习Dubbo的基本使用方法和原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值