02_Dubbo的使用
一、Doubbo的使用
Dubbo 基于容器 容器就是spring dubbo可以和spring 进行无缝整合
创建spring环境 引入dubbo即可使用
dubbo的使用步骤:
- 定义服务的提供者
①定义服务接口
②定义服务的实现 - 定义服务的消费者
调用服务的提供者提供的服务 - 注册中心
推荐使用== Zookeeper 注册中心==
将服务的提供者和服务的消费者注册到注册中心
利用spring容器
二、搭建dubbo的环境:
使用zookeeper作为注册中心
zookeeper : 动物园管理员
hadoop(大象) hive(蜜蜂) pig(猪)
zookeeper 是一个分布式的 开源的程序协调服务 是hadoop项目的一个子项目 提供服务配置管理 命名服务 分布式锁 集群管理
服务配置管理
A B C 三个系统 分别使用不同的配置 但是配置中内容大同小异 如果需要修改配置项 工作任务大 修改完配置 还需要重启系统
从所有配置中抽取出一个公共的 此时可以将公共的配置 放在zookeeper中 进行统一管理
当需要修改的时候 你可以随意修改 修改完之后 不需要重启
命名服务
可以根据服务名称 检索到对应的服务
分布式锁
集群管理
在linux上安装zookeeper
- 上传zookeeper 到centos
- 解压
[root@localhost soft]# tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz -C /opt/programfiles/
- 进入zookeepr 目录 在conf中 将zoo_simple.cfg复制一份 复制为zoo.cfg
[root@localhost conf]# cp zoo_sample.cfg zoo.cfg
- 修改配置
- 启动zookeeper
- 关闭命令
- 查看zookeeper的状态
三、创建项目
maven的聚合项目
maven的聚合和继承
控制层模块
业务层模块
数据层模块
公共模块
①创建一个maven工程
dubbo-demo
接下创建他的子模块
工程结构:
子模块的pom文件中:
在父工程的pom文件中:
1.父工程的依赖(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.rpc.dubbo</groupId>
<artifactId>dubbo-demo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>dubbo_interface</module>
<module>dubbo-provider</module>
<module>dubbo-consumer</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.16.RELEASE</spring.version>
<dubbo.version>2.6.0</dubbo.version>
<zookeeper.version>3.6.0</zookeeper.version>
<zkclient.version>0.1</zkclient.version>
</properties>
<!-- 依赖管理 父工程中主要管理模块的聚合 以及对整个工程中所用到的依赖的管理-->
<dependencyManagement>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.11.0.GA</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2.子模块dubbu-interface
2.1.引入依赖(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">
<parent>
<artifactId>dubbo-demo</artifactId>
<groupId>com.rpc.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo_interface</artifactId>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.11.0.GA</version>
</dependency>
</dependencies>
</project>
2.2.定义接口
public interface UserService {
public String sayHello(String name);
}
3.服务的提供者dubbo-provider
3.1.引入依赖(pom.xml)
<dependencies>
<!-- 依赖dubbo-intreface-->
<dependency>
<groupId>com.rpc.dubbo</groupId>
<artifactId>dubbo_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>dubbo-provider</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 指定端口 -->
<port>8080</port>
<!-- 请求路径 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
3.2.实现接口
import com.alibaba.dubbo.config.annotation.Service;
import com.rpc.dubbo.service.UserService;
@Service
public class UserServiceImpl implements UserService {
@Override
public String sayHello(String name) {
return "hello " + name;
}
}
3.3.配置容器
<?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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
">
<!-- 配置在dubbo中的服务的名称-->
<dubbo:application name="hello_provider"/>
<!-- 配置dubbo的注册中心-->
<dubbo:registry address="zookeeper://192.168.124.7:2181"/>
<!-- 所使用的协议及暴露服务的端口-->
<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
<!-- 暴露的服务接口-->
<dubbo:annotation package="com.rpc.dubbo.service.impl"></dubbo:annotation>
</beans>
3.4.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">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:dubbo-provider.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
4.服务的消费者dubbo-consumer
4.1.引入依赖(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">
<parent>
<artifactId>dubbo-demo</artifactId>
<groupId>com.rpc.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-consumer</artifactId>
<packaging>war</packaging>
<name>dubbo-consumer Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.rpc.dubbo</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>dubbo-consumer</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 指定端口 -->
<port>8080</port>
<!-- 请求路径 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
4.2.编写处理器
import com.alibaba.dubbo.config.annotation.Reference;
import com.rpc.dubbo.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Reference
private UserService userService;
@RequestMapping("/say")
public String say(){
return userService.sayHello("Jack");
}
}
4.3.配置容器
<?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://code.alibabatech.com/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://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置服务名称-->
<dubbo:application name="hello_consumer"/>
<!-- 配置注册中心0-->
<dubbo:registry address="zookeeper://192.168.124.7:2181"/>
<!-- 引用服务的接口-->
<dubbo:annotation package="com.rpc.dubbo.controller"/>
<!-- mvc相关配置-->
<mvc:annotation-driven/>
<!-- 配置springmvc扫描的基础包-->
<context:component-scan base-package="com.rpc.dubbo.controller"></context:component-scan>
</beans>
4.4.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">
<!-- spring提供的处理字符集问题的过滤器-->
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<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*:dubbo-consumer.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
②测试
- 进行modual的组装
- 启动服务的提供方
- 启动服务的消费者
启动方式同上 - 返回请求结果
小结:
Dubbo 是一个RPC框架 主要用来做服务治理
Dubbo的核心概念:
注册中心
服务的提供者 provider
服务的消费者 consumer
四、Dubbo提供的管理端
为了能够更好的监控和管理dubbo服务 官方提供了一个可视化的监控程序
监控程序的下载:
https://github.com/apache/dubbo-admin
解压:
修改配置 基于spring-boot开发
修改注册中心地址:
incubator-dubbo-ops-master\dubbo-admin\src\main\resources\application.properties
打包dubbo-admin
incubator-dubbo-ops-master\dubbo-admin
打开命令行窗口cmd
mvn package
打包之后 到target目录下
启动运行程序
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
进入程序
http://localhost:7001/
输入用户名和密码:root/root guest /guest
启动我们自己的服务的提供者和服务的消费者
服务的提供者
服务的消费者
互联网的前沿技术 可以支撑我们的服务 提供高并发 访问
让我们的系统变得更加健壮 可维护性 可扩展行
在面试中 是加分必考项。 一门技术薪资的浮动点500/月