微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Dubbo学习

环境搭建

zookepper环境搭建

zookepper3.6.1下载

1、在zk 根目录创建data文件夹存放 数据

2、conf下zoo_sample.cfg 修改为zoo.cfg

3、配置认数据存储位置 dataDir=…/data

启动zk

zk服务运行 : cmd运行 bin下的zkServer.cmd

执行zk命令行: cmd bin下的zkCli.cmd

dubbo管理页面下载

https://github.com/apache/dubbo-admin

流程

dubbo快速开始

http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

项目构建

  • gmall-interface
  • order-service-consumser
  • user-service-provider

服务提供者

依赖

<dependencies>
  <dependency>
    <groupId>com.zxy.gmall</groupId>
    <artifactId>gmall-interface</artifactId>
    <version>0.0.1-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>

用spring.xml注入

<!-- 1.指定服务名(不要重名) -->
<dubbo:application name="user-service-provider"></dubbo:application>

<!-- 2.指定注册中心位置 -->
<dubbo:registry address="zookeeper://localhost:2181"></dubbo:registry>
<!-- 或者  <dubbo:registry protocol="zookeeper" address="localhost:2181"></dubbo:registry> -->

<!-- 指定通信协议(通信协议,通信端口) -->
<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>

<!-- 暴露服务 interface: 接口 ref: 真正实现的对象 -->
<dubbo:service interface="com.zxy.gmall.service.UserService" ref="userServiceImpl"></dubbo:service>

<bean id="userServiceImpl" class="com.zxy.gmall.service.impl.UserServiceImpl"></bean>

测试注册到zk中

public static void main(String[] args) throws IOException {
  ClasspathXmlApplicationContext ioc = new ClasspathXmlApplicationContext("classpath:provider.xml");
  ioc.start();
  system.in.read();
}

服务消费者

用spring.xml注入

<context:component-scan base-package="com.zxy.gmall"></context:component-scan>

<!-- 指定服务名 -->
<dubbo:application name="order-service-consumser" ></dubbo:application>

<!-- 指定注册中心地址 -->
<dubbo:registry address="zookeeper://localhost:2181"></dubbo:registry>

<!-- 声明需要调用的远程接口,位接口生成远程服务代理 -->
<dubbo:reference id="userService" interface="com.zxy.gmall.service.UserService"></dubbo:reference>

<!-- 配置监控中心 -->
<!-- 或者 <dubbo:monitor address="localhost:7070" ></dubbo:monitor> -->
<dubbo:monitor protocol="register"></dubbo:monitor>
  • 监控中心服务

测试远程调用

public static void main(String[] args) throws IOException {
  ClasspathXmlApplicationContext ioc = new ClasspathXmlApplicationContext("classpath:consumer.xml");
  OrderService bean = ioc.getBean(OrderService.class);
  System.out.println("ioc启动完成");
  bean.initOrder("1");
  System.out.println("调用完成");
  system.in.read();
}

springboot整合

starter

  • spring2.0以下版本使用0.1.0
<dependency>
  <groupId>com.alibaba.boot</groupId>
  <artifactId>dubbo-spring-boot-starter</artifactId>
  <version>0.2.0</version>
</dependency>
  • 消费者和提供者需要使用dubbo注解,要在配置类上加@Eanbledubbo

提供者

配置

server.port=8081

# 服务名
dubbo.application.name=boot-user-service-provider
# 注册中心
dubbo.registry.address=zookeeper://localhost:2181

# 服务端口
dubbo.protocol.name=dubbo 
dubbo.protocol.port=20880

# 监控中心
dubbo.monitor.protocol=registry

提供服务

使用@com.alibaba.dubbo.config.annotation.Service 暴露服务(注册服务)

@com.alibaba.dubbo.config.annotation.Service
@Service
public class UserServiceImpl implements UserService {
	@Override
	public List<UserAddress> getUserAddressList(String userId) {
		UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y");
		UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座3层(深圳分校)", "1", "王老师", "010-56253825", "N");
		return Arrays.asList(address1,address2);
	}
}

