zoukankan      html  css  js  c++  java
  • Dubbo解析之与Spring集成

    Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

    特性

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

        提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。

    • 智能负载均衡

        内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。

    • 服务自动注册与发现

        支持多种注册中心服务,服务实例上下线实时感知。

    • 高度可扩展能力

        遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。

    • 运行期流量调度

        内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。

    • 可视化的服务治理与运维

        提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

    节点角色

    角色
    说明
    Provider
    暴露服务的服务提供方
    Consumer
    调用远程服务的服务消费方
    Registry
    服务注册与发现的注册中心
    Monitor
    统计服务的调用次数和调用时间的监控中心
    Container
    服务运行容器
     
    再来看一张官网提供的架构图:
     
    0
     

    与Spring集成

    Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于Spring 的 Schema 扩展 进行加载。只需引入Maven坐标。Dubbo里面已经包含了Spring、Zookeeper、Netty等。
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.6.2</version>
    </dependency>
    
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.10</version>
    </dependency>
    首先,我们要定义接口和实现类,在这里我们还是搞一个操作用户信息的接口。

    1、接口

    package com.viewscenes.netsupervisor.service;
    import java.util.List;
    import com.viewscenes.netsupervisor.entity.InfoUser;
    
    public interface InfoUserService {
        
        void insertInfoUser(InfoUser user);
        InfoUser getUserById(String id);    
        void deleteUserById(String id);
        List<InfoUser> getAllUser();
    }
    package com.viewscenes.netsupervisor.service.impl;
    
    public class InfoUserServiceImpl implements InfoUserService{
    
        private Logger logger = LoggerFactory.getLogger(this.getClass());
        
        private Map<String,InfoUser> userMap = new HashMap<String, InfoUser>();
        
        public void insertInfoUser(InfoUser user) {
            logger.info("新增用户信息...{}",JSONObject.toJSONString(user));
            userMap.put(user.getId(), user);
        }
        public List<InfoUser> getAllUser(){
            List<InfoUser> infoUserList = new ArrayList<InfoUser>();
            for(Map.Entry<String, InfoUser> entry:userMap.entrySet()) {
                infoUserList.add(entry.getValue());
            }
            System.out.println("获取全部用户数据:"+infoUserList.size());
            return infoUserList;
        }
    } 

    2、Provider

    先来看一下生产者端的配置文件。
    <?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="dubbo_producer1"/>   
        <!-- 使用zookeeper注册中心暴露服务地址 -->
        <dubbo:registry address="zookeeper://192.168.139.129:2181?client=zkclient"/>    
        <!-- 用dubbo协议在20880端口暴露服务 -->
        <dubbo:protocol name="dubbo" port="20880"/>     
        <!-- Spring的Bean -->
        <bean id="infoUserService" class="com.viewscenes.netsupervisor.service.impl.InfoUserServiceImpl" />     
        <!-- 服务配置,暴露一个接口服务  -->
        <dubbo:service interface="com.viewscenes.netsupervisor.service.InfoUserService" ref="infoUserService" /> 
    </beans> 

    3、Consumer

    <?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="dubbo_consumer"/>
        <!-- 用于配置连接注册中心相关信息 -->
        <dubbo:registry protocol="zookeeper" address="192.168.139.129:2181" client="zkclient" />
        <!-- 引用配置   用于创建一个远程接口服务代理 -->
        <dubbo:reference id="infoUserService" check="false" interface="com.viewscenes.netsupervisor.service.InfoUserService"/>
    </beans> 

    4、启动

    配置好之后,我们就可以在Spring项目中分别启动生产者端和消费者端。当然,先要把zookeeper服务器启动。
    public class Provider1 {
        public static void main(String[] args) throws IOException {
            ClassPathXmlApplicationContext applicationContext = new
                ClassPathXmlApplicationContext(new String[]{"classpath:dubbo_provider1.xml"});      
            applicationContext.start();
            System.in.read();
        }
    }
    然后,通过消费者端来创建一个用户,并不断的请求用户查询方法。
    public class Consumer1 {    
        @SuppressWarnings("resource")
        public static void main(String[] args) {
            
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext
                    (new String[]{"classpath:dubbo_consumer1.xml"});
            context.start();
            
            InfoUserService userService = (InfoUserService) context.getBean("infoUserService");
            
            InfoUser infoUser = new InfoUser();
            infoUser.setId(UUID.randomUUID().toString());
            infoUser.setName("Jack");
            infoUser.setAddress("BeiJing");
            userService.insertInfoUser(infoUser);
            
            while(true) {
                List<InfoUser> userList = userService.getAllUser();
                System.out.println("查询用户信息返回数据:"+JSONObject.toJSONString(userList));
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    } 
    通过上面的代码,消费者端就可以源源不断的从生产者端获取数据。
  • 相关阅读:
    【批处理】for命令
    【批处理】if命令,注释方式
    【批处理】choice命令,call 命令,start 命令,rem
    LoadLibrary加载动态库失败
    编译器如何实现静态变量只初始化一次
    汇编语言中 cs, ds,ss 的区别
    变量在内存中的位置
    call和ret指令
    函数调用
    浮动
  • 原文地址:https://www.cnblogs.com/johnvwan/p/15649897.html
Copyright © 2011-2022 走看看