一、SpringBoot快速集成Dubbo(基于zk)
1.1 服务提供者
1.1.1 部署zookeeper
1.1.2 添加依赖
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>chd-2.7.3-v1.0.4</version></dependency><dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version></dependency><dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.0.1</version></dependency><dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.0.1</version></dependency><!--zk--><dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.13</version> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions></dependency>1.1.3 添加配置
dubbo.application.id=dubbo-providerdubbo.application.name=dubbo-providerdubbo.registry.id=zk-registrydubbo.registry.protocol=zookeeperdubbo.registry.address=zookeeper://127.0.0.1:2181?client=curatordubbo.registry.group=groupdubbo.registry.username=userdubbo.registry.password=pwddubbo.scan.base-packages=com.dubbo.demo.servicedubbo.protocol.id=dubbodubbo.protocol.name=dubbodubbo.protocol.port=36321dubbo.provider.timeout=6000dubbo.provider.status=threadpooldubbo.consumer.check=falsedubbo.consumer.timeout=6000dubbo.consumer.retries=01.1.4 添加注解
在启动类加上@EnableDubbo注解
1.1.5 把接口单独封装为api模块,打包部署
1.1.6 实现类添加注解
实现类添加@Service注解,注意是dubbo包的注解,非spring包下的注解
1.2 服务消费者
1.2.1 添加公共api的依赖
1.2.2 添加依赖
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>chd-2.7.3-v1.0.4</version></dependency><dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version></dependency><dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.0.1</version></dependency><dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.0.1</version></dependency><!--zk--><dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.13</version> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions></dependency>1.2.3 添加配置
dubbo: application: id: dubbo-consumer name: dubbo-consumer scan: base-packages: com.dubbo.demo protocol: id: dubbo name: dubbo port: 36322 registry: id: zk-registry protocol: zookeeper address: zookeeper://127.0.0.1:2181?client=curator group: group username: user password: pwd provider: timeout: 6000 status: threadpool # filter: aliFilter consumer: check: false timeout: 6000 retries: 01.2.4 调用
@Referenceprivate UserService userService;二、Dubbo流量隔离
2.1 背景
如果一个应用有多个版本在线上同时运行,部署在不同环境中,如日常环境和特殊环境,则 可以使用标签路由对不同环境中的不同版本进行流量隔离,将秒杀订单流量或不同渠道订单流量路由到特殊环境,将正常的流量路由到日常环境。即使特殊环境异常,本应进入特殊环境的流量也不会进入日常环境,不影响日常环境的使用。
2.2 原理
将服务提供者进行分组,约束流量只在指定分组中流转,从而实现流量隔离的目的,有两种方式可以完成实例分组,分别是动态规则打标和静态规则打标
2.3 Dubbo-Admin 动态进行流量隔离
Dubbo提供动态流量隔离的服务治理能力,可以在无需重启应用的情况下,动态进行流量隔离。
2.3.1 创建标签路由规则
在Dubbo-Admin左侧导航栏选择服务治理 > 标签路由,点击创建按钮,在创建新标签规则面板中,填写规则内容,然后单击保存。
force=false: 当路由结果为空,降级请求tag为空的提供者。
force=true: 当路由结果为空,直接返回异常。
enabled=true 当前路由规则是否生效,缺省生效。
runtime=false 是否在每次调用时执行路由规则,否则只在提供者地址列表变更时预先执行并缓存结果,调用时直接从缓存中获取路由结果。如果用了参数路由,必须设为 true,需要注意设置会影响调用的性能,缺省为 false。
tags定义具体的标签分组内容,可定义任意n(n>=1)个标签并为每个标签指定实例列表。其中name为标签名称
所有实例:addresses: ["0.0.0.0"] 或addresses: ["0.0.0.0:*"]
指定实例:addersses[实例地址列表]
2.3.2 运行多个服务提供者
当前例子中运行两个服务提供者,分别是192.168.0.1:20881和192.168.0.2:20882
2.3.3 服务消费者添加标签属性
方式一:每个调用方法中添加如下代码
RpcContext.getContext().setAttachment("dubbo.tag","tag1");方式二:添加应用级别配置
dubbo: consumer: tag: tag1之后当前消费者只会调用相同tag的provider,若没有匹配到,则根据force配置直接返回异常或请求tag为空的提供者
2.4 静态规则打标
2.4.1 服务提供者
2.4.1.1 服务级别
<dubbo:provider tag="tag1"/>或
<dubbo:service tag="tag1"/>2.4.1.2 应用级别
dubbo: provider: tag: tag12.4.2 服务消费者
见2.3.3