一、网站演变过程
什么时候使用到Dubbo框架?
答:只有在RPC远程调用的时候才会使用到dubbo框架。
网站架构演变过程:
单点项目/单点系统架构:MVC这种模式
单点系统中,缺点:如果有几百个程序员开发同一个项目,
会产生代码冲突的问题。适合小团队开发。
互联网公司的特征:人比较多、高并发、高可用、开发人员比较多。
敏捷开发:就是把项目拆分很细。
分布式开发:将一个项目,拆分成多个子项目,如:会员系统、订单系统、
支付系统。使用的是RPC远程调用技术、项目之间互不影响。
分布式开发:
SOA面向服务的架构:主要以http+xml报文格式来传输。
将项目拆分成多个子的服务。使用Webservice
SOA架构:要把业务逻辑层封装起来。控制层剥离开来。
面向服务SOA架构就是将床头项目业务逻辑层分装成
服务接口,暴露其他给其他服务进行调用。
微服务架构:是通过SOA架构演变过来的。
二、分布式开发需要使用的技术SOA&微服务
分布式领域中使用RPC需要使用的技术:
httpclient、Dubbo(阿里)、Dubbox、Zookeeper(注册中心)、SpringCloud、
eureka注册中心(fegin、rest客户端调用工具、zuul、分布式配置中心、
ribbin、断路器hystrix)、redis、mongdb、消息中间件、
之后分布式开发领域中:生产者、消费者、注册中心、监控中心、容器。
SpringBoot:简化XML配置、快速整合第三方框架开发、内置tomcat容器。
三、微服务架构
SpringCloud http协议+json格式来进行传输
或者使用Dubbox
四、Dubbo架构原理
1、dubbo是rpc远程调用、服务治理、分布式服务框架,
dubbo实现的SOA面向服务架构的框架。满足分布式开发需求。
在分布式中主要做远程调用,功能有集群容错机制、负载均衡
动态配置、路由策略、服务治理。
2、里面底层实现是 长连接+NIO框架。
3、dubbo里面原理图:
生产者:提供接口
消费者:调用接口
注册中心:负载均衡、容错机制、路由策略、服务治理
监控中心:
容器:
五、dubbo能够解决的问题
SpringCloud中的功能:
enruka:注册中心
ribbion:负载均衡
fegin/rest:客户端调用工具
config:分布式文件配置中心
zuul:网关
hystrix:熔断器
dubbo能够解决什么问题?
问题:rpc远程调用、服务的URI地址、负载均衡(f5,lvs,nginx)、
依赖关系非常复杂,
每个服务还需要监控。
Dubbo有的功能:
API透明化,就相当于控制层带哦用业务逻辑层
负载均衡机制可以替代F5、nginx、lvs、容错机制
服务注册与发现,主要提供API地址
dubbo采用的是Spring机制
六、Dubbo创建项目架构模式
会员服务提供查询用户接口信息,暴露给订单系统,调用会员服务接口查询用户信息
Dubbo项目结构误区
leeue-member-interface 会员提供服务项目 没有具体实现
leeue-member-service-impl --生产者 实现会员服务项目具体实现
leeue-order-service --- 订单服务
七、使用Dubbo发布服务 这里以会员服务案例
首先:会员服务是向外面提供接口的,这里我们默认会员为生产者。
所以要先建立会员接口项目,再简历会员接口实现项目。
会员接口项目 代码 因为向外面提供接口服务的,只需要定义接口就行了。
package com.leeue.member.service;
/**
* @classDesc: 功能描述:(会员服务提供接口的)
* @author:<a href="leeue@foxmail.com">李月</a>
* @Version:v1.0
* @createTime:2018年12月5日 下午3:31:20
*/
public interface UserService {
/**
* 使用用户的userId查询用户信息
* @param id
* @return
*/
public String getUser(Long id);
}
会员接口实现项目:pom.xml要引入上面的接口项目的坐标。
pom.xml
<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.leeue</groupId>
<artifactId>45_Dubbo_leeue_member_provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!--引入会员服务接口 -->
<dependency>
<groupId>com.leeue</groupId>
<artifactId>45_Dubbo_member_interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 添加dubbo框架 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.6</version>
</dependency>
<!-- 添加zk客户端依赖 -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
</project>
实现:
package com.leeue.member.service.impl;
import com.leeue.member.service.UserService;
/**
*
* @classDesc: 功能描述:(对会员项目的实现)
* @author:<a href="leeue@foxmail.com">李月</a>
* @Version:v1.0
* @createTime:2018年12月5日 下午3:59:36
*/
public class UserServiceImpl implements UserService {
public String getUser(Long id) {
System.out.println("会员服务 接受订单服务####getUser() id:"+id);
if (id == 1) {
return "嘻嘻我是id_1";
}
if (id == 2) {
return "哈哈我是id_2";
}
return "未找到....";
}
}
另外:在会员服务接口实现这个项目中要加入provider.xml
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的时候使用的是什么名称-->
<dubbo:application name="provider" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 用dubbo协议在29014端口暴露服务 -->
<dubbo:protocol name="dubbo" port="29014" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.leeue.member.service.UserService"
ref="userService" />
<!-- 具体的实现bean -->
<bean id="userService" class="com.leeue.member.service.impl.UserServiceImpl" />
</beans>
八、消费服务使用Dubbo消费服务
这里是订单服务来调用会员服务:
pom.xml文件
<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.leeue</groupId>
<artifactId>45_Dubbo_order_consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!--引入会员服务接口 -->
<dependency>
<groupId>com.leeue</groupId>
<artifactId>45_Dubbo_member_interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 添加dubbo框架 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.6</version>
</dependency>
<!-- 添加zk客户端依赖 -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
</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://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="consumer" />
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry protocol="zookeeper" address="zookeeper://127.0.0.1:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService rpc远程调用-->
<dubbo:reference id="userService" interface="com.leeue.member.service.UserService" />
</beans>