一个项目中有很多个功能,每个功能放在不同的计算机和系统中,这些功能又形成了一个整体项目,但是我们的用户不知道有这么多计算机和系统,用户看起来操作的是一个完整的项目。
在有限的 资源(服务器) 下 提高 资源(服务器)的 利用率,就使用异步通信,提高请求的处理效率,比如订外卖和滴滴。
长连接网络通道:
协议建立好 长连接 通道就建立好了,许多个请求可以通过一个长连接通道传递到服务端,服务端将结果也通过这个长连接通过传递回去。
长连接 通过 创建好 就不会 关闭了 。就不会每次 为一个请求 创建通道。所有的请求都用这个 长连接通过 。
长连接 适合 传递 数据量较小的 数据,大数据 不适合,因为就这么一条道,占用时间太长了。
短连接:
每次 都会 给 请求 创建 一个 通道 ,请求完成之后 通道就被销毁了 。但是短连接 占用资源 比较少。
Web页面 和 服务器 用的是 短连接。
服务器 与 服务器 之间 用的是 长连接。
提供者 注册服务
消费者 订阅服务
注册器 给 订阅服务的 消费者 提供注册信息
消费者 根据信息 使用 服务者 提供的服务。
配置dubbo配置文件的步骤:
专门用来处理配置文件的方法:
/*
我们创建 两个 实体类 domain对象,还有两个接口,这两个接口我们会打包成jar包。
知识点:
1.java项目中 导入外界的功能,使用别人定义好的类中的方法或者接口中的方法我们怎么办呢?
方法为: 别人 写好了功能类 和 功能类中的方法 ,然后 就 将这个 功能了类 和 功能方法 还有相关 的实体类,
打包成一个 jar包,这个jar包 我们导入之后 就可以直接使用了,直接创建 功能类和功能的方法。
2.web项目中 导入外界写好的页面 和 页面中的 功能,我们 所采用的方式和我们在java中才取的方式是一样的,就是
我们将 别人将写好的网站项目打包成了一个war包,我们只需要将这个war包,发布到webapp中就可以直接使用了。我们然后在
从eclipse中使用tomcat来启动这个war的项目 就可以了。
总结: jar 和 war 都是我们 使用 别人 或者说是 外界官方提供好的 功能,我们如果想用 别人的提供的功能 就可以导入jar包和war包。
在我们的像在 java项目中 我们一般采用的 分布式的开发方式。 所以说我们的 项目中的功能模块和功能模块之间都是相互独立的,每一个模块只负责一个功能的实现。
我们的项目 中 有两个 模块 : (1)消费者模块 (2)生产者模块 这两个模块 是相互独立的 , 消费者模块的作用是 获取信息的,生产者模块是 提供信息的 。
那么我们 怎么 从 消费者模块 中 获取到 生产者 提供的信息呢?
我们需要从我们的 生产者模块中 编写 提供信息的 业务层实现类,业务层实现类中我们 进行 数据信息的获取 。
我们 业务层实现类中获取数据的方式 是我们的 业务层接口 提供的。
我们将 业务层实现类 提供的信息 存放进 我们的实体类对象中 ,如:提供天气的信息我们就 创建天气的实体类,我们如果需要电影的信息我们就将这些信息存放进我们的电影是实体类当中。
但是需要注意一点的是:
1.我们 的 功能模块和功能模块之间是 存在于不同的 服务器中的,比如 我们 功能1 存在于 tomcat 和 功能2 存在于 tomcat虚拟机1中,这两个项目 是 运行在不同的服务器 当中。
2.服务器 和 服务器 之间的 数据传输 是依靠的 网络传输的。 所以我们需要将我们 生产者提供的 数据 进行序列化,然后才能通过 网络进行传输。
我们消费者 怎么 调用 我们的 接口实现类中的方法呢?
我们 将 接口 和 与接口相关的实现类 打包成jar包,在我们消费者模块项目中导入,然后我们就可以使用 生产者接口中的方法了。
但是这些 操作 发生的 基础都是 依靠我们的 dubbo协议:
我们将 我们的 生产者的 接口和接口中的功能 暴露在了 dubbo://ip地址:端口号 下面了,我们只需要去这个端口下面获取方法调用方法就可以了。
*/
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- 这个是 使用的 zookeeper 协议zookeeper运行在 本机的 2181端口下 -->
<!-- 这时候我们的 提供的 url 访问 接口暴露的地址 就不用写了,因为我们的服务者在运行启动的时候 会将自身的 所在ip,功能接口所在的端口号,还有服务本身的名字 注册到 注册中心中 -->
<!-- 我们的 消费者 会 订阅 自己需要的 服务 ,然后 注册中心就会将 访问 服务者 暴露接口的 地址 推送给我们的 消费者,原先我们手动提供这个地址,现在有我们的 注册中心动态管理了,如果我们的 服务者坏了,我们的注册中心会提供一个可以用的得地址,这个地址中的端口中暴露的接口可以处理我们的消费者 -->
<!-- 我们的 注册中心利用 心跳机制 时时刻刻的 监视着我们的 服务者,如果服务者不能使用了,注册中心就会将 服务者注册的信息全部删掉,然后通知所有的订阅了此服务的消费者 ,告诉消费者这个服务不能使用了,这样我们的消费者就不能不会使用这个坏掉的服务了,我们消费者就每次都能拿到可以服务的地址 来访问服务者-->
<!-- 心跳机制 : 2s 跳一次 -->
<dubbo:reference interface="com.bjpowernode.service.MovieService" id="movieServiceImpl"/>
<dubbo:reference interface="com.bjpowernode.service.WeatherService" id="weatherServiceImpl"/>
*******倍权的 概念: 1 和 1.5 意思是:倍权为1.5的服务器比倍权为1的服务器多50%的服务量。
<dubbo:application name="xxxx"/>
Xxxx这个名字是提供给我们的dubbo框架 内部使用的,所以这个名字最好 是 唯一值。
------------写dubbo项目的时候 需要注意的 事项:
*********在写 dubbo项目的时候,需要注意的事情有:
(1)实体类 不要 忘记 序列化 。千万不要忘记序列化。
(2)千万不要忘记 开 dubbo ,也就是:
知识点一: dubbo的实际小项目应用。
例子: 根据 城市的 编号 获取 城市 的 名称。
- 包含功能的 jar 包: 里面主要包含 功能接口 和 序列化实体类。
DomainAndService-1项目包结构:
代码内容:
-----序列化实体类代码:
package com.bjpowernode.domain;
import java.io.Serializable;
public class City implements Serializable{
private static final long serialVersionUID = -6849712570754667710L;
private String name ;
public City() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public String toString() {
return "City [name=" + name + "]";
}
}
-------功能接口代码:
package com.bjpowernode.service;
import com.bjpowernode.domain.City;
public interface CityService {
City getCityName(String name);
}
将这个项目打包成一个 jar ,作为 生产者模块和消费者模块的依赖(jar)。
打包的内容包括:功能接口 和 功能接口相关联的 实体类。
生产者 和 消费者 需要导入的 jar 包:
还需要一个 功能接口的 jar 包:
供应者 模块 中 接口 实现类:
供应者的 dubbo 配置文件: (需要注意的是 我们的 dubbo框架是以spring框架为基础的)。
供应者 配置文件中的内容 :
我们的 dubbo框架 是基于我们的 spring 框架的,所以说我们 加载我们的 dubbo 框架的配置文件的时候,可以使用我们的spring框架的加载器,我们的spring加载器会顺便将我们的dubbo框架的配置文件加载了。
*****我会在 消费者模块中 使用第二种加载 配置文件 的方法。
消费者模块 dubbo 配置文件中的内容
<?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:registry address="zookeeper://localhost:2181"/>
<!-- 声明我们的消费者名字,这个名字是我们的dubbo内部使用的。 -->
<dubbo:application name="Dubbo-Consumer"/>
<!-- 订阅我们的生产者的 服务,并且 根据 接口的 url地址(ip+端口号,dubbo端口号默认为:20880),还有接口的名字 创建一个 代理类对象 -->
<!-- 这个代理类对象 扩展的 功能有 : 对象可以 通过 url地址 访问 到 位于 生产者模块中 对应的接口的实现类中的方法 ,属性id就是我们代理类对象的名字-->
<dubbo:reference interface="com.bjpowernode.service.CityService" id="service"/>
</beans>
消费者模块:主方法也就是我们测试方法中的内容:
package com.bjpowernode.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bjpowernode.service.CityService;
public class RunMain {
public static void main(String[] args) {
//下面就是 我所说的 第二种 加载 配置文件 的 最专业 最好用的 方法 。
String configLocation = "Dubbo-Consumer.xml" ;
ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocation);
CityService service = (CityService) ctx.getBean("service");
System.out.println(service.getCityName("1001"));
}
}
然后 的 步骤就是 :
第一步: 启动我们的 dubbo,启动的软件为:
这个必须启动完成了 我们 才能进行第二个操作。
第二步: 将我们的 生产者 放到我们的 tomcat服务器中运行,我们tomcat加载和运行我们的生产者模块的时候 会 加载 我们的 生产者 的 dubbo配置文件 。
第三步: 从我们消费者 的 test测试方法中 运行普通java项目。
什么是 监控器 ????
(1)监控器 是用来 监控我们的 生产者 消费者 还有 我们的 注册中心 执行的 状态的,我们的生产者 和消费者的状态全可以通过我们的监控器 看到,而且 也 可以 通过我们的 监控器 对 消费者 生产者 等等 进行 调节 控制 。
(2)我们的监视器 本身就是 war 包,里面是别人写好的 web项目 ,里面 有很多的功能。
(3)****我们如何使用呢?
我们 可以 将 这个 war 包 放进 我们的 tomcat的 项目空间,也就是webapp目录下,然后启动我们的 tomcat,然后去浏览器中输入网址,我们的 监控器 默认 网站名为 war包名,然后账号密码 是: root root 。登录之后就可以看到 监控者的界面。