Dubbo之简单demo及dubbo admin服务治理
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [1] Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
——来自百度百科
一、dubbo的调用流程
这里借助一张官方的图片
二、项目概述
创建项目之前,先简单的概述以下:
上面说到dubbo是一个优秀的rpc框架,那么具体在我们搭建项目的时候要怎么做呢?
1、使用dubbo的项目比SpringCloud项目要简单,一般情况我们会有一个项目是对外提供服务的,也就是我们理解中的消费者。
2、对外提供服务的部分也就是我们理解的生产者
3、公共定义的接口
4、有了以上三者,我们就可以在消费者中调用公共定义的接口,而生产者实现该接口,调用时利用dubbo的rpc远程调用就能够实现完整的调用流程!
三、搭建项目概述
我自己搭建的dubbo的demo供参考:
https://github.com/wwenyi/Dubbo.git
在项目搭建之前,我们需要先安装zookeeper,作为dubbo的注册中心使用,安装过程在我的上一篇笔记中
1、创建父项目,打包类型为pom,用于统一管理依赖版本和方便项目打包发布等,父项目的父项目为SpringBoot(项目名:db)
2、在父项目下创建一个maven model,也就是我们上面说的公共定义接口用的项目,并添加基本的常用依赖(项目名:db-common)
3、创建一个maven model,作为服务提供者,也就是我们说的生产者,该项目依赖db-common,并添加基本的常用依赖(项目名:db-car)
4、创建一个maven model,作为服务调用者,也就是我们说的消费者,该项目依赖db-common,并添加基本的常用依赖(项目名:db-web)
5、为生产者和消费者分别添加启动类和yml文件,并在yml文件中添加基本的配置
四、dubbo的远程调用
上面仅仅是概述了一下项目的搭建,这里具体说一下关于dubbo的远程调用和服务注册
1、在db-common中添加dubbo的依赖:
<!-- dubbo的依赖 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
2、修改生产者(db-car)yml文件:
#dubbo的配置
dubbo:
scan:
#扫描的包
base-packages: com.wwy
application:
#服务名
name: db-car
registry:
#注册中心(zookeeper的地址和客户端端口)
address: zookeeper://192.168.40.152:2181
#协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。
protocol:
name: dubbo
#这里注意,每一个服务指定的端口必须是唯一的!!!
port: 20880
3、修改消费者(db-web)yml文件:
#dubbo相关配置
dubbo:
scan:
#扫描的包
base-packages: com.wwy
application:
#服务名
name: db-web
registry:
#注册中心(zookeeper的地址和客户端端口)
address: zookeeper://192.168.40.152:2181
4、在生产者主启动类添加注解,以提供对dubbo的支持:
@EnableDubbo
5、编写代码
(1)将controller定义在服务的消费者中
这里要特别注意的是自动注入使用的是dubbo提供的@Reference
注解而不是spring提供的@Autowired
package com.wwy.controller;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.wwy.entry.APIEntry;
import com.wwy.entry.Car;
import com.wwy.service.CarService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* Car controller层
* @author wwy
* @ClassName com.wwy.controller.CarController.java
* @date 2020年1月13日 下午1:43:02
* @version v0.0.1
*
*/
@RestController
@Api(tags = "Car")
@RequestMapping("car")
public class CarController {
//注入的时候使用dubbo的注解,timeout表示超时时间,check表示表示是否启动时检查服务提供者
//loadbalance表示负载均衡的策略
@Reference(timeout = 3000,check=false,loadbalance = "random")
private CarService service;
/**
* 查询所有购物车数据
* @return
*/
@ApiOperation("查询所有")
@GetMapping("getall")
public APIEntry getAll() {
List<Car> data = service.getAll();
return APIEntry.OK(data);
}
}
(2)将Service层接口和实体类定义在公共服务中(db-common)
实体类:
package com.wwy.entry;
import java.io.Serializable;
import lombok.Data;
/**
* Car的实体类
* @author wwy
* @ClassName com.wwy.entry.CarEntry.java
* @date 2020年1月13日 上午11:44:07
* @version v0.0.1
*
*/
@Data
public class Car implements Serializable{
/**
*
*/
private static final long serialVersionUID = 149221415710475302L;
private Integer id;
private String name;
private String createTime;
private Double money;
}
service接口:
package com.wwy.service;
import java.util.List;
import com.wwy.entry.Car;
public interface CarService {
List<Car> getAll();
}
(3)将service实现类和mapper层定义在服务提供方(db-car)
service实现类:
package com.wwy.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.alibaba.dubbo.config.annotation.Service;
import com.wwy.entry.Car;
import com.wwy.mapper.CarMapper;
import com.wwy.service.CarService;
/**
* Carservice实现类
* @author wwy
* @ClassName com.wwy.service.impl.CarServiceImpl.java
* @date 2020年1月13日 上午11:37:52
* @version v0.0.1
*
*/
//注意,此处的@service注解为dubbo的service注解!!!
@Service(timeout = 3000,loadbalance = "random")
public class CarServiceImpl implements CarService{
@Autowired
private CarMapper mapper;
@Override
public List<Car> getAll() {
System.out.println("我是1");
return mapper.getAll();
}
}
mapper层:
package com.wwy.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.wwy.entry.Car;
@Mapper
public interface CarMapper {
List<Car> getAll();
}
五、服务治理
都知道SpringCloud的eureka有提供一个页面,供我们查看和管理注册到上面的服务,而zookeeper就是一个黑盒,啥都看不到,有时候我们在项目测试中完全除了问题完全就不知道我们的服务是否正常注册,所以,这里我们利用dubbo提供的dubbo admin来做一个服务的管理,具体使用方法如下(不要怀疑):
1、下载项目:
下载地址:https://github.com/apache/incubator-dubbo/tree/dubbo-2.6.0
下载解压后的结构大概是这样的:
2、进入dubbo-admin,使用maven的cmd命令编译项目:
mvn package -Dmaven.skip.test=true
我编译好的war包也在我上面提供的demo的根目录下:
项目链接:https://github.com/wwenyi/Dubbo.git
3、将编译后的项目放入到你的tomcat中(该项目不是基于springboot的,多以需要在tomcat中运行,我为了方便直接将war包更名为了dubbo)
4、启动tomcat(如果你的zookeeper是安装到本地的,启动正常,如果不是安装在本地,启动会报错,但是这次启动都是有意义的,因为启动后tomcat的放dubbo的war包的目录下回出现一个dubbo的文件夹)
5、修改配置文件(dubbo目录下的WEB-INF目录下的dubbo.properties文件)
6、浏览器中访问
localhost:8080/dubbo
7、访问后出现以上页面,点击箭头就可以看到注册在zookeeper中的服务等信息了
上一篇: 五子棋设计笔记
下一篇: C++题解之 蓝桥杯 算法提高 成绩排序