本笔记参考https://www.bilibili.com/video/BV1VE411q7dX?p=7 视频整理获得
官网地址:Apache Dubbo
节点角色说明:
Zookeeper依赖java环境请确保您的机器安装过jdk
官网下载https://zookeeper.apache.org/releases.html
下载后解压
复制一份zoo_sample.cfg 文件 修改为zoo.cfg默认启动配置文件
配置端口和日志数据保存路径
zkServer.sh start 启动命令
zkServer.sh status查看状态
zkServer.sh stop 停止命令
其他系统安装可参考菜鸟教程
1、创建Provider模块和Consumer模块
2、web模块引入service模块
<dependency>
<groupId>cn.qileyungroupId>
<artifactId>dubbo-serviceartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
3、编写service
@Service
public class UserServiceImpl implements UserService {
public String sayHello() {
return "hello dubbo!";
}
}
4、编写web
//注入一下service
@Autowired
UserService userService;
@RequestMapping("/sayHello")
public String sayHello(){
return userService.sayHello();
}
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubboartifactId>
<version>${dubbo.version}version>
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-frameworkartifactId>
<version>${zookeeper.version}version>
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-recipesartifactId>
<version>${zookeeper.version}version>
dependency>
1、修改service和web的启动端口
web
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.1version>
<configuration>
<port>8000port>
<path>/path>
configuration>
plugin>
plugins>
build>
service
<port>9000</port>
spring提供的@Service是注册到spring容器中,而Dubbo提供的是注册到注册中心去
在applicationContext.xml配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<dubbo:application name="dubbo-service"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:annotation package="cn.qileyun.service.impl"/>
beans>
web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring/applicationContext*.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
web-app>
1、web模块无需导入service模块了,以后都是通过Dubbo通过RPC进行调用
2、springmvc.xml配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="cn.qileyun.controller"/>
<dubbo:application name="dubbo-web">
<dubbo:parameter key="qos.prot" value="33333"/>
dubbo:application>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:annotation package="cn.qileyun.controller"/>
beans>
3、修改controller注入方式
//@Autowired//本地注入
/**
* 1. 从zookeeper注册中心获取userService的访问url
* 2. 进行远程雕调用RPC
* 3. 将结果封装为一个代理对象。给变量赋值
*/
//注入一下service
@Reference//远程注入
UserService userService;
@RequestMapping("/sayHello")
public String sayHello() {
return userService.sayHello();
}
web模块和service模块分别导入这个模块
<dependency>
<groupId>cn.qileyungroupId>
<artifactId>dubbo-interfaceartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
运行看看
gitee项目地址:https://gitee.com/qlyml/dubbo-learning/tree/introduction/
1、环境准备
dubbo-admin 是一个前后端分离的项目。前端使用vue,后端使用springboot,安装 dubbo-admin 其实就是部署该项目。我们将dubbo-admin安装到开发环境上。要保证开发环境有jdk,maven,nodejs
安装node(如果当前机器已经安装请忽略)****
2、下载 Dubbo-Admin
下载地址:https://github.com/apache/dubbo-admin
3、把下载的zip包解压到指定文件夹(解压到那个文件夹随意)
4、修改配置文件
解压后我们进入…\dubbo-admin-develop\dubbo-admin-server\src\main\resources目录,找到 application.properties 配置文件 进行配置修改
修改zookeeper地址
# centers in dubbo2.7 zookeeperip地址
admin.registry.address=zookeeper://ip:2181
admin.config-center=zookeeper://ip:2181
admin.metadata-report.address=://ip:2181
admin.registry.address注册中心
admin.config-center 配置中心
admin.metadata-report.address元数据中心
5、打包项目
在 dubbo-admin-develop 目录执行打包命令
mvn clean package
6、启动后端
切换到目录
dubbo-Admin-develop\dubbo-admin-distribution\target>
执行下面的命令启动 dubbo-admin,dubbo-admin后台由SpringBoot构建。
最好用jdk8进行运行不让登录报错
Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
java -jar .\dubbo-admin-0.1.jar
发现启动失败了,原因是和zookeeper端口冲突
解决:
第一种方式:修改zookeeper的配置文件zoo.cfg
比如修改成8888
admin.serverPort=8888
第二种方式:修改dubbo-admin-server的端口
比如在dubbo-admin-server项目的application.properties文件中添加server.port=2399
7、前台后端
dubbo-admin-ui 目录下执行命令
npm run dev
8、访问
浏览器输入。用户名密码都是root
http://localhost:8082/
注意:Dubbo Admin【服务Mock】【服务统计】将在后续版本发布…
在上面的步骤中,我们已经进入了Dubbo-Admin的主界面,在【快速入门】章节中,我们定义了服务生产者、和服务消费者,下面我们从Dubbo-Admin管理界面找到这个两个服务
2、查询结果
A:输入的查询条件cn.qileyun
B:搜索类型,主要分为【按服务名】【按IP地址】【按应用】三种类型查询
C:搜索结果
3.1.4 dubo-admin查看详情
我们查看cn.qileyun.service.UserService (服务提供者)的具体详细信息,包含【元数据信息】
从【详情】界面查看,主要分为3个区域
A区域:主要包含服务端 基础信息比如服务名称、应用名称等
B区域:主要包含了生产者、消费者一些基本信息
C区域:是元数据信息,注意看上面的图,元数据信息是空的
我们需要打开我们的生产者配置文件加入下面配置
<dubbo:metadata-report address="zookeeper://127.0.0.1:2181" />
重新启动生产者,再次打开Dubbo-Admin
package cn.qileyun.pojo;
//一定要序列化哦
import java.io.Serializable;
public class User implements Serializable {
private int id;
private String username;
private String password;
public User() {
}
。。。
}
4、编写service
public User findUserByid(int id) {
//查询User对象
User user = new User(1,"zhangsan","123");
return user;
}
5、编写web
/**
* 根据id查询用户信息
* @param id
* @return
*/
@RequestMapping("/find")
@ResponseBody
public User find(int id) {
return userService.findUserByid(id);
}
思考一个问题:如果注册中心挂啦,服务示范可以正常访问?
超时
service模块中设置超时时间
web模块中设置超时时间
建议在Service模块中设置超时时间,调用方设置可以覆盖服务端端配置
重试
@Service(timeout = 3000,retries = 2) //当前服务3秒超时.重式2次,一共三次
@Service(version = "v1.0") //当前服务3秒超时.重式2次,一共三次
public class UserServiceImpl implements UserService {
public String sayHello() {
return "hello dubbo!";
}
public User findUserByid(int id) {
System.out.println("old....");
//查询User对象
User user = new User(1, "zhangsan", "123");
return user;
}
}
@Service(version = "v2.0") //当前服务3秒超时.重式2次,一共三次
public class UserServiceImpl2 implements UserService {
public String sayHello() {
return "hello dubbo!";
}
public User findUserByid(int id) {
System.out.println("new....");
//查询User对象
User user = new User(2, "zhangsan2", "123");
return user;
}
}
调用方声明调用那个版本
@Reference(version = "v2.0")//远程注入
UserService userService;
@RequestMapping("/find")
@ResponseBody
public User find(int id) {
return userService.findUserByid(id);
}
1、多个服务声明权重
@Service(weight = 100)//声明权重
2、调用服务
@Reference(loadbalance = "random")//远程注入
UserService userService;
你可以在消费者设置
@Reference(cluster = "failsafe")//设置容错模式
UserService userService;
也可以在服务端设置
//将这个类提供方法(服务)对外发布,将访问地址ip、端口、路径注册中心去
@Service(cluster = "failsafe" ) //当前服务3秒超时.重式2次,一共三次
public class UserServiceImpl implements UserService {
}
屏蔽:force.mock (即:屏蔽请求,直接返回某个值,如上面的字符串,mock=“return 123456…”);
容错:fail.mock (即:允许请求,在请求失败的时候,再返回某个值,如:mock=“fail:return 123456…”);
如一下操作:
@Reference(mock = "force:return null")//不在去调用userService 并且啥都不返回
UserService userService;