Dubbo服务一般注册在ZooKeeper中,所以要先安装并启动好ZooKeeper。首先在官网下载Zookeeper3.8.3版本,下载后解压,然后打开刚刚解压的zookeeper安装目录,在该目录下创建一个空的data目录(与bin是同一级目录),然后打开conf目录,复制一份zoo_sample.cfg,重命名为zoo.cfg,修改里面的dataDir的值,设置为刚才创建的data目录的全路径,例如dataDir=C:\software\apache-zookeeper-3.8.3-bin\apache-zookeeper-3.8.3-bin\data
注意:必须用双斜杠,然后双击bin下的zkServer.cmd文件即可启动ZooKeeper,启动后ZooKeeper的端口号为2181。
7.2 Dubbo远端调用实践
本节创建一个服务提供者和一个服务调用者微服务项目,两者之间使用Dubbo进行远端调用,调用时就像调用本地服务一样简单。
7.2.1 创建服务提供者
先来创建服务提供者项目,供服务调用者调用。
(1)创建Spring Boot 3.0.2项目,命名为DubboProvider,再添加下列Dubbo、ZooKeeper有关的依赖,其中ZooKeeper用来注册Dubbo服务。Spring Boot集成Dubbo和ZooKeeper的代码如下:
(2)applicaiton.yml配置代码如下:
server:
port: 8082
spring:
application:
name: DubboProvider
dubbo:
protocol:
name: dubbo
port: 23650
scan:
base-packages: com.sike.dubbo
registry:
address: zookeeper://127.0.0.1:2181
其中,Dubbo有关的配置分别是指定dubbo的协议名称,工作端口号,扫描包的名称,Dubbo方法的注册中心路径。
(3)创建Dubbo对外服务的接口和实现类。创建接口MyDubboService及实现类MyDubb-oServiceImpl,实现类MyDubboServiceImpl代码如下:
@DubboService
public class MyDubboServiceImpl implements MyDubboService {
@Override
public String getInfoFromDubbo() {
return "First Info from Dubbo";
}
}
其中,注解@DubboService表明该方法将以Dubbo的方式提供服务,该服务将注册到ZooKeeper上。
(4)启动类中添加@EnableDubbo注解,启用Dubbo。
(5)启动ZooKeeper,再启动项目,启动完成后,MyDubboService服务便注册到了ZooKeeper注册中心里面了。
7.2.2 创建服务调用者
创建好服务提供者项目后,接下来创建服务调用者项目。
(1)创建项目命名为DubboConsumer,导入跟DubboProvider项目相同的依赖,但application.yml配置稍有不同,具体配置信息代码如下:
server:
port: 8081
spring:
application:
name: DubboConsumer
dubbo:
application:
qos-enable: false #不开启dubbo运维服务
scan:
base-packages: com.sike.dubbo
cloud:
subscribed-services: DubboProvider
registry:
address: zookeeper://127.0.0.1:2181
其中,subscribed-services: DubboProvider作用是表示要调用哪个微服务项目中的Dubbo方法,其他配置信息作用跟服务提供者相同。
(2)创建接口MyDubboService,代码与服务提供者相同,这里暂时不需实现类。
(3)创建控制器DubboController,完成调用的业务逻辑。首先要使用@DubboReference注解注入要调用的接口,再在控制器方法中使用,代码如下:
@RestController
public class DubboController {
@DubboReference
private MyDubboService myDubboService;
@GetMapping("/getInfo")
public String getInfo(){return myDubboService.getInfoFromDubbo();
}
}
(4)启动项目,浏览器访问http://localhost:8081/getInfo,结果如图7-2所示。
图7-2 浏览器访问http://localhost:8081/getInfo
可见,服务调用者项目成功地获取了服务提供者返回的数据,远端调用成功。
7.2.3 Dubbo中的负载均衡
如果服务提供者有两个或以上的实例,则Dubbo 默认采用随机(random)的方式进行服务消费者的负载均衡。在复制 DubboProvider 项目为 DubboProvider2 并修改配置后,需将 Dubbo 端口号修改为 23651。同时,在 MyDubboServiceImpl 中修改输出内容,以便测试时确定 Dubbo 实际调用的是哪个微服务(实际业务中多个实例功能相同)。修改后的方法如下:
public class MyDubboServiceImpl implements MyDubboService {
@Override
public String getInfoFromDubbo() {
return "Second Info from Dubbo";
}
}
启动DubboProvider2项目,浏览器访问http://localhost:8081/getInfo,浏览器将不规律地分别出现图7-2和图7-3所示的界面。
图7-3 浏览器访问http://localhost:8081/getInfo
7.2.4 Dubbo负载均衡策略
通过在服务提供者项目的Dubbo方法的实现类上的@DubboService注解中添加loadbalance参数及值的方式可以更改Dubbo的负载均衡策略,常见的负载均衡值如下,每个值代表一种负载均衡策略
(1)random,随机。随机访问集群中节点,访问概率和权重有关,所以还可以再配置一个weight的参数及值,表示权重,默认。
(2)roundrobin,轮询。访问频率和权重有关,集群中每个项目部署的服务器的性能可能是不同,性能好的服务器权重应该高一些,实际配置时还需要再配置一个weight的参数及值,如果各个项目的权重相同,则是真正意义上的轮询。
(3)leastactive,活跃数相同的随机,不同的活跃数高的放前面。
(4)consistenthash,一致性Hash。相同参数请求总是发到一个提供者。
【示例7-1】修改Dubbo的负载均衡策略为轮询。
修改服务提供者项目DubboProvider及DubboProvider2的MyDubboServiceImpl类代码如下:
@DubboService(loadbalance = "roundrobin",weight = 1)
public class MyDubboServiceImpl implements MyDubboService {
@Override
public String getInfoFromDubbo() {
return "Second Info from Dubbo";
}
}
注意:@DubboService注解中添加了参数loadbalance = "roundrobin"表示更改负载均衡方式为轮询,weight = 1表示权重,两个项目的权重相同,访问频率均等。
重新启动服务提供者项目DubboProvider及DubboProvider2,浏览器访问浏览器访问http://localhost:8081/getInfo,浏览器规律地交替轮流出现图7-4和图7-5所示的界面。
图7-4 浏览器访问http://localhost:8081/getInfo
图7-5 浏览器访问http://localhost:8081/getInfo