在 Spring 框架中使用 Dubbo
在 Spring 框架中使用 Dubbo
参考网址
http://dubbo.apache.org/zh-cn/ Dubbo 官网
http://dubbo.apache.org/zh-cn/docs/user/quick-start.html Dubbo 文档
框架组成
spring 5.1.3 + zookeeper 3.6.2 + dubbo 2.6.5;
工具:IDEA 2019.1.2
Dubbo 体系结构
执行流程:
-
启动注册中心:例如 zookeeper,接受 provider 的注册,接受 consumer 的订阅,当 provider 有变化的时候,会主动通知 consumer;
-
启动Provider:provider是服务的提供者,例如提供 com.xian.service.impl.UserServiceImpl 这个服务,它是服务的具体实现,provider 启动的时候会向 zookeeper 这个注册中心注册,表明自己可以提供哪些服务;
-
启动Consumer:consumer 是服务的消费者,例如通过 com.xian.controller.UserController 去调用 UserServiceImpl,consumer 启动的时候会去 zookeeper 这个注册中心 订阅自己需要的服务;
-
启动Registry:注册中心,例如 zookeeper,接受 provider 的注册,接受 consumer 的订阅,当 provider 有变化的时候,会主动通知 consumer;
-
consumer 调用 provider 的具体服务,例如 UserController 调用 UserServiceImpl,但是具体由那一台 provider 服务器提供服务,取决于 负载均衡调度算法;
-
Monitor:监控中心,统计服务被调用的次数和时间,服务的消费者和提供者会在内存中累计调用次数和
调用时间,定时每分钟向监控中心发送一次统计数据;
创建 Project
菜单栏:File| New Project, 创建一个空的 Project
填 Project 的名称和存放路径,然后点击右下角的【Finish】:
要在这个 Project 下创建 3 个子 module,最终目录 module 结构如下:
工程:dubbo-spring-common
创建工程
填项目的坐标:GroupId, ArtifactId
工程结构
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.xian</groupId>
<artifactId>dubbo-spring-common</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
</project>
User.java
package com.xian.entity;
import java.io.Serializable;
/**
* Author: xian
* Date: 2020-10-19 21:02
* Description: 描述
*/
public class User implements Serializable {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
UserService.java
package com.xian.service;
import com.xian.entity.User;
/**
* Author: xian
* Date: 2020-10-19 21:04
* Description: 描述
*/
public interface UserService {
public User findById(int id);
}
工程:dubbo-spring-provider
创建工程
父 module 和父工程全部选【None】:
填项目的坐标:GroupId, ArtifactId
工程结构
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.xian</groupId>
<artifactId>dubbo-spring-provider</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 依赖于 dubbo-spring-common -->
<dependency>
<groupId>com.xian</groupId>
<artifactId>dubbo-spring-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 依赖于 spring 的 4 个包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</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-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dubbo 的核心包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.5</version>
</dependency>
<!-- zookeeper 核心包 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
</dependency>
<!-- zookeeper 的客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
<properties>
<spring.version>5.1.3.RELEASE</spring.version>
</properties>
</project>
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:application name="dubbo-spring-provider"/>
<!-- 指定注册中心 zookeeper 的地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 协议和开放的访问端口-->
<dubbo:protocol name="dubbo" port="8888"/>
<!-- 配置要暴露的端口-->
<dubbo:service interface="com.xian.service.UserService" ref="userService"/>
<bean id="userService" class="com.xian.service.impl.UserServiceImpl"/>
</beans>
UserServiceImpl.java
package com.xian.service.impl;
import com.xian.entity.User;
import com.xian.service.UserService;
/**
* Author: xian
* Date: 2020-10-19 21:22
* Description: 描述
*/
public class UserServiceImpl implements UserService {
@Override
public User findById(int id) {
System.out.println("UserServiceImpl.findById");
User user = new User();
user.setId(id);
user.setUsername("xian");
user.setPassword("123");
return user;
}
}
Test.java
这是测试程序
package com.xian;
import javassist.ClassPath;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Scanner;
/**
* Author: xian
* Date: 2020-10-19 22:17
* Description: 描述
*/
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:provider.xml");
new Scanner(System.in).next();
}
}
工程:dubbo-spring-consumer
创建工程
创建 ioc 容器文件:consumer.xml
创建后的效果:
工程结构
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.xian</groupId>
<artifactId>dubbo-spring-consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 依赖于 dubbo-spring-common -->
<dependency>
<groupId>com.xian</groupId>
<artifactId>dubbo-spring-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- spring 的 4 个核心包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</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-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dubbo 核心包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.5</version>
</dependency>
<!-- zookeeper 的客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
<properties>
<spring.version>5.1.3.RELEASE</spring.version>
</properties>
</project>
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://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:application name="dubbo-spring-consumer"/>
<dubbo:reference id="userService" interface="com.xian.service.UserService" retries="3" check="false" url="dubbo://127.0.0.1:8888"/>
<bean class="com.xian.controller.UserController">
<property name="userService" ref="userService"/>
</bean>
</beans>
UserController.java
package com.xian.controller;
import com.xian.entity.User;
import com.xian.service.UserService;
/**
* Author: xian
* Date: 2020-10-19 22:24
* Description: 描述
*/
public class UserController {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public void findUser() {
User user = userService.findById(1001);
System.out.println(user);
}
}
Test.java
package com.xian;
import com.xian.controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Scanner;
/**
* Author: xian
* Date: 2020-10-19 22:39
* Description: 描述
*/
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:consumer.xml");
UserController userController = ac.getBean(UserController.class);
userController.findUser();
new Scanner(System.in).next();
}
}
启动 zookeeper
启动 dubbo-spring-provider
打开 Test.java (dubbo-spring-provider) ,按 Ctrl + Shift + F10,或者右键 【Run 'Test main'】运行此文件;
启动 dubbo-spring-consumer
打开 Test.java (dubbo-spring-consumer) ,按 Ctrl + Shift + F10,或者右键 【Run 'Test main'】运行此文件;
打印
Test.java (dubbo-spring-provider) 打印:
Test.java (dubbo-spring-consumer) 打印:
可以看到,consumer 访问了 provider 提供的服务;
原文地址:https://www.cnblogs.com/xian19900116/p/13855091.html
- AWK 深入浅出教程
- Docker系列教程09-使用Docker Hub管理镜像
- C++11基础学习系列一
- 触屏touchstart 与 click
- Linux DNS之dig利器
- Docker系列教程08-Dockerfile实战
- VirtualBox和Vmware安装增强功能
- 事件委托与阻止冒泡
- Linux网络工具之Ping命令
- Linux DNS之nslookup命令
- 【LEETCODE】模拟面试-108-Convert Sorted Array to Binary Search Tree
- javascript单线程环境实现真正的setTimeout
- 利用pipework与OVS构建跨主机容器网络
- Docker系列教程07-Dockerfile指令详解
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- SAP Fiori Elements如何基于domain fixed value创建下拉菜单
- SAP WebClient UI配置决定(configuration)的逻辑介绍
- 潘石屹用Python解决100个问题 | 阶乘之和
- 潘石屹用Python解决100个问题 | 斐波那契数列分数
- Leetcode No.7 整数反转
- 后端程序员必备的 Linux 基础知识+常见命令(近万字总结)
- XSS Game分析以及知识点总结
- Web 图形可视化 SQL 优化神奇,真香!
- C++ vector 容器浅析
- C++中的STL中map用法详解
- C++ pair(对组)的简单了解
- elasticSearch学习(六)
- centos7搭建LDAP服务器
- zookeeper is not a recognized option zookeeper参数不支持
- 快来看看你是不是“假的”DBA