Dubbo
Dubbo
- 是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
- Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案、 服务治理方案。
面向接口代理:调用接口的方法,在 A 服务器调用 B 服务器的方法,由 dubbo 实现对 B 的
调用,无需关心实现的细节,就像 MyBatis 访问 Dao 的接口,可以操作数据库一样。不用关
心 Dao 接口方法的实现。这样开发是方便,舒服的。
注意:网络中传输对象需要进行序列化操作
dubbo 服务化最佳实践:(有直连方式以及注册中心方式)
需要三个工程:接口工程【java】、服务提供者工程【web】、服务消费者工程【web】
接口工程【java】:负责实体 bean 以及业务接口(提供者和消费者均依赖于它)
服务提供者工程【web】:负责实现接口工程中的服务接口,提供服务,暴露服务,供消费者调用
服务消费者工程【web】:负责调用提供者提供的服务
Dubbo + Zookeeper 使用演示
-
安装 Zookeeper,配置 zoo.cfg
Zookeeper 下载后直接解压即可,启动服务使用其相关命令即可
需要对文件进行相关配置
在安装后解压的Zookeeper目录下新建data目录,存储一些相关数据,记住该data目录路径 备份 /conf/zoo_sample.cfg,将 zoo_sanple.cfg 改名为 zoo.cfg 进入该配置文件,需要修改两处位置: 1.将dataDir的默认路径改为新建的data目录路径(记得改为斜杠) dataDir=/tmp/zookeeper(改前) dataDir=D:/Java/apache-zookeeper-3.5.7-bin/data(改后) 2.在clientPort=2181下添加指定端口,覆盖Zookeeper默认启动的8080端口 clientPort=2181 admin.serverPort=8888(新增的,用来覆盖默认的)
-
新建 maven java 工程模块
dubbo-zk-interface
,写实体bean以及业务接口【接口工程】// 实体bean // 实体类进行网络通信,必须进行序列化 public class User implements Serializable { private Integer id; private String userName; private String password; // 下略 } // 业务接口 public interface UserService { User queryUserById(Integer id); }
-
新建 maven web 工程模块
dubbo-zk-userservice-provider
,写接口实现类,提供服务【服务提供者】注意:配置Tomcat的时候记得改下两个端口号,避免启动多个服务时端口号冲突
相关依赖: <dependencies> <!-- spring 依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.16.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.16.RELEASE</version> </dependency> <!--dubbo依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <!-- 接口工程依赖 --> <dependency> <groupId>com.luis</groupId> <artifactId>dubbo-zk-interface</artifactId> <version>1.0</version> </dependency> <!-- zookeeper依赖 --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.1.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
// 接口实现类 public class UserServiceImpl implements UserService { @Override public User queryUserById(Integer id) { User user = new User(id, "luis", "123"); return user; } }
spring配置文件:当下命名为dubbo-zk-userservice-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://dubbo.apache.org/schema/dubbo" 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"> <!-- 声明dubbo服务提供者名称:保证唯一性 --> <dubbo:application name="dubbo-zk-userservice-provider"/> <!-- 声明dubbo使用的协议名称以及端口号 --> <dubbo:protocol name="dubbo" port="20880"/> <!-- 使用Zookeeper注册中心 --> <!-- 指定注册中心地址和端口号 --> <dubbo:registry address="zookeeper://localhost:2181"/> <!-- 暴露服务接口 --> <dubbo:service interface="com.luis.service.UserService" ref="userServiceImpl"/> <!-- 加载接口实现类 --> <bean id="userServiceImpl" class="com.luis.service.impl.UserServiceImpl"/> </beans>
-
新建 maven web 工程模块
dubbo-zk-consumer
,调用服务接口【服务消费者】注意:配置Tomcat的时候记得改下两个端口号,避免启动多个服务时端口号冲突
<dependencies> <!-- spring 依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.16.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.16.RELEASE</version> </dependency> <!--dubbo依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <!-- 接口工程依赖 --> <dependency> <groupId>com.luis</groupId> <artifactId>dubbo-zk-interface</artifactId> <version>1.0</version> </dependency> <!-- zookeeper依赖 --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.1.0</version> </dependency> <!-- servlet依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- jsp依赖 --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2.1-b03</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
applicationContext.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" 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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 声明组件扫描器 --> <context:component-scan base-package="com.luis.web"/> <!-- 配置注解驱动 --> <mvc:annotation-driven/> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
dubbo-zk-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服务消费者名称:保证唯一性 --> <dubbo:application name="dubbo-zk-consumer.xml"/> <!-- 指定zookeeper注册中心 --> <dubbo:registry address="zookeeper://localhost:2181"/> <!-- 引用远程接口服务 --> <dubbo:reference id="userService" interface="com.luis.service.UserService"/> </beans>
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"> <!-- 注册中央调度器 --> <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:applicationContext.xml,classpath:dubbo-zk-consumer.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
// 控制器类 @Controller public class UserController { @Autowired private UserService userService; @RequestMapping("/userDetail") public String userDetail(Integer id, Model model) { User user = userService.queryUserById(id); model.addAttribute("user", user); return "userDetail"; } }
userDetail.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/"; %> <html> <head> <base href="<%=basePath%>"> <title>Title</title> </head> <body> <h3>用户详情</h3> <span>用户标识:${user.id}</span> <span>用户姓名:${user.userName}</span> <span>用户密码:${user.password}</span> </body> </html>
-
测试
先启动Zookeeper注册中心 再启动服务提供者 最后启动服务消费者 在服务消费者服务地址栏进行访问:http://localhost:8080/userDetail?id=12 注意:多服务启动,端口不能相同
版本号version使用
当服务提供者对同一个接口有多个实现类时,需要用到版本号进行区分!
在服务提供者工程的配置文件中进行如下配置:
<?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"
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">
<!-- 声明dubbo服务提供者名称:保证唯一性 -->
<dubbo:application name="dubbo-zk-userservice-provider"/>
<!-- 声明dubbo使用的协议名称以及端口号 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 使用Zookeeper注册中心 -->
<!-- 指定注册中心地址和端口号 -->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- 暴露服务接口 -->
<dubbo:service interface="com.luis.service.UserService" ref="userServiceImpl1"
version="1.0.0"/>
<dubbo:service interface="com.luis.service.UserService" ref="userServiceImpl2"
version="2.0.0/>
<!-- 加载接口实现类 -->
<bean id="userServiceImpl1" class="com.luis.service.impl.UserServiceImpl1"/>
<bean id="userServiceImpl2" class="com.luis.service.impl.UserServiceImpl2"/>
</beans>
在服务消费者工程的配置文件中进行如下配置:
<?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="dubbo-zk-consumer.xml"/>
<!-- 指定zookeeper注册中心 -->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- 引用远程接口服务 -->
<dubbo:reference id="userService1" interface="com.luis.service.UserService" version="1.0.0"/>
<dubbo:reference id="userService2" interface="com.luis.service.UserService" version="2.0.0"/>
</beans>
都看到最后了,右下角来个赞鸭!-.- 欢迎评论留言~