• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

smallores

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Dubbo

1.分布式系统

分布式系统是若干独立计算机的集合,这计算机对用户来说就像单个相关系统。

发展历程

单一应用架构

扩展不易(如果要修改应用中的某个功能,需要将应用重新打包,重新放在服务器上),协同开发不易(大家都修改,会乱),应用大小变大,给服务器带来压力

垂直应用架构

大应用拆成独立小应用(独一的数据库,业务都完整),放在服务器中,哪部分用户访问量大,可将此部分多添加几台服务器

分布式服务架构

 

 

 无法起到监控作用,为了实现服务器之间的合理调度,出现了----->>>>>.

流动计算架构

 

 

 维护服务之间的复杂关系,哪个访问量大,可以动态添加几台服务器,下一次服务进入,优先进入访问量少的服务器来处理请求,提高了服务的利用率。

RPC(远程过程调用)

 

 

 传出序列化,传入反序列化

2.Dubbo的出现

18年2月15日

阿里---》阿帕奇

特点

1.面向接口代理的高性能RPC调用

2.智能负载均衡(内置多种负载均衡策略,显著减少调用延迟,提高系统吞吐量)

3.服务自动注册与发现(支持多种注册中心,服务实例上下线感知)

4.高度可扩展能力(微内核+插件原理  ,几乎所有东西都可扩展)

5.运行期流量调度(通过配置不同路由规则,实现灰色发布--<选定一部分服务器使用新版本的服务,请求进入之后,一部分请求进入新服务,确定没问题后,逐渐将就服务像新服务进行过度,王者体验服与正式服>)

6.可视化服务治理与运维

 

 

 

 将服务提供者注册到注册中心

 

引入dubbo依赖与操作zookeeper的客户端curator

<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.12.0</version>
</dependency>

  

 

用 Spring 配置声明暴露服务

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-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="hello-world-app"  />
 
    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <dubbo:registry address="multicast://224.5.6.7:1234" />
 
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
 
    <!-- 声明需要暴露的服务接口  ref真正的实现-->
    <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService" />
 
    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl" />
</beans>
resources/spring/dubbo-provider.xml
修改其中的dubbo:registry,替换成真实的注册中心地址,推荐使用zookeeper,如:
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>

 

加载 Spring 配置

Provider.java:

import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class Provider {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"});
        context.start();
        System.in.read(); // 按任意键退出
    }
}

通过 Spring 配置引用远程服务

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-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="consumer-of-helloworld-app"  />
 
    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
    <dubbo:registry address="multicast://224.5.6.7:1234" />
 
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" />
</beans>

加载Spring配置,并调用远程服务

Consumer.java [3]:

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.apache.dubbo.demo.DemoService;
 
public class Consumer {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/consumer.xml"});
        context.start();
        DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理
        String hello = demoService.sayHello("world"); // 执行远程方法
        System.out.println( hello ); // 显示调用结果
    }
}

。。。

。。。。。。

。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。

 

Dubbo原理

框架设计

http://dubbo.apache.org/zh-cn/docs/dev/design.html

启动解析加载配置信息

DubboNamespaceHandler.class   中方法 init()注册标签解析器

 

service  reference 对应的为xxxBean

 

解析标签的目的是为了将标签中每个属性都解析出来放入对应的XXXConfig中

 

 

 

容器启动 标签解析器解析每一个标签放入xxxConfig / xxxBean 中

 

 

服务暴露

 

 

 ServerBean 在创建完对象之后调用

 

看看他们是不是解析过了 解析过了(不为空)给他保存在ServerBean中

 

 

 

 

 在IOC容器启动完之后回调

 

 doExport()

 

将实现类的URL等信息封装到invoker中

 

 

 

 

 

 

 

 

服务引用

http://dubbo.apache.org/zh-cn/docs/source_code_guide/refer-service.html

spring的工厂bean

 

 

init()

 

 

 

 

 

 根据注册中心地址得出注册中心的信息

 

 

 

 订阅服务

 

 

 

 

 

 

 

 

 

 

服务调用

http://dubbo.apache.org/zh-cn/docs/source_code_guide/service-invoking-process.html

 

 

posted on 2021-05-18 09:28  smallores  阅读(73)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3