Dubbo使用
- 上一章已经初步了解了Dubbo 下面开始进行Dubbo的使用
一、搭建zookeeper 环境
- zookeeper下载地址: http://archive.apache.org/dist/zookeeper/
- 本次采用 zookeeper-3.3.6 版本
- 下载完成之后进入conf目录
- 先把 zoo-sample.cfg拷贝一份 以防万一
- 修改 zoo-sample.cfg 为 zoo.cfg
- 进入到bin目录右键使用管理员身份运zkServer.cmd 启动zookeeper服务端
- 也可以使用 zkCli.cmd 进行连接测试 右键管理员身份运行
二、构建dubbo-admin面板
- 去GitHub下载/克隆dubbox项目
- 下载完的目录结构
- 这就是个 maven项目
不会使用Maven的话 请参考 Maven的简单使用
-
使用 maven命令进行打包项目
mvn clean package -Dmaven.test.skip=true #使用maven命令清理并打包 跳过测试
- 漫长的等待~
-
出现 BUILD SUCCESS 即为打包成功!
-
进入 dubbo-admin/target 目录 找到 dubbo-admin-2.8.4.war
-
把改war包复制至tomcat的webapps目录下
- 建议使用 tomcat8
-
一定要先开启zookeeper才可以开启dubbo-admin哦!
- 输入 账号:root 密码 root 即可进入 dubbo-admin面板
- dubbo-admin安装成功 !
三、 使用SpringBoot 构建简单的Dubbo项目
环境准备
- IDEA
- Zookeeper3.3.6
- dubbo-admin管理面板
- maven环境
dubbo项目讲究分层架构
所以我们找个合适的位置创建一个空文件夹
- 使用IDEA打开该文件夹
创建统一的api接口
hello-dubbo-api
IDEA中右键 => new => Module => Maven项目 => 什么都不选 => 填写你想要的项目信息 => 一直下一步
- 创建接口
package service;
/**
*
* <p>
* Description: 统一对外提供服务的接口
* </p>
*
* @author yufire
* @version v1.0.0
* @since 2020-06-11 18:36:20
* @see service
*
*/
public interface HelloDubboApi {
/**
* 测试方法
* @param name
* @return
*/
String sayHi(String name);
}
- 把创建完成的接口安装到本地maven仓库 私服也可以
- 命令
mvn clean install
- 完成
创建提供服务的 provider
hello-dubbo-provider
-
右键=> new => Module => SpringInitializr => 下一步
-
添加 provider所需的 maven依赖
<!--添加统一接口的依赖-->
<dependency>
<groupId>cn.yufire</groupId>
<artifactId>hello-dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--添加 dubbo与Spring Boot整合的依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!--因为 provider项目不需要对外提供 web服务 所以普通的 starter即可-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
- 创建实现 api模块接口的实现类
package cn.yufire.hellodubboprovider.api.impl;
import com.alibaba.dubbo.config.annotation.Service;
import service.HelloDubboApi;
// 注意导包 是 com.alibaba.duboo 包下的 @Service注解
@Service(interfaceClass = HelloDubboApi.class)
public class HelloDubboApiImpl implements HelloDubboApi {
@Override
public String sayHi(String name) {
return "Hello Dubbo " + name;
}
}
- 修改配置文件 application.yml
# 配置连接注册中心的信息
dubbo:
application:
name: hello-dubbo-provider # 服务名称
registry:
address: zookeeper://zool.yufure.cn:2181 # 注册中心地址
protocol: # 协议
name: dubbo # 协议名称
port: 20888 # 服务的端口号
- 修改启动类
package cn.yufire.hellodubboprovider;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo //启动 dubbo
@SpringBootApplication
public class HelloDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(HelloDubboProviderApplication.class, args);
}
}
- 启动
- 启动成功之后 查看dubbo-admin控制面板 会发现出现了个提供者
创建 服务消费者
hello-dubbo-consumer
-
右键=> new => Module => SpringInitializr => 下一步
-
添加 consumer 所需的 maven依赖
<!--添加统一接口的依赖-->
<dependency>
<groupId>cn.yufire</groupId>
<artifactId>hello-dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--添加 dubbo与Spring Boot整合的依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!--consumer项目是需要对外提供web服务的所以需要使用 web的starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
- 创建 Controller
package cn.yufire.hello.dubbo.consumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import service.HelloDubboApi;
@RestController
public class HelloDubboController {
// 使用 dubbo提供的 @Reference 远程调用 注册中心的 HelloDubboApi类
@Reference
private HelloDubboApi helloDubboApi;
@GetMapping("/hello")
public String helloDubbo(String name) {
return helloDubboApi.sayHi(name);
}
}
- 修改启动类
package cn.yufire.hello.dubbo.consumer;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo // 开启Dubbo
@SpringBootApplication
public class HelloDubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(HelloDubboConsumerApplication.class, args);
}
}
- 修改配置文件
server:
port: 8090 # consumer项目需要对外 提供web服务 避免与本地tomcat冲突 所以 改下端口号
dubbo:
application:
name: hello-dubbo-consumer
registry:
address: zookeeper://zool.yufuie.cn:2181
protocol:
name: dubbo
consumer:
timeout: 2000
- 启动 并测试访问
- 此时的 dubbo-admin控制面板
已完成 dubbo的基本操作!
四、Dubbo的负载均衡
- 在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为
random
随机调用。
官网的负载均衡策略
Random LoadBalance
- 随机,按权重设置随机概率。
- 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
RoundRobin LoadBalance
- 轮询,按公约后的权重设置轮询比率。
- 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
LeastActive LoadBalance
- 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
- 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
ConsistentHash LoadBalance
- 一致性 Hash,相同参数的请求总是发到同一提供者。
- 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
- 算法参见:http://en.wikipedia.org/wiki/Consistent_hashing
- 缺省只对第一个参数 Hash,如果要修改,请配置 ``
- 缺省用 160 份虚拟节点,如果要修改,请配置 ``
配置负载均衡
- 打开 provider项目的 配置文件 添加负载均衡配置
# 配置连接注册中心的信息
dubbo:
application:
name: hello-dubbo-provider # 服务名称
registry:
address: zookeeper://zool.yufire.cn:2181 # 注册中心地址
protocol: # 协议
name: dubbo # 协议名称
port: 12345 # 服务的端口号
provider:
loadbalance: roundrobin # 配置负载均衡 策略为: 轮询
- 修改 HelloDubboApiImpl 类
package cn.yufire.hellodubboprovider.api.impl;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Value;
import service.HelloDubboApi;
// 注意导包 是 com.alibaba.duboo 包下的 @Service注解
@Service(interfaceClass = HelloDubboApi.class)
public class HelloDubboApiImpl implements HelloDubboApi {
@Value("${dubbo.protocol.port}")
private String port;
@Override
public String sayHi(String name) {
return "Hello Dubbo " + name + " 我来自:" + port;
}
}
- 修改IDEA的配置
idea上方选项卡 => RUN => Edit Configurations
- 重新启动项目
- 启动一个之后 修改配置文件的端口号 再次启动
- 测试访问
- 这时会发现 随着每次访问 对应的端口号都会跟着改变 这就是 dubbo的轮询机制
完!