废话

2022.07.21,先看官方文档,来个 hello world

注意!!!zookeeper 3.5 以上版本,一定要下载 *.bin.tar.gz,一定要带有 bin


Hello World

安装 zookeeper

  1. 下载、上传、解压
  2. 修改配置文件 conf 下的 zoo_sample.cfg,名字改成 zoo.cfg
  3. 重要配置修改,按需添加:
# 文件存储路径,pid和其他,temp容易被linux自动清掉
dataDir=/opt/software/zookeeper/cachefile
# 端口修改
clientPort=27268
# 通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒
tickTime = 2000
# LF初始通信时限,初始连接能容忍的最多心跳数
initLimit = 10
# LF同步通信时限,超过次数没响应就从服务器列表删除
syncLimit = 5
  1. 启动命令,进入 bin 文件夹下:
# 启动 Zookeeper
./zkServer.sh start
  • 不用说, status 状态,stop 关闭
  • 状态Mode: standalone-单节点;leader-主节点,follower-从节点


Dubbo 最基础使用

添加 pom 依赖,dubbo 和 zookeeper:

 <dependency>
     <groupId>org.apache.dubbo</groupId>
     <artifactId>dubbo-spring-boot-starter</artifactId>
     <version>3.0.7</version>
</dependency>

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-dependencies-zookeeper</artifactId>
    <version>3.0.7</version>
    <type>pom</type>
</dependency>

application配置:

dubbo:
  application:
    name: provider   #暴露服务的名字
  registry: # 连接的zookeeper地址
    address: zookeeper://127.0.0.1:27268
  config-center:
    address: zookeeper://127.0.0.1:27268
  metadata-report:
    address: zookeeper://127.0.0.1:27268
  #协议端口
  protocol:
    name: dubbo
    port: -1
  scan:
    base-packages: cn.shiva

主启动类加上注解:

@EnableDubbo

服务提供方,就一个接口和一个实现类:

public interface IProviderService {
    String getMessageById(String id);
}
@DubboService
public class ProviderServiceImpl implements IProviderService {
    @Override
    public String getMessageById(String id) {
        return "Dubbo 3 服务提供,输入参数id : " + id;
    }
}

服务调用方,需要一个一模一样的接口:

public interface IProviderService {
    String getMessageById(String id);
}
@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {

    @DubboReference
    private IProviderService providerService;

    @RequestMapping("/index")
    public String index() {
        return providerService.getMessageById("111");
    }
}

调用截图:


其他简单应用功能

同名服务接口区分

上面是的最基础的 1:1:1 结构。

如果现在有 多个服务提供方,恰好两个服务提供方,恰好两个服务提供方,有同一个暴露的接口名。

例如:

  • dubbo.application.name=provider 提供服务;IProviderService 接口;ProviderServiceImpl 实现类
  • dubbo.application.name=provider2 提供服务;IProviderService 接口;ProviderServiceImpl 实现类
  • @DubboReference 无其他参数来调用接口

这就会造成,@DubboReference 无法判断,到底需要调用哪个服务的实现类。


@DubboService(group = "provider", version = "1.0")
@DubboService(group = "provider2", version = "1.1")

使用注解把两个实现类做区分


自带负载均衡

dubbo 自带负载均衡:负载均衡 | Apache Dubboopen in new window

老生常谈了,

类型名称说明
random随机按照权重的设置随机概率,设置 weight
roundrobin轮询按照权重设置轮询比率,设置 weight
leastactive最少活跃响应快的提供者接受越多请求,响应慢的接受越少请求
consistenthash一致性 Hash相同参数的请求总是发到同一个服务提供者(相同参数默认是指请求的第一个参数)根据服务提供者ip设置hash环,携带相同的参数总是发送的同一个服务提供者

注解的时候加一下负载就行了:

@DubboService(group = "provider", version = "1.0", loadbalance = "roundrobin")
@DubboReference(group = "provider", version = "1.0", loadbalance = "roundrobin")

运行结果,一比一权重的轮询:


Zookeeper 密码连接

因为上面改了 zookeeper 端口,所以客户端不能直接用 2181 端口:

./zkCli.sh -server localhost:27268

进入客户端后,创建用户名密码,然后重启:

# 用户名:密码
addauth digest zookeeper:zkPwd123
# auth:用户名:密码:
setAcl / auth:zookeeper:zkPwd123:cdrwa

然后修改配置文件:

dubbo:
  application:
    name: provider   #暴露服务的名字
  registry: # 连接的zookeeper地址
    address: zookeeper://zookeeper:zkPwd123@127.0.0.1:27268
  config-center:
    address: zookeeper://zookeeper:zkPwd123@127.0.0.1:27268
  metadata-report:
    address: zookeeper://zookeeper:zkPwd123@127.0.0.1:27268

参考文章