Dubbo介绍
Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Dubbo是阿里出的一个高性能的分布式微服务框架,它的特点是性能高、界面友好、文档齐全(特别是中文文档),是很多中小型公司快速搭建微服务的首选技术。18年初被阿里重新进行维护,并进入Apache孵化器,并于前段时间新发布了2.7.0新版本。官方网站为http://dubbo.incubator.apache.org/zh-cn/。
搭建注册中心
在dubbo中,每一个服务都是分布式的,消费者与提供者的关系并不是一对一的关系,而是一对多,并且服务提供者的实例位置是未知的,如果都由开发者使用静态文件去维护这个关系显示不合适的,一方面是徒增工作量,另一方面是灵活度不高,如果服务提供者更换了服务器地址,那么需要重新配置等,所以目前比较推崇的方案是所有服务提供者均主动将自己的信息注册到同个地方中,而消费者只要一律从这个地方取他需要的东西即可,这个地方就是所谓的注册中心。目前dubbo可以选择的注册中心包括zookeeper、redis等,一般建议使用zookeeper,下面演示一下在windows中如何搭建zookeeper注册中心。
1、下载zookeeper
直接在官网的镜像站下 https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/
2、解压并配置zookeeper
直接使用官方示例配置,把解压出来的\zookeeper\conf\zoo_sample.cfg 文件名改为zoo.cfg即可。
3、运行zookeeper注册中心
运行启动脚本:/zookeeper/bin/zkServer.sh
搭建Dubbo Admin
在Dubbo中,一大杀器就是它的可视化监控界面,在这个界面中可以查看服务者、提供者的数量、状态等,并对服务降级、容错、屏蔽等提供了可视化操作。下面演示如何搭建Dubbo Admin。
安装
下载代码: git clone https://github.com/apache/incubator-dubbo-ops.git
在 dubbo-admin-backend/src/main/resources/application-production.properties中指定注册中心地址
构建
mvn clean package
启动
mvn --projects dubbo-admin-backend spring-boot:run
或者
cd dubbo-admin-backend/target; java -jar dubbo-admin-backend-0.0.1-SNAPSHOT.jar
访问 http://localhost:8080
详细操作可参考:https://github.com/apache/incubator-dubbo-ops/blob/develop/README_ZH.md
注意:
构建之前环境需安装node.js
本人在构建dubbo-admin-backend时test case不通过,不知道为啥,不细研究了,忽略test后构建成功
以上搭建出来的是dubbo-admin的develop版本,支持dubbo2.7以上的版本。因为dubbo-admin clone下来的默认为develop版本,因此如需使用master版本,需切换代码到master版本后进行构建
git checkout -b master origin/master
搭建API项目
由于Dubbo是采用RPC调用方式,这也是与Spring Cloud比较大的区别之一。在Spring Cloud中,服务通过HTTP接口提供给其它服务调用,对于调用者与被调用者来说,只要双方保证满足http接口的契约即可,但是在dubbo中,是严格要求调用接口的类路径、参数等双方一致。所以需要构建一个API项目,该项目里面存放服务接口即公共实体,双方依赖这个项目完成远程调用。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wl</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
公共服务接口-HelloService.java
package com.wl.dubbointerface.service;
public interface HelloService {
public String sayHello(String name);
}
搭建服务提供者
服务提供者就是被消费者所调用的,它需要实现公共服务接口,并通过dubbo把自己的服务暴露出来。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wl</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
</dependency>
<dependency>
<groupId>com.wl</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--引入dubbo的依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.5</version>
</dependency>
<!-- 引入zookeeper的依赖 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
com.alibaba.boot是迁移过后出的一个最新的dubbo spring boot starter,也是目前官方推荐使用的。值得注意的是,该starter不包含注册中心客户端,需要自己配置。一般推荐使用zookeeper作为注册中心,所以需要手动引入zkclient。
application.properties
#web服务端口,由于我们不需要使用web服务,所以将其设为随机端口
server.port=-1
# Base packages to scan Dubbo Components (e.g @Service , @Reference)
dubbo.scan.basePackages = com.wl.dubboprovider.service.impl
#生产者名称
dubbo.application.name=dubbo-provider
#注册中心地址
dubbo.registry.address=zookeeper://118.31.67.37:2181
服务实现类PeopleServiceImpl
package com.wl.dubboprovider.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.wl.dubbointerface.service.HelloService;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@Service
@EnableAutoConfiguration
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
搭建服务消费者
pom.xml和服务提供者一样
application.properties
#web服务端口
server.port=80
#消费者名称
dubbo.application.name=dubbo-consumer
#注册中心地址
dubbo.registry.address=zookeeper://118.31.67.37:2181
控制器PeopleController
package com.wl.dubboconsumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.wl.dubbointerface.service.HelloService;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableAutoConfiguration
public class HelloController {
@Reference
private HelloService helloService;
@RequestMapping("/hello")
public String hello() {
String hello = helloService.sayHello("world");
System.out.println(hello);
return hello;
}
}
至此,整个项目便搭建完毕
七、上线运行
依次运行dubbo-provider 与dubbo-consumer,顺序不能搞错,并且得确保provider启动完成后再启动consumer,否则后期会出现空指针异常。
至此,我们总共启动了四个服务,分别是zookeeper注册中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下图:
打开dubbo监控网页检查服务消费者和提供者是否已经注册成功:
可以看到,提供者与消费者已成功注册到注册中心
2、基本调用
使用浏览器访问
观察服务提供者日志也同样打印了 Hello world