前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >idea使用Dubbo创建提供者消费者(7)

idea使用Dubbo创建提供者消费者(7)

作者头像
桑鱼
发布2020-03-17 15:34:07
4610
发布2020-03-17 15:34:07
举报

dubbo-helloworld

需求描述

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

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

模块

功能

订单服务web模块

创建订单

用户服务service模块

查询用户地址

订单服务web模块一般指的是对外HTTP服务,用户服务service模块一般指的是对外提供RPC服务

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

工程架构
  1. 分包 建议将服务接口,服务模型,服务异常等均放在API包中,因为服务模型及异常也是API的一部分,同时,这样做也符合分包原则:重用分布等价原则(REP),共用重用原则(CRP)-在本例中相当于gmall-interface工程,在gmall-interface工程提供了javabean和service 接口
  2. 粒度 服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo暂未提供分布式事务支持

服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸

创建服务提供者
  1. 使用idea 创建一个新的Maven Project
  1. 设置GroupId和ArtifactId,GroupId 一般为反转域名来定义,ArtifactId则是项目的具体名称
  1. 直接finish

4.在gmall下常见module,创建maven项目next

5.GroupId是创建project时加过的,ArtifactId是当前项目module的名称,点击next

  1. Module name尽量和第二步ArtifactId加的一样,没问题后Finsh,Module就创建成功了,在提供者的目录下创建具体接口实现

目录结构

user-service-provider用户模块:对用户接口的实现

UserServiceImpl:服务方提供实现接口(UserService) provider.xml:用 Spring 配置声明暴露服务 MainApplication:加载 Spring 配置

代码

代码语言:javascript
复制
// UserServiceImpl:服务方提供实现接口(UserService)
public class UserServiceImpl implements UserService {
    @Override
    public List<UserAddress> getUserAddressList(String userId){
        UserAddress address1 = new UserAddress(1,"北京","1","beijing","1234567891","Y");
        UserAddress address2 = new UserAddress(1,"上海","2","shanghai","1234567892","N");
        return Arrays.asList(address2,address1);
    }
}
代码语言:javascript
复制
// MainApplication:加载 Spring 配置
public class MainApplication {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");
        ioc.start();
        System.in.read();
    }
}
代码语言:javascript
复制
// pom.xml 
// 引入dubbo依赖
// 因为注册中心使用的是zookeeper,所以引入zookeeper依赖
// 引入gmall-interface依赖(使用bean和接口)
<?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">
    <parent>
        <artifactId>gmall-test-test</artifactId>
        <groupId>com.sangyu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sangyu</groupId>
    <artifactId>user-service-provider</artifactId>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>com.sangyu</groupId>
            <artifactId>gmall-interface</artifactId>
            <version>1.0-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>
代码语言:javascript
复制
// provider.xml
<?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">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="user-service-provider"  />

    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.sangyu.gmall.service.UserService" ref="UserServiceImpl" />

    <!-- 和本地bean一样实现服务 -->
    <bean id="UserServiceImpl" class="com.sangyu.gmall.service.impl.UserServiceImpl" />
</beans>
创建服务消费者

创建module过程和服务提供者不同,在gmall项目下创建module,并ArtifactId设置为order-service-consumer

目录结构

order-service-consumer订单模块:调用用户模块

OrderServiceImpl:服务方提供实现接口(UserService) consumer.xml:用 Spring 配置声明暴露服务 MainApplication:加载 Spring 配置

代码

代码语言:javascript
复制
// OrderServiceImpl:服务方提供实现接口(UserService)
@Service // 使用spring的注解将OrderServiceImpl注入到容器中
public class OrderServiceImpl implements OrderService {

    @Autowired //使用Autowired将UserService注入进来,UserService已经在consumer.xml配置后已经在容器中了
    UserService userService;

    @Override
    public void initOrder(String userId) {
        System.out.println("用户id:" + userId);

        List<UserAddress> addressList = userService.getUserAddressList(userId);

        for (UserAddress userAddress : addressList) {
            System.out.println(userAddress.getUserAddress());
        }

    }
}
代码语言:javascript
复制
// MainApplication:加载 Spring 配置
public class MainApplication {
    @SuppressWarnings("resource")
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext applicationContext =new ClassPathXmlApplicationContext("consumer.xml");
        OrderService orderService = applicationContext.getBean(OrderService.class);
        orderService.initOrder("1");
        System.out.println("调用完成");
        System.in.read();
    }
}
代码语言:javascript
复制
// consumer.xml:用 Spring 配置声明暴露服务
<?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.sangyu.gmall.service.impl"></context:component-scan>

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="order-service-consumer"  />

    <!-- 使用zookeeper广播注册中心暴露发现服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!--声明需要调用的远程服务的接口;生成远程服务代理  -->
    <dubbo:reference id="UserService" interface="com.sangyu.gmall.service.UserService" />
</beans>
代码语言:javascript
复制
// pom.xml
// 引入dubbo依赖
// 因为注册中心使用的是zookeeper,所以引入zookeeper依赖
// 引入gmall-interface依赖(使用bean和接口)
<?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">
    <parent>
        <artifactId>gmall-test-test</artifactId>
        <groupId>com.sangyu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sangyu</groupId>
    <artifactId>order-service-consumer</artifactId>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>com.sangyu</groupId>
            <artifactId>gmall-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
    </dependencies>
</project>
创建公共接口层

创建module过程和服务提供者不同,在gmall项目下创建module,并ArtifactId设置为gmall-interface,提供javabean和服务接口

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

目录结构

代码

代码语言:javascript
复制
// UserAddress类(javabean)
public class UserAddress {
    private Integer id;
    private String userAddress; // 用户地址
    private String userId; // 用户id
    private String consignee; // 收货人
    private String phoneNum; // 电话号码
    private String isDefault; // 是否为默认地址 Y-是 N-否
    public UserAddress() {
        super();
    }
    public UserAddress(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;
    }
    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;
    }
}
代码语言:javascript
复制
// 用户服务接口
public interface UserService {
    /**
     * 按照用户id返回所有的收获地址
     * @param userId
     * @return
     */
    public List<UserAddress> getUserAddressList(String userId);
}
代码语言:javascript
复制
// OrderService接口初始化订单
public interface OrderService {

    /**
     * 初始化订单
     * @param userId
     */
    public void initOrder(String userId);
}
测试运行

先运行服务提供者user-service-provider,再运行服务调用者order-service-provider,两者运行前要的保证zookeeper是运行状态

代码语言:javascript
复制
// 运行结果
用户id:1
上海
北京
调用完成
``
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • dubbo-helloworld
    • 工程架构
      • 测试运行
      相关产品与服务
      微服务引擎 TSE
      微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档