Dubbo学习

一. 项目的演变

由于互联网的发展,用户群体的逐渐壮大,网站流量的成倍增长,常规的单体架构无法满足请求压力的暴增,业务的快速迭代, 架构的演变是必须的。

单体架构

所有模块和功能都集中在一个项目中 ,部署时也是将项目所有功能部整体署到服务器中。
优点:小项目开发块,成本低,架构简单,易于测试部署
缺点: 大项目模块耦合性高,新增业务麻烦,核心业务与边缘业务混合

垂直架构

根据业务把项目垂直拆分多个项目,互不影响
优点:
系统拆分实现了流量分担,解决了并发问题
可以对不同系统进行优化
方便水平拓展,负载均衡,容错高
系统间相互独立,互不影响,新的业务迭代更高效
缺点:
服务系统之间接口调用硬编码
搭建集群之后,实现负载均衡比较复杂
服务系统接口调用监控不到位 调用方式不统一
数据库资源浪费,充斥慢查询,主从同步延迟大

分布式SOA架构

 即面向服务的架构,在垂直划分的基础上,各个服务通过网络调用,以一种统一的方式进行交互。
为了解决垂直划分后,模块的增多,系统间RPC逐渐增多,维护成本增高,以及上诉的接口协议不统一,服务无法监控,服务的负载均衡更加突出。
即解决方案: 我们将业务逻辑下沉到服务层, 通过 接口暴露,供其他业务场景使用。 引入Dubbo框架, 提供了三大核心功能:
面向接口的远程方法调用;智能容错和负载均衡;服务自动注册和发现
我们可以把系统分为:应用层,业务服务层,基础业务层,基础服务层,存储层
应用层: 对外的接入层,接收用户请求,使用下游的dubbo提供的接口返回数据,禁止DB
业务服务层: 根据统一的基础业务层演变而来的一些模块
基础业务层: 提供统一的基础业务服务
基础服务层: 提供与业务无关, 是一些通用的服务
存储层:          不同的存储类型 Mysql Mongodb ES
分级: 同一层的业务也要做好分级,采用二八定律, 网站80%的流量存在与核心功能上,优先保证稳定性。
隔离: 不同性质 不同重要性的业务做好隔离 包括 业务 缓存 DB 中间件 都要做好隔离 比如 核 心业务的数据库 要和活动相关的数据库隔离
调用 : 总体上调用要单向 可以跨层调用 但不能出现逆向调用
优点: 
分布式、松耦合、扩展灵活、可重⽤。
服务以接口为粒度,使用dubbo面向接口远程调用为开发者屏蔽远程调用底层细节
业务分层以后架构更加清晰 并且每个业务模块职责单一 扩展性更强
数据隔离,权限回收,数据访问都通过接口 让系统更加稳定 安全
服务责任易确定 每个服务可以确定责任人 这样更容易保证服务质量和稳定
缺点
服务抽取粒度较⼤、服务调⽤⽅和提供⽅耦合度较⾼(接⼝耦合度)
粒度控制复杂 如果没有控制好服务的粒度 服务的模块就会越来越多 就会引发 超时 分布式事务等问题
服务接口数量不宜控制 容易引发接口爆炸 所以服务接口建议以业务场景进行单位划分 并对相近的业务做抽象 防止接口爆炸
版本升级兼容困难 尽量不要删除方法 字段 枚举类型的新增字段也可能不兼容
调用链路长 服务质量不可监控 调用链路变长 下游抖动可能会影响到上游业务 最终形成连锁反应 服务质量不稳定 同时链路的变成使得服务质量的监控变得困难

微服务架构

微服务架构可以说是SOA架构的拓展, 这种架构模式下,划分粒度更小,服务更加独立。 把应用拆分成一个个的微小的服务, 不同的服务还可以使用不同的语言,采用Restful等轻量级通信。
微服务架构的关键: 微小,独立, 轻量级通信
微服务是在SOA上做的升华粒度更加细致,微服务强调的一个重点【业务需要彻底被组件化和服务化】

Dubbo的处理流程

节点划分: Provider, Consumer, Registry, Monitor, Container
1. Provider提供服务, 向注册中心,注册服务
2. Consumer消费服务, 向注册中心订阅
3. Registry注册中心,会提供服务列表给Consumer, 如果服务发生变化,利用长连接推送变更通知给Consumer
4. Consumer基于负载均衡选择一台提供者进行调用, 失败从试
5. Provider和Consumer在内存中的调用次数和调用时机, 定时发送给Moniter

实战注意事项:

1. 所以服务通过Maven创建, 利用父工程通用管理依赖version
2. 双方协调好暴露接口,提供者提供实现类注册到注册中心
3. Consumer需要引入改暴露接口,即可以通过注册中心来实现集群感知功能。
// 1. 创建父工程: base-dubbo,管理依赖
// 2. 部署注册中心zookeeper环境
// 3. 创建service-api工程 service-provider工程  service-Consumer工程


// service-api  ===>  com.ly.service

public interface HelloService {

    public String sayHello(String name) ;

}

// service-provider  ===>  com.ly.service.impl
// 集成Spring,xml文件单独写
public class HelloServiceImpl implements HelloService {

    @Override
    public String sayHellow(String name) {
        return name;
    }
}

// service-Consumer 调用
public class XMLConsumerMain {

    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("dubbo-consumer.xml");
        context.start();
        System.in.read() ;
        HelloService demoService = context.getBean(HelloService.class);
        System.out.println(demoService.sayHellow("world"));
    }

}

service-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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
	http://dubbo.apache.org/schema/dubbo
	http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
        
    <dubbo:application name="service-provider"/>

    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

    <dubbo:protocol name="dubbo" port="20882"/>

    <bean id="helloService" class="com.ly.service.impl.HelloServiceImpl"/>
    <dubbo:service interface="com.leiyu.service.HelloService" ref="helloService"></dubbo:service>
    

</beans>

service-consumer.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
	http://dubbo.apache.org/schema/dubbo
	http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <dubbo:application name="demo-consumer"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <dubbo:reference id="helloService" interface="com.leiyu.service.HelloService">
    </dubbo:reference>

</beans>

Dubbo管理控制台

主要包含:服务管理 、 路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能
1.从git 上下载项目 https://github.com/apache/dubbo-admin 
2.修改项目下的dubbo.properties文件 注意dubbo.registry.address对应的值需要对应当前使用的Zookeeper的ip地址和端口号 
• dubbo.registry.address=zookeeper://zk所在机器ip:zk端口 
• dubbo.admin.root.password=root 
• dubbo.admin.guest.password=guest 
3.切换到项目所在的路径 使用mvn 打包 mvn clean package -Dmaven.test.skip=true 
4.java 命令运行 java -jar 对应的jar包

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值