目录
- 第一章、概念介绍
- 1.1)什么是RPC框架
- 1.2)什么是分布式系统
- 1.3)Dubbo概述
- 1.3)Dubbo基本架构
- 第二章、服务提供者
- 2.1)目录结构和依赖
- 2.2)model层
- 2.3)service层
- 2.4)resources配置文件
- 第三章、服务消费者
- 3.1)目录结构和依赖
- 3.2)service层
- 3.3)resources配置文件
友情提醒
先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。 |
第一章、概念介绍
1.1)什么是RPC框架
RPC 【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,是一种技术思想,而不是规范。它允许程序调用另一个地址空间(网络的另一台机器上)的过程或函数,而不用开发人员显式编码这个调用的细节。调用本地方法和调用远程方法一样。
1.2)什么是分布式系统
分布式系统是若干独立计算机(服务器)的集合,这些计算机对于用户来说就像单个相关系统,分布式系统(distributed system)是建立在网络之上的服务器端一种结构。
部署在独立服务器上的各个子系统(项目),相互之间可以调用,形成一个大型分布式系统
独立部署的服务器没有额外要求,只需要满足子系统需求即可。
分布式系统中的计算机可以使用不同的操作系统,可以运行不同应用程序提供服务,将服务分散部署到多个计算机服务器上。
1.3)Dubbo概述
Dubbo官网网址:官网链接
①Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。可以和Spring框架无缝集成。
②Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案、服务治理方案。
③面向接口代理:调用接口的方法,在A服务器调用B服务器的方法,由dubbo实现对B的调用,无需关心实现的细节,就像MyBatis访问Dao的接口,可以操作数据库一样。不用关心Dao接口方法的实现。这样开发是方便,舒服的。
④支持多种协议:dubbo , hessian , rmi , http, webservice , thrift , memcached , redis。dubbo官方推荐使用dubbo协议。dubbo协议默认端口20880
1.3)Dubbo基本架构
①服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时向注册中心注册自己提供的服务。服务容器spring负责启动,加载,运行服务提供者。
②服务消费者(Consumer): 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
③注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者 –如果信息有变,注册中心提供新的信息给消费者
④监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心 –监控服务提供者、消费者状态,与开发没有直接关系
第二章、服务提供者
2.1)目录结构和依赖
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.bjpowernode.dubbo</groupId>
<artifactId>001-link-orderservice-provider</artifactId>
<version>1.0.0</version>
<dependencies>
<!--Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<!--Dubbo依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--JDK1.8编译插件-->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.2)model层
order
package com.bjpowernode.dubbo.model;
import java.io.Serializable;
public class Order implements Serializable {
private String id;
private String goodsName;
private Double price;
private Integer amount;
public Order() {
}
public Order(String id, String goodsName, Double price, Integer amount) {
this.id = id;
this.goodsName = goodsName;
this.price = price;
this.amount = amount;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Integer getAmount() {
return amount;
}
public void setAmount(Integer amount) {
this.amount = amount;
}
@Override
public String toString() {
return "Order{" +
"id='" + id + '\'' +
", goodsName='" + goodsName + '\'' +
", price=" + price +
", amount=" + amount +
'}';
}
}
2.3)service层
OrderService
package com.bjpowernode.dubbo.service;
import com.bjpowernode.dubbo.model.Order;
public interface OrderService {
public Order addOrder(Integer userId,String goodsName, Double price,Integer amount);
}
OrderServiceImpl
package com.bjpowernode.dubbo.service;
import com.bjpowernode.dubbo.model.Order;
public class OrderServiceImpl implements OrderService{
public Order addOrder(Integer userId, String goodsName, Double price, Integer amount) {
return new Order("110",goodsName,price,amount);
}
}
OrderApplication
package com.bjpowernode.dubbo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import java.io.IOException;
public class OrderApplication {
public static void main(String[] args) throws IOException {
/**
* 启动spring容器:阅读配置文件
* 1、 new ClassPathXmlApplicationContext("orderservce-provider.xml");
* 2、 new FileSystemXmlApplicationContext("D:/orderservce-provider.xml");
* 3、tomcat启动
*/
new ClassPathXmlApplicationContext("orderservce-provider.xml");
//标准键盘输入:线程会阻塞
System.in.read();
}
}
2.4)resources配置文件
orderservce-provider.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans" 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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--服务项目名称:唯一 ,它的名称是dubbo内部使用的唯一标识 饭店名称-->
<dubbo:application name="001-link-order-service-provider"></dubbo:application>
<!--定义协议:告诉消费者如何访问 怎么访问-->
<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
<!--
dubbo:service:提供(暴露)服务 菜单
interface:区分不同的服务
ref:关联真正提供服务的bean对象
registry="N/A":直连
-->
<dubbo:service
interface="com.bjpowernode.dubbo.service.OrderService"
ref="orderServiceImpl" registry="N/A"
/>
<!--真正提供服务的bean对象 厨师-->
<bean id="orderServiceImpl" class="com.bjpowernode.dubbo.service.OrderServiceImpl"></bean>
</beans>
第三章、服务消费者
3.1)目录结构和依赖
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.bjpowernode.dubbo</groupId>
<artifactId>002-link-main-web</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>com.bjpowernode.dubbo</groupId>
<artifactId>001-link-orderservice-provider</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
3.2)service层
ShopService
package com.bjpowernode.dubbo.service;
import com.bjpowernode.dubbo.model.Order;
public interface ShopService {
public Order buyGoods(Integer userId, String goodsName, Double price, Integer amount);
}
ShopServiceImpl
package com.bjpowernode.dubbo.service;
import com.bjpowernode.dubbo.model.Order;
public class ShopServiceImpl implements ShopService {
OrderService orderService;
public void setOrderService(OrderService orderService) {
this.orderService = orderService;
}
public Order buyGoods(Integer userId, String goodsName, Double price, Integer amount) {
// new OrderServiceImpl().addOrder()
return orderService.addOrder(userId, goodsName, price, amount);
}
}
ShopApplication
package com.bjpowernode.dubbo;
import com.bjpowernode.dubbo.model.Order;
import com.bjpowernode.dubbo.service.ShopService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ShopApplication {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("shop-consume.xml");
ShopService shopServiceImpl = (ShopService)context.getBean("shopServiceImpl");
Order order = shopServiceImpl.buyGoods(1111, "apple", 10d, 2);
System.out.println(order);
}
}
3.3)resources配置文件
shop-consume.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans" 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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--服务项目名称:唯一-->
<dubbo:application name="002-link-main-web"></dubbo:application>
<!--
dubbo:reference:生成一个 代表远程服务的 bean对象
id="remoteOrderService":bean对象名称
url:dubbo服务地址
interface:区分不同的服务
registry="N/A":直连
-->
<dubbo:reference
id="remoteOrderService"
url="dubbo://localhost:20880"
interface="com.bjpowernode.dubbo.service.OrderService"
registry="N/A"
/>
<bean id="shopServiceImpl" class="com.bjpowernode.dubbo.service.ShopServiceImpl">
<property name="orderService" ref="remoteOrderService"></property>
</bean>
</beans>