目录
Dubbo 入门程序
1.Dubbo简介
1.1Dubbo 相关概念
Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维护,为了与原有的Dubbo区分,故将其命名为Dubbox。
Dubbox 致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbox就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbox这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架。
1.2 Dubbo 的相关术语
- provider:服务提供方,将接口暴露到注册中心
- consumer:服务消费放,首先需要监听注册中心,如果注册中心有服务,服务消费放方血药的服务,可消费服务
- registry:注册中心:容器(存放接口消息)。在dubbo中可以使用Redis,Muticast,Zookeeper作为注册中心
- container:容器,服务运行的容器,Tomcat
- monitor:监控软件
1.3 Dubbo结构图以及执行流程
执行流程
- 容器启动加载服务提供者,
- 服务提供方在启动的时候,向注册中心暴露(注册自己的服务)
- 服务消费方向注册中心订阅自己所需要的服务
- 注册中心向服务消费放返回服务的地址列表,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者从返回的地址列表中用软负载均衡算法选一个服务进行调用,如果调用失败,在选另一个服务进行调用
- 服务消费者和提供者,在内存中调用次数和调用时间,每分钟向Monitor(监控中心)发送一次
2.入门程序
2.1 安装注册中心
官方推荐使用 zookeeper 注册中心。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbox 服务的注册中心,工业强度较高,可用于生产环境。
- zookeeper 的压缩包上传到 linux 系统
Alt+P 进入SFTP ,输入put d:\zookeeper-3.4.6.tar.gz 上传 - 解压缩压缩包
tar -zxvf zookeeper-3.4.6.tar.gz - 进入conf目录 ,把 zoo_sample.cfg 改名为 zoo.cfg
cd conf
mv zoo_sample.cfg zoo.cfg - 编辑zoo.cfg文件, 修改 dataDir 属性:
dataDir=/root/zookeeper-3.4.6/data
2.2 启动服务
./zkServer.sh start
2.3 关闭服务
./zkServer.sh stop
2.4 编写服务提供方
2.4.1 创建项目
2.4.2 编写pom文件
<!-- spring版本 -->
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
</properties>
<!-- 相关依赖 -->
<dependencies>
<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>2.8.4</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.11.0.GA</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 项目编译插件,即jdk -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<!-- 项目部署插件,即tomcat -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 指定端口 -->
<port>8081</port>
<!-- 请求路径 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
2.4.3 dubbox-provider.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
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://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置应用名称 -->
<dubbo:application name="dubboxdemo-service" />
<!-- 配置注册中心 -->
<dubbo:registry address="zookeeper://192.168.200.128:2181" />
<!-- 暴露的服务 -->
<dubbo:annotation package="com.wlqk.dubbo.service" />
</beans>
2.4.4 编写web.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<context-param>
<param-name>contextConfigLocation</param-name>
<!--classpath*:加载所有依赖的项目的配置文件-->
<!--在这里不仅要加载本工程的配置文件,也要加载所有依赖jar的配置文件-->
<param-value>classpath:dubbox-provider.xml</param-value>
</context-param>
<!--监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
2.4.5 编写service接口以及实现类
接口:
package com.wlqk.dubbo.service;
import com.alibaba.dubbo.config.annotation.Service;
/**
* @Description:
* @Author: zc
* @CreateDate: 2019/2/21$ 9:16$
*/
public interface ProviderService {
public void getName(String name);
}
实现类:
package com.wlqk.dubbo.service;
import com.alibaba.dubbo.config.annotation.Service;
/**
* @Description:
* @Author: zc
* @CreateDate: 2019/2/21$ 9:17$
*/
@Service
public class ProviderServiceImpl implements ProviderService {
@Override
public void getName(String name) {
System.out.println("服务消费方传递参数:"+name);
}
}
注意点:
2.5 编写服务消费方
2.5.1 创建项目
2.5.2 编写pom文件
2.5.3 dubbox-consumer.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
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://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<mvc:annotation-driven/>
<!-- 配置应用名称 -->
<dubbo:application name="dubboxdemo-web" />
<!-- 配置注册中心 -->
<dubbo:registry address="zookeeper://192.168.200.128:2181" />
<!-- 发现服务 -->
<dubbo:annotation package="com.wlqk.dubbo.controller" />
</beans>
2.5.4 创建并编辑web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>dobbox-web</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dubbox-consumer.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dobbox-web</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
2.5.5 复制接口代码到该工程中
连个接口的包名要一致
2.5.6 编写Controller
@Reference 注解必须是dubbo的
package com.wlqk.dubbo.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.wlqk.dubbo.service.ProviderService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description:
* @Author: zc
* @CreateDate: 2019/2/21$ 9:34$
*/
@RestController
@RequestMapping("user")
public class CunsumerController {
@Reference
private ProviderService providerService;
@RequestMapping("/getName.do")
public String getName(){
return providerService.getName("张三");
}
}