消费者

配置

server.port=8081
dubbo.application.name=boot-order-service-consumer
dubbo.registry.address=zookeeper://localhost:2181
dubbo.monitor.protocol=registry

消费服务

使用@com.alibaba.dubbo.config.annotation.Reference 发现服务

@Service
public class OrderServiceImpl implements OrderService 
	@Reference
	UserService userService;
	@Override
	public List<UserAddress> initOrder(String userId) {
		System.out.println("用户id:"+userId);
		//查询用户收货地址
		List<UserAddress> userAddressList = userService.getUserAddressList(userId);
		return userAddressList;
	}
}

配置加载顺序

官方示意图

  • 01.虚拟机参数 -Ddubbo.protocol.port=20880
  • 02.application.properties 中的 dubbo.protocol.port=20881
  • 03.dubbo.properties 中的 dubbo.protocol.port=20883

其他配置

配置优先原则

官方介绍

<dubbo:reference id="userService" interface="com.zxy.gmall.service.UserService">
  <dubbo:method name="getUserAddressList" timeout="5000"></dubbo:method>
</dubbo:reference>
<dubbo:service interface="com.zxy.gmall.service.UserService" ref="userServiceImpl">
  <dubbo:method name="getUserAddressList" timeout="5000"></dubbo:method>
</dubbo:service>
  • 03.消费方接口配置
<dubbo:reference id="userService" interface="com.zxy.gmall.service.UserService" timeout="5000"></dubbo:reference>
  • 04.服务接口配置
<dubbo:service id="userService" interface="com.zxy.gmall.service.UserService" timeout="5000"></dubbo:reference>
  • 05.消费方全局配置
<dubbo:consumer timeout="5000"></dubbo:consumer>
  • 06.提供方全局配置
<dubbo:provider timeout="5000"></dubbo:provider>

启动检查

启动时检查注册中心是否存在

<dubbo:registry address="zookeeper://localhost:2181" check="true"></dubbo:registry>

启动时检查服务是否存在

  • 全局服务
<!-- 消费者全局配置 -->
<dubbo:consumer check="false"></dubbo:consumer>
  • 单个服务
<dubbo:reference id="userService" interface="com.zxy.gmall.service.UserService" check="false"></dubbo:reference>
  • ckeck=“true” 启动时检查

true: 如果启是没有服务就抛出异常(在注册中心没有找到服务)

false: 启动时不检查, 如果消费者调用时没有服务在抛出异常(com.alibaba.dubbo.rpc.RpcException)

超时规则

认1000ms超时

  • 服务调用超时抛出异常(com.alibaba.dubbo.remoting.TimeoutException)
<dubbo:reference id="userService" interface="com.zxy.gmall.service.UserService" timeout="2000"  > <!--优先级 2-->
  <dubbo:method name="getUserAddressList" timeout="2000"></dubbo:method>  <!--优先级 1-->
</dubbo:reference>

<dubbo:consumer timeout="2000"></dubbo:consumer><!--优先级 3-->

重试次数

<dubbo:reference id="userService" interface="com.zxy.gmall.service.UserService" >
  <dubbo:method name="getUserAddressList" timeout="2000" retries="3"></dubbo:method>
</dubbo:reference>
  • 如果有多个服务 ,就会服务一次重试
    • 比如 20880 20881 20882
  • 幂等(设置重设次数)【查询修改删除】 、非幂等(不能设置重试次数)【新增】

负载均衡

  • 认 使用随机权重 weight 权重认值是100 设置的越大就越大机率使用该接口

在客户端指定

@Reference(loadbalance = "roundrobin")  //使用轮询

容错

@Service(cluster = "failback")  // 如果出现异常返回 null   (failsafe)

整合 Hystrix

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