学习Dubbo笔记(三)

6 篇文章 0 订阅
5 篇文章 0 订阅

前言

此模块笔记是记录本人自学Dubbo用来方便网络观看的,不做任何商业用途。网上有相应的CSDN博客项目视频来自B站尚硅谷https://www.bilibili.com/video/BV1ns411c7jV?from=search&seid=10791429353725410478

一、Dubbo项目实战应用

1.1 需求

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

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

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

1.2 工程架构

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

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

1.3 创建模块

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

1、Bean模型
public class UserAddress implements Serializable{
    private Integer id;
    private String userAddress;
    private String userId;
    private String consignee;
    private String phoneNum;
    private String isDefault;
}
1.1、Service接口
UserService public List<UserAddress> getUserAddressList(String userId)

2、 gmall-user:用户模块(对用户接口的实现)

1、pom.xml
  <dependencies>
  	<dependency>
  		<groupId>com.atguigu.dubbo</groupId>
  		<artifactId>gmall-interface</artifactId>
  		<version>0.0.1-SNAPSHOT</version>
  	</dependency>
  </dependencies>
2、Service
public class UserServiceImpl implements UserService {
		
	@Override
	public List<UserAddress> getUserAddressList(String userId) {
		// TODO Auto-generated method stub
		return userAddressDao.getUserAddressById(userId);
	}

}

3、gmall-order-web:订单模块(调用用户模块)

1、pom.xml
<dependencies>
  	<dependency>
  		<groupId>com.atguigu.dubbo</groupId>
  		<artifactId>gmall-interface</artifactId>
  		<version>0.0.1-SNAPSHOT</version>
  	</dependency>
   </dependencies>
2、测试
public class OrderService {
	
	UserService userService;
	
	/**
	 * 初始化订单,查询用户的所有地址并返回
	 * @param userId
	 * @return
	 */
	public List<UserAddress> initOrder(String userId){
		return userService.getUserAddressList(userId);
	}

}

现在这样是无法进行调用的。我们gmall-order-web引入了gmall-interface,但是interface的实现是gmall-user,我们并没有引入,而且实际他可能还在别的服务器中。

1.4 使用dubbo改造

1、改造gmall-user作为服务提供者

1、引入dubbo
		<!-- 引入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版本21即可
	-->
		<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>
2、配置提供者
<!--当前应用的名字  -->
	<dubbo:application name="gmall-user"></dubbo:application>
	<!--指定注册中心的地址  -->
    <dubbo:registry address="zookeeper://118.24.44.169:2181" />
    <!--使用dubbo协议,将服务暴露在20880端口  -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 指定需要暴露的服务 -->
    <dubbo:service interface="com.atguigu.gmall.service.UserService" ref="userServiceImpl" />
3、启动服务
	public static void main(String[] args) throws IOException {
		ClassPathXmlApplicationContext context = 
				new ClassPathXmlApplicationContext("classpath:spring-beans.xml");
		
		System.in.read(); 
	}

2、改造gmall-order-web作为服务消费者

1、引入dubbo
		<!-- 引入dubbo -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.6.2</version>
		</dependency>
	<!-- 由于我们使用zookeeper作为注册中心,所以需要引入zkclient和curator操作zookeeper -->
		<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>
2、配置消费者信息
<!-- 应用名 -->
	<dubbo:application name="gmall-order-web"></dubbo:application>
	<!-- 指定注册中心地址 -->
	<dubbo:registry address="zookeeper://118.24.44.169:2181" />
	<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
	<dubbo:reference id="userService" interface="com.atguigu.gmall.service.UserService"></dubbo:reference>

3、测试调用
访问gmall-order-web的initOrder请求,会调用UserService获取用户地址;
调用成功。说明我们order已经可以调用远程的UserService了;

1.5 注解版

1、服务提供方
	<dubbo:application name="gmall-user"></dubbo:application>
    <dubbo:registry address="zookeeper://118.24.44.169: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;

1.6 监控中心

1.dubbo-admin

图形化的服务管理页面;安装时需要指定注册中心地址,即可从注册中心中获取到所有的提供者/消费者进行配置管理

2.dubbo-monitor-simple
2.1 下载 dubbo-ops https://github.com/apache/incubator-dubbo-ops

2.2 修改配置指定注册中心地址
进入 dubbo-monitor-simple\src\main\resources\conf
修改 dubbo.properties文件
在这里插入图片描述
2.3 打包dubbo-monitor-simple
mvn clean package -Dmaven.test.skip=true

2.4 解压 tar.gz 文件,并运行start.bat
在这里插入图片描述
2.5 启动访问8080
在这里插入图片描述
2.6 监控中心配置

所有服务配置连接监控中心,进行监控统计
    <!-- 监控中心协议,如果为protocol="registry",
    	 表示从注册中心发现监控中心地址,否则直连监控中心 -->
	<dubbo:monitor protocol="registry"></dubbo:monitor>

Simple Monitor 挂掉不会影响到 Consumer 和 Provider 之间的调用,所以用于生产环境不会有风险。
Simple Monitor 采用磁盘存储统计信息,请注意安装机器的磁盘限制,如果要集群,建议用mount共享磁盘。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值