1.什么是Dubbo
Dubbo是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。
致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。
官网:http://dubbo.apache.org
- RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务
- SOA 是一种设计方法,其中包含多个服务,而服务之间通过配合最终会提供一系列功能。一个服务通常以独立的形式存在于操作系统进程中。服务之间通过网络调用,而非采用进程内调用的方式进行通信。
2.Dubbo的架构
3Dubbo快速入门
生产者--》注册中心--》消费者
3.1 配置注册中心
Dubbo官方推荐使用Zookeeper作为注册中心
3.1.1 上传
把 zookeeper-3.4.9.tar.gz 上传到linux 的/opt下
3.1.2 解压缩
tar -zxvf zookeeper-3.4.9.tar.gz
进入
cd /opt/zookeeper-3.4.9/conf
zookeeper 启动默认读取zoo.cfg,所以需要把zoo_sample.cfg 复制一份为zoo.cfg,即执行一下命令
mv zoo_sample.cfg zoo.cfg
3.1.3 编辑zoo.cfg
vim zoo.cfg
#设置zookeeper的数据路径,其他的配置不变
dataDir=/opt/zookeeper-3.4.9/zkData
3.1.4启动zookeeper
/opt/zookeeper-3.4.9/bin/zkServer.sh start
3.1.5 查看启动状态
/opt/zookeeper-3.4.9/bin/zkServer.sh status
#状态信息
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: standalone
至此zookeeper 配置完毕
3.2 dubbo 案例
3.2.1 实现步骤
创建公共接口模块,并编写UserService接口,提供服务
创建服务提供者Provider模块,依赖公共接口模块并编写 UserServiceImpl 提供服务
创建服务消费者Consumer模块,依赖公共接口模块并编写UserController 远程调用UserServiceImpl 提供的服务
分别启动两个服务,测试
3.2.2 创建公共接口模块
安装该接口模块到本地仓库
3.2.3 创建服务提供者
注意是web项目
A ) 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>org.example</groupId>
<artifactId>dubbo-service</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<spring.version>5.1.5.RELEASE</spring.version>
<dubbo.version>2.7.3</dubbo.version>
<zookeeper.version>4.0.0</zookeeper.version>
</properties>
<dependencies>
<!--spring的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 引入dubbo的依赖配置 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
</dependency>
<!--依赖公共接口-->
<dependency>
<groupId>org.example</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.28.v20200408</version>
<configuration>
<httpConnector>
<!-- 端口号 -->
<port>9091</port>
<!-- 项目访问路径 -->
<host>localhost</host>
</httpConnector>
<contextHandlers>
<jettyWebAppContext>
<!-- 虚拟路径 -->
<contextPath>/pic</contextPath>
<!-- 物理路径 -->
<resourceBase>d:/pic/</resourceBase>
</jettyWebAppContext>
</contextHandlers>
<scanIntervalSeconds>1</scanIntervalSeconds>
</configuration>
</plugin>
</plugins>
</build>
</project>
B)服务提供者实现类
C)spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--<context:component-scan base-package="com.bobo"></context:component-scan>-->
<!--dubbo的配置-->
<!--1.配置项目的名称,唯一-->
<dubbo:application name="dubbo-service"/>
<!--2.配置注册中心的地址-->
<dubbo:registry address="zookeeper://192.168.224.111:2181"/>
<!--3.配置dubbo包扫描-->
<dubbo:annotation package="com.bobo.service.impl" />
</beans>
D)web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- 监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置加载spring.xml -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
</web-app>
3.2.4 创建服务消费者
注意是web项目
A)创建服务消费者controller
B) springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<context:component-scan base-package="com.bobo.controller"></context:component-scan>
<mvc:annotation-driven/>
<context:component-scan base-package="com.bobo.controller"/>
<!--dubbo的配置-->
<!--1.配置项目的名称,唯一-->
<dubbo:application name="dubbo-web" >
<dubbo:parameter key="qos.port" value="33333"/>
</dubbo:application>
<!--2.配置注册中心的地址-->
<dubbo:registry address="zookeeper://192.168.224.111:2181"/>
<!--3.配置dubbo包扫描-->
<dubbo:annotation package="com.bobo.controller" />
</beans>
C) web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- 启动springmvc 容器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--拦截所有请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- post提交乱码处理 -->
<filter>
<filter-name>chartecode</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>chartecode</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>