Dubbo实战_08_创建公共项目、提供者项目

目录

一、提出需求

二、工程架构

三、创建模块

1、写公共接口层(model,service,exception…)

(1)实体bean

(2)Service接口

2、写服务-提供者(对用户模块接口的实现)

(1)引入pom文件依赖:公共接口项目、dubbo、zookeeper

(2)写服务-提供者实现类(用户)

(3)用 Spring 配置声明暴露服务-提供者

四、运行演示

1、 加载 Spring 配置文件 provider.xml

2、查看 dubbo-admin 管理控制台

服务

应用

提供者

五、其他说明(idea 项目引入公共模块)

1、进入project structure界面

2、导入依赖的公共组件代码 

3、把导入的项目工程作为依赖


一、提出需求

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

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

模块

功能

订单服务web模块

创建订单等

用户服务service模块

查询用户地址等

测试预期结果:

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

二、工程架构

根据 dubbo《服务化最佳实践》

1、分包

建议将服务接口,服务模型,服务异常等均放在 API 包中,因为服务模型及异常也是 API 的一部分,同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。

如果需要,也可以考虑在 API 包中放置一份 spring 的引用配置,这样使用方,只需在 spring 加载过程中引用此配置即可,配置建议放在模块的包目录下,以免冲突,如:com/alibaba/china/xxx/dubbo-reference.xml。

2、粒度

服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo 暂未提供分布式事务支持。

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

不建议使用过于抽象的通用接口,如:Map query(Map),这样的接口没有明确语义,会给后期维护带来不便。

三、创建模块

1、写公共接口层(model,service,exception

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

说明:

查询用户的收货地址
//如果把 用户模块 项目打成jar包,直接依赖进来!
//那么这就不是分布式开发了,它是单体应用模式!
//有可能除了订单应用,其他应用也需要用户接口,总不能每个应用都写一遍代码,
//既麻烦又冗余,如上面官网也建议我们分包,把公共的放在一起。
//所以我们可以把 bean文件和service接口 提取放公共工程里面

(1)实体bean

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;
	}
	
	
}

(2)Service接口

OrderService
public interface OrderService {
	
	/**
	 * 初始化订单
	 * @param userId
	 */
	public List<UserAddress> initOrder(String userId);

}
UserService
public interface UserService {
	
	/**
	 * 按照用户id返回所有的收货地址
	 * @param userId
	 * @return
	 */
	public List<UserAddress> getUserAddressList(String userId);

}

2、写服务-提供者(对用户模块接口的实现)

(1)引入pom文件依赖:公共接口项目、dubbo、zookeeper

        <!--设置依赖调用公共模块代码-->
        <!--eclipse依赖方式-->
        <!--<dependency>
            <groupId>com.atguigu.gmall</groupId>
            <artifactId>gmall-interface</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>-->
        
        <!--IDEA依赖方式
        https://blog.csdn.net/ylforever/article/details/109140991-->


        <!-- 引入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>

(2)写服务-提供者实现类(用户)

UserServiceImpl
public class UserServiceImpl implements UserService {

	@Override
	public List<UserAddress> getUserAddressList(String userId) {
		System.out.println("UserServiceImpl......");
		// TODO Auto-generated method stub
		UserAddress address1 = new UserAddress(1, "北京市昌平区xxx",
				"1", "李老师", "010-56253825", "Y");
		UserAddress address2 = new UserAddress(2, "深圳市宝安区xxx",
				"1", "王老师", "010-56253825", "N");

		return Arrays.asList(address1,address2);
	}

}

(3)用 Spring 配置声明暴露服务-提供者

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://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="user-service-provider-yyh"></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="20880"></dubbo:protocol>
	
	<!-- 4、暴露服务
	interface:暴露的接口
	ref:指向服务的真正的实现对象 -->
	<dubbo:service interface="com.atguigu.gmall.service.UserService" 
		ref="userServiceImpl01">
	</dubbo:service>

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

</beans>

四、运行演示

1、 加载 Spring 配置文件 provider.xml

MainApplication
public class MainApplication {
	
	public static void main(String[] args) throws IOException {
		ClassPathXmlApplicationContext ioc =
				new ClassPathXmlApplicationContext("provider.xml");
		ioc.start();
		
		System.in.read();//按任意键退出
	}

}

2、查看 dubbo-admin 管理控制台

服务

应用

提供者

五、其他说明(idea 项目引入公共模块

可参考: https://blog.csdn.net/ylforever/article/details/109140991

1、进入project structure界面

2、导入依赖的公共组件代码 

     

找到工程目录

指定构建模式

3、把导入的项目工程作为依赖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值