dubbo入门示例
本文内容纲要:dubbo入门示例
本文主要介绍阿里dubbo的基本使用,关于dubbo的相关基础概念请自行参考dubbo官网:http://www.dubbo.io
dubbo是一个服务治理的框架,在如今大规模的分布式应用和SOA架构中,服务治理的问题显的尤为的重要。
以我个人使用dubbo的场景来总结,dubbo主要解决如下问题:
1.项目服务化后,项目之间的高性能通讯问题。(项目被拆分成多个服务模块后必然会涉及模块之间的通讯)
2.服务的URL管理,当项目拆分为N个服务并且不断增加时,如何有效的管理的服务URL
3.服务发现和服务移除,动态的管理服务
带着以上三个问题开始dubbo的学习和入门demo的开发。
示例项目分为三个,分别是:
1. dubbo-api:提供统一的接口,最终会打为jar包,供consumer和provider引用
2.dubbo-provider:服务提供者,包含api接口的实现类,提供服务的实现逻辑
3.dubbo-consumer:该项目是一个web项目,有几个作用,首先该项目以http的形式提供前端和浏览器访问的接口,
其次,该项目也是dubbo消费者,用来消费dubbo-provider项目提供的服务。所以该项目可以通过浏览器调用接口测试,
也可以使用postman或者前端js来调用进行测试,比较接近真实环境的使用场景。
首先开发dubbo-api:
项目结构如下图:
该项目只有一个文件,是一个接口,他定义了统一的接口让provider和consumer来引用,接口文件内容如下:
public interface UserService { String sayHi(String name);
}
很纯粹的一个java接口,不再多解释什么了。
在该项目的classpath路径下提供了一个xml配置,该配置文件其实就是dubbo消费者的相关配置,后边消费者项目引入api之后可以直接使用该文件。
文件内容如下:
<?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:reference id="userService" interface="com.dubbo.api.UserService" cluster="failfast" check="false"/>
</beans>
抛开xml头文件,该文件的内容也只有一行而已,通过dubbo:reference标签来引用服务配置。
其次是该项目的pom文件:
<?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.demo.dubbo</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
pom文件中在引入dubbo包时,排除掉了dubbo自带的spring引用,因为dubbo自带的spring依赖版本过低,我们使用自己导入的spring版本
到此位置dubbo-api项目已开发完成。
通过maven将其打成jar包,一会consumer和provider需要引入该包。
接着我们开发dubbo-provider,项目结构如下:
该项目只有两个类,一个是服务实现类UserServiceImpl,代码如下:
public class UserServiceImpl implements UserService { public String sayHi(String s) {
return "hello " + s + "!";
}
}
另外一个Main文件是启动dubbo服务的,内容如下:
public class Main { public static void main(String[] args) {
com.alibaba.dubbo.container.Main.main(args);
}
}
该类是dubbo框架提供,作用是启动dubbo服务,dubbo会在启动服务时,读取classpath下一个名为dubbo.properties文件的属性值。
并指定了属性key,只要按照dubbo的规则配置相关参数即可。有兴趣的可以去查看下dubbo的源码。
dubbo.properties文件配置如下:
dubbo.container=spring#set dubbo Sping load setting xmls
dubbo.spring.config=classpath:dubbo-provider.xml
dubbo.protocol.name=dubbo
dubbo.protocol.port=28511
dubbo.container指定了dubbo的容器使用spring,dubbo内部有四种容器实现,SpringContainer是其中一种,也是默认的容器
dubbo.spring.config指定了dubbo在启动服务时加载的spring配置文件。
dubbo.protocol.name和dubbo.protocol.port分别指定使用的协议名和端口
贴一下dubbo的源码,SpringContainer类中定义了两个常量,SPRING_CONFIG和DEFAULT_SPRING_CONFIG,
大概读一下代码就可以知道,start方法在执行时,会读取dubbo.spring.config属性值,该值指定的就是spring的配置文件,如果没读到,则使用默认的配置
默认配置为classpath下META-INF/spring/*.xml,意思是读取classpath下META-INF文件夹下的spring文件夹中的所有xml文件。
所以我们也可以不配置dubbo.spring.config,但是要遵循dubbo默认的读取路径,将spring配置文件放置在META-INF/spring文件夹下。
接下来看dubbo-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: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:application name="dubbo-provider"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:provider cluster="failfast"/>
<bean id="userService" class="com.dubbo.provider.UserServiceImpl"/>
<dubbo:service interface="com.dubbo.api.UserService" ref="userService"/>
</beans>
该文件其实就是一个spring配置文件,只不过引入了dubbo相关的配置。
dubbo:application指定了程序名称,我们可以在dubbo管理后台中通过该名称更清晰的区分服务
dubbo:registry指定了注册中心的地址
dubbo:provider指定了集群容错模式,此处为快速失败
dubbo:service服务导出,引用
最后来看下provider项目的pom文件:
<?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.yinyuetai.dubbo</groupId>
<artifactId>dubbo-provider</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.demo.dubbo</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
</project>
此处引入了zk相关的包,因为服务提供者在启动时会向注册中心注册服务。
此处的provider引入了dubbo-api的jar包。
到此位置,provider项目的开发已经完成。
最后来看dubbo-consumer这个web项目,相对来说也是三个项目中最为负责的一个。
项目结构:
UserController类就是个控制器,使用requestMapping注解提供http接口服务,内容如下:
@RestControllerpublic class UserController {
@Autowired
private UserService userService;
@RequestMapping("/hello.html")
@ResponseBody
public String sayHello(String name) {
String welcome = userService.sayHi(name);
return welcome;
}
}
接下来看配置文件,首先看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_3_0.xsd"
id="WebApp_ID" version="3.0">
<!-- 配置Spring配置文件路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:spring-config.xml
</param-value>
</context-param>
<!-- 配置Spring上下文监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>
下边servlet中配置spring-mvc配置文件的位置,都是spring开发的基本配置。不多解释了
spring-config.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: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/context http://www.springframework.org/schema/context/spring-context.xsd"
default-autowire="byName">
<!-- 开启注解配置 -->
<context:annotation-config/>
<import resource="classpath:dubbo-consumer.xml"/>
</beans>
开启了注解支持,并且通过import导入了另一份配置文件
dubbo-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: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:application name="dubbo-consumer"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:consumer check="false"/>
<!-- 导入dubbo配置 -->
<import resource="classpath*:user-reference.xml"/>
</beans>
该配置指定了应用程序的名称,注册中心地址,以及dubbo-api项目中定义的dubbo配置文件。
spring-mvc.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: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/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置自动扫描的包路径 -->
<context:component-scan base-package="com.dubbo.consumer.web"/>
</beans>
仅仅定义了自动扫描的包路径而已
最后看下pom文件:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yinyuetai.dubbo</groupId>
<artifactId>dubbo-consumer</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>dubbo-consumer Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.demo.dubbo</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
<build>
<finalName>dubbo-consumer</finalName>
</build>
</project>
到此。dubbo的入门demo已经全部开发完成。
先通过Main.java中的main方法 启动dubbo-provider项目。
然后将dubbo-consumer项目打成war包,部署到tomcat或其他web容器中。
在浏览器中访问:localhost:tomcatport/dubbo-consumer/hello.html?name=test
tomcatport换成你本地的tomcat端口号
可以看到浏览器输出:
说明我们的项目已经成功部署,可以成功调用了。
此时观察dubbo管理后台,可以看到如图所示:
两个应用分别对应我们开发的provider和consumer,而名字则是由<dubbo:application name>指定的。
一个消费者,一个服务提供者,和我们开发的东西完全吻合。到此为止dubbo的入门示例已经全部完成。
相关的代码放在了码云,懒的动手的可以直接下载运行看看效果。
码云地址:
dubbo-api:https://git.oschina.net/li_mingzhu/dubbo-api.git
dubbo-provider:https://git.oschina.net/li_mingzhu/dubbo-provider.git
dubbo-consumer:https://git.oschina.net/li_mingzhu/dubbo-consumer.git
关于dubbo管理后台,其实就是一个war包,只要部署在web容器运行即可。
暂时还没有整理关于dubbo管理后台部署的文章,后续整理了我会补发链接。
本文内容总结:dubbo入门示例
原文链接:https://www.cnblogs.com/leemz-coding/p/7113530.html
以上是 dubbo入门示例 的全部内容, 来源链接: utcz.com/z/295959.html