Dubbo学习小记

时序分析-由D触发器结构来理解Tsu、Th FPGA逻辑单元内的D触发器(D-FF)是一种在时钟的上升沿(或下降沿)将输入信号的变化传送至输出的边沿触发器。 数字电子技术基础-闫石(第五版)边沿D触发器内部结构见下图: 而FPGA原理与结构(日)一书中,内部结构较之上图多了俩反相器: 由传输门和俩个反相器组成一个循环电路(锁存器),再由前后两级锁存器按主从结构链接而成。这里的传输门起开关作用,随着CLK的状态变化切换开关。只看输出的话,前级锁存器的值会随着时钟输入的变化井然有序地传入后级锁存器。为了防止时钟信号变化时输入信号发生冒险,从而使稳定. 阅读详情


前言

周一入职的新公司,到了公司第一件事自然是要熟悉新公司使用的各种技术,搭建本地的环境。

熟悉新公司技术的过程中,首先就是Maven,这个前面已经写过文章了,然后就是Dubbo----公司的服务都是通过Dubbo来治理的。其实之前我就对SOA、RPC等分布式服务的概念有所了解,Dubbo也多多少少知道一些,不过能亲身使用那是再好不过的了。

此文就对我的Dubbo学习做一个小的总结,基本我总结的这些内容对于入门应该是足够了。关于Dubbo的更详细信息,阿里有专门出手册,手册地址为http://dubbo.io/User+Guide-zh.htm,本文也只是对手册的重点进行一些提炼而已(看过就知道了,这篇手册实在是太庞大了),要进一步地了解Dubbo的朋友们还是应当去看Dubbo的官方手册。

 

Dubbo是什么

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其核心部分包括:

  • 远程通讯:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型、序列化、"请求-响应"模式的信息交换方案
  • 集群容错:提供基于借口方法的透明远程过程调用,包括多协议支持、软负载均衡、失败容错、地址路由、动态配置等集群支持
  • 自动发现:基于注册中心目录服务,使服务消费方能动态地查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器

 

Dubbo能做什么

Dubbo功能强大,总结下来,它大致可以做以下几件事:

  • 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需要简单配置,没有任何API侵入
  • 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本、减少多拿点
  • 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者

 

Dubbo架构图

这是最重要的,理解Dubbo的架构图是理解Dubbo的第一步,我从Dubbo官网手册上截了一下Dubbo架构图:

 

在接下来的讲解之前,说明一个概念:所谓SOA也好,分布式服务框架也好,不是服务消费者从中间件(一般都是Zookeeper)上去拿数据,而是服务消费者从中间件上拿到可用的服务生产者的集群地址,再从集群地址中选出一个进行直连。

接下来认识一下图中的结点:

  • Provider:暴露服务的服务提供方,或者直白点说就是服务生产者
  • Consumer:调用远程服务的服务消费方,也就是服务消费者
  • Registry:服务注册与发现的注册中心
  • Monitor:统计服务的调用次数和调用时间的监控中心
  • Container:服务(生产者)运行容器

图中已经有了调用步骤了,接着对步骤进行说明:

  • 0:服务容器负责启动、加载、运行服务提供者(生产者)
  • 1:服务提供者(生产者)在启动时,向注册中心注册自己提供的服务
  • 2:服务消费者在启动时,向注册中心订阅自己所需的服务
  • 3:注册中心返回服务提供者地址列表给消费者,如果有变更,注册中细腻将基于长连接推送变更数据给消费者
  • 4:服务消费者从服务生产者地址列表中,基于软负载均衡算法,选择一台提供者(生产者)进行调用,如果调用失败,再选另一台调用
  • 5:服务消费者和提供者(生产者),在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

 

Dubbo用法

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入(这句话的意思是应用程序不会、不需要手动调用Dubbo的任何类和任何接口),只需用Spring加载Dubbo的配置即可(意思是对Dubbo的使用只需要写Spring配置文件或注解),Dubbo基于Spring的Schema扩展进行加载。

如果不想使用Spring配置,而希望通过API的方式进行调用,可以自己看一下官方手册Dubbo API配置,但是,这种做法十分不推荐。

下面简单说明一下Dubbo的用法,首先要定义服务生产者的接口及其实现,那么定义一个接口(该接口需要单独打包,在生产者和消费者之间共享):

package com.xrq.dubbo.demo;

public interface DemoService
{
    String sayHello(String name);    
}

在服务生产者处实现接口(对服务消费者隐藏接口实现细节):

复制代码
package com.xrq.dubbo.demo.provider;

import com.xrq.dubbo.demo.DemoService;

public class DemoServiceImpl implements DemoService
{
    public String sayHello(String name)
    {
        return "Hello " + name;
    }
}
复制代码

写一个provider.xml,在服务生产者使用Spring暴露服务:

复制代码
<?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="hello-world-app"  />
 
    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <dubbo:registry address="multicast://224.5.6.7:1234" />
 
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
 
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.xrq.dubbo.demo.DemoService" ref="demoService" />
 
    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService" class="com.xrq.dubbo.demo.provider.DemoServiceImpl" />
 
</beans>
复制代码

在服务消费者处写一个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-of-helloworld-app"  />
 
    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
    <dubbo:registry address="multicast://224.5.6.7:1234" />
 
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
 
</beans>
复制代码

服务消费者处只要通过Spring拿到demoService,即可像使用本地接口一样使用DemoService这个接口里面的方法:

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

看到整个过程中:

1、没有任何Dubbo的代码,使用Dubbo的时候全部都是Spring配置,这就是前面提到的Dubbo对应用没有任何API侵入

2、不需要考虑底层线程模型、序列化、反序列化、url解析等问题,这些都是Dubbo底层做好的

 

Dubbo常用标签

首先说一个优先级的问题,在dubbo中比如timeout、retries、loadbalance等参数可以在多个标签内同时配置,它们之间的优先级,dubbo手册上是这么说的:

OK,下面罗列一些Dubbo常用的,也就是说每个项目的Dubbo的xml文件中基本都会出现的标签,并以表格形式列举标签中常见的可用属性。

1、<dubbo:service /> 用于服务生产者暴露服务配置

属    性类    型是否必填缺省值描    述
interfaceclass必填无服务接口全路径
refobject必填无服务对象实现引用
versionstring可选0.0.0服务版本,建议使用两位数字版本如1.0,通常在接口不兼容时版本号才需要升级
timeoutint可选1000远程服务调用超时时间(毫秒)
retriesint可选2远程服务调用重试次数,不包括第一次调用,不需要重试请设为0
connectionsint可选100每个生产者的最大连接数,短连接协议如rmi,表示限制连接数;长连接协议如dubbo表示建立的长连接个数
loadbalancestring可选random负载均衡策略,可选值为:random(随机)、roundrobin(轮询)、leastactive(最少活跃调用)
asyncboolean可选false是否缺省异步执行,不可靠的异步,只是忽略返回值,不阻塞执行线程
registerboolean可选true该协议的服务是否注册到注册中心

2、<dubbo:reference /> 用于服务消费者引用服务配置

属    性类    型是否必填缺省值描    述
idstring必填无服务引用beanId
interfaceclass必填无服务接口全路径
versionstring可选无服务版本,与服务生产者的版本一致
timeoutlong可选使用<dubbo:consumer>的timeout 服务方法调用超时时间(毫秒)
retriesint可选使用<dubbo:consumer>的retries远程服务调用重试次数,不包括第一次调用,不需要重试请设为0
connections int 可选 使用<dubbo:consumer>的connections 每个生产者的最大连接数,短连接协议如rmi,表示限制连接数;长连接协议如dubbo表示建立的长连接个数
loadbalance string 可选 使用<dubbo:consumer>的loadbalance 负载均衡策略,可选值为:random(随机)、roundrobin(轮询)、leastactive(最少活跃调用) 
 asyncboolean 可选 使用<dubbo:consumer>的async 是否缺省异步执行,不可靠的异步,只是忽略返回值,不阻塞执行线程 
checkboolean 可选使用<dubbo:consumer>的check 启动时检查服务生产者是否存在,true则报错,false则忽略 
 urlstring 可选 无 点对点直连服务提供者地址,将绕过注册中心,比如"dubbo://localhost:20890",这个比较多的使用在测试中 
protocol string 可选 无只调用指定协议的服务生产者,其他协议忽略 

3、<dubbo:protocol /> 用于服务生产者协议配置(如果需要支持多协议,可以声明多个此标签,并在<dubbo:service />通过protocol属性指定使用的协议)

属    性类    型是否必填缺省值描    述
idstring可选dubbo协议beanId,<dubbo service />中的protocol引用此ID,如果不填缺省和name属性值一样
namesring必填dubbo协议名称
portint可选

dubbo->20800,rmi->1099,http->80,hessian->80

如果配置为-1或未配置,则会分配一个没有被占用的端口

服务端口
hoststring可选自动查找本机ip

为空则自动查找本机ip,建议不配置让Dubbo自动获取本机ip

threadpoolstring可选fixed线程池类型,可选fixed/cached
threadsint可选100服务线程池大小(固定大小)
serializationstring可选dubbo->hession2,rmi->java,http->json协议序列化方式,当协议支持多种序列化方式时使用
registerboolean可选true该协议的服务是否注册到注册中心

4、<dubbo:registry /> 用于注册中心配置(如果有多个不同的注册中心可以声明多个标签并且<dubbo:service />或<dubbo:reference />中使用registry属性指定)

属    性类    型是否必填缺省值描    述
idstring可选无注册中心引用beanId,可在<dubbo:service />或<dubbo:reference />中引用此ID
addressstring必填无

注册中心服务地址,如果地址没有端口缺省为9090,同一个集群内的多个地址用逗号分隔,如:ip:port,ip:port,不同的

集群注册中心请配置多个<dubbo:registry />标签

 protocolstring  可选 dubbo 注册中心地址协议,支持dubbo、http、local三种协议,分别表示dubbo地址、http地址和本地注册中心 
portint可选9090注册中心缺省端口,当address没有带端口时使用此端口作为缺省值 
usernamestring可选无登陆注册中心用户名,如果注册中心不需要验证可不填
passwordstring可选无登陆注册中心密码,如果注册中心不需要验证可不填 
transportstring可选netty网络传输方式,可选mina、netty
timeoutint可选5000注册中心请求超时时间(毫秒)
filestring可选无使用文件缓存注册中心地址列表以及服务提供者列表,应用重启时将基于此文件恢复,注意两个注册中心不能使用同一文件存储
checkboolean可选true注册中心不存在时,是否报错
registerboolean可选true是否向此注册中心注册服务,如果设为false,将只订阅,不注册
subscribeboolean可选true是否向此注册中心订阅服务,如果设为false,将只注册,不订阅

5、<dubbo:method />用于方法级配置(该标签为<dubbo:service/>或<dubbo:reference/>的子标签,用于控制到方法级)

属    性类    型是否必填缺省值描    述
methodstring必填无方法名
timeoutint可选缺省为<dubbo:reference/>的timeout方法调用超时时间(毫秒)
retiresint可选缺省为<dubbo:reference/>的retries远程服务调用重试次数,不包括第一次调用,不需要重试请设为0
loadbalancestring可选缺省为<dubbo:reference/>的loadbalance负载均衡策略,可选值为:random(随机)、roundrobin(轮询)、leastactive(最少活跃调用) 
asyncboolean可选缺省为<dubbo:reference/>的async是否异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程
activesint可选0每服务消费者最大并发调用限制
 executesint 可选0每服务每方法最大使用线程数限制,此属性只在<dubbo:method/>作为<dubbo:service/>子标签时有效

另外,还有<dubbo:provider/>和<dubbo:consumer/>分别表示服务提供者(生产者)和服务消费者的缺省值配置,就不列举了。

 

Dubbo协议dubbo://

前面有说到一个Dubbo协议,下面来看一下Dubbo协议。

Dubbo协议Dubbo的缺省协议,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。

  • 连接个数:单连接
  • 连接方式:长连接
  • 传输协议:TCP
  • 传输方式:NIO异步传输
  • 序列化:Hessian二进制序列化
  • 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要使用dubbo协议传输大文件或超大字符串
  • 使用场景:常规远程服务方法调用

从上面的适用范围总结,dubbo适合小数据量大并发的服务调用,以及消费者机器远大于生产者机器数的情况,不适合传输大数据量的服务比如文件、视频等,除非请求量很低。

另外,Dubbo手册还给开发者列出了Dubbo协议使用的约束:

  1. 参数及返回值需要实现Serializable接口
  2. 参数及返回值自定义实现List、Map、Number、Date、Calendar等接口,只能用JDK自带的实现,因为hessian会做特殊处理,自定义实现类中的属性值都会丢失
使用ESP32设计嵌入式蓝牙游戏手柄 通过使用ESP32开发板和相关的库,我们可以设计和实现嵌入式蓝牙游戏手柄。连接到该设备后,您可以使用控制器模块的按钮和摇杆等元件来模拟游戏手柄的输入。根据您使用的具体模块和引脚分配,连接按钮和摇杆等控制元件到ESP32的GPIO引脚。ESP32是一款功能强大的微控制器,集成了Wi-Fi和蓝牙功能,非常适合用于开发物联网和嵌入式应用。请注意,本文仅提供了一个基于ESP32的嵌入式蓝牙游戏手柄设计示例,具体实现可能因硬件和需求而有所不同。确保开发板正确连接到计算机,并选择正确的开发板和端口。 阅读详情

相关推荐

Unity 游戏实例开发集合 之 Car Racing 2D (2D赛车) 休闲小游戏快速实现

Unity 游戏实例开发集合 之 Car Racing 2D (2D赛车) 休闲小游戏快速实现 目录 Unity 游戏实例开发集合 之 Car Racing 2D (2D赛车) 休闲小游戏快速实现 一、简单介绍 二、Car Racing 2D (2D赛车) 游戏内容与操作 三、相关说明 四、游戏代码框架 五、知识点 六、游戏效果预览 七、实现步骤 八、工程源码地址 九、延伸扩展 一、简单介绍 Unity 游戏实例开发集合,使用简单易懂的方式,讲解常见游戏的开发实现过程,方便

仙魁XAN 7701

Dubbo配置详解

基本配置 服务端 <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="storeServer"/> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181"/...

zgsxhdzxl的博客 3823

在Cursor中集成Ollama与Qwen2.5‑Coder:零成本本地AI开发环境搭建

本文详细介绍了如何零成本搭建本地AI开发环境,通过将Cursor IDE与本地运行的Ollama及Qwen2.5-Coder模型集成,实现数据不出本地的智能编程辅助。教程涵盖Ollama安装、模型拉取、ngrok内网穿透配置及Cursor设置等核心步骤,并提供了实战测试与常见问题排错指南,为注重隐私与成本的开发者提供安全高效的解决方案。

weixin_29296241的博客 1071

Dubbo入门(三)Consumer的编写

前言 本章讲解dubbo中另外一个重要角色Consumer的编写 方法 1.概念 既然我们在上个章节创建了dubbo的服务提供者provider,那么必然是要有消费者进行消费的。 本章将根据dubbo流程图进一步探寻。 consumer可以是java工程也可以是web工程,本次使用java工程进行讲解。 2.编写步骤 1)新建maven的jar工程 2)编写...

jwang的博客 2129

FPGA DMA IP核使用指南

数据传输:支持从源地址到目标地址的数据传输。中断管理:提供中断信号,便于CPU处理传输完成事件。传输控制:支持传输大小、方向和暂停/恢复控制。

weixin_66634995的博客 2428

紫光同创FPGA中ADF网表文件的黑匣子封装与PDS环境实战指南

本文详细介绍了在紫光同创FPGA开发环境中使用ADF网表文件进行黑匣子封装的实战指南。通过PDS环境配置、加密ADF生成、黑匣子集成及验证调试等步骤,帮助开发者实现核心IP保护,同时保持设计性能。特别适用于需要模块级代码保护的企业级FPGA开发场景。

weixin_33725239的博客 341

dubbo学习(一)dubbo简介与原理

一、Dubbo背景和简介 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。 缺点:单一的系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护 垂直应用框架(MVC) 垂直应用架构解决了单一应用架构所面临的扩容问题,流量能够分散到各个子系统当中,且系统的体积可控,一定程度上降低了开发人员之间协同以及维护的成本,提升了开发效率。 缺点:但是在垂直架构中相同逻辑代码需要不断的复制,不能复用。 分布式应用架

m0_67391521的博客 828

LSTM模型 轨迹经纬度预测

原始时间序列数据如下所示,我们只取前两列纬度和经度作为输入数据 我们设定用前六个位置信息预测下一个位置,则两个样本的输入输出数据如下所示: 创建LSTM网络训练模型: import numpy as np from keras.layers.core import Dense, Activation, Dropout from keras.layers import LS...

Muzi_Water的博客 2万+

Dubbo 入门学习

Dubbo 入门学习1. 概述2. XML 配置 1. 概述 Apache Dubbo:一款高性能、轻量级的开源服务框架。提供了六大核心能力: 面向接口代理的高性能 RPC 调用(提供高性能的基于代理的远程调用能力,服务以接口为粒度,以开发者屏蔽远程调用底层细节); 智能容错和负载均衡(内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量); 服务自动注册和发现(支持多种注册中心服务,服务实例上下线实时感知); 高度可扩展能力(遵循微内核 + 插件的设计原则,所有核心能力如 P

凄戚的博客 3327

手把手教你学Simulink——高频隔离型双向DC-AC逆变器的建模与仿真

本文系统讲解高频隔离型双向DC-AC逆变器的Simulink建模与仿真,基于DAB+全桥逆变两级拓扑,详述DAB移相控制原理、双闭环控制策略及分步仿真搭建流程。重点涵盖电路建模、控制环设计、参数设置与常见问题调试,强调模块化分步验证与分层控制逻辑,实现安全、高效、灵活的双向能量流动仿真,适用于储能、微电网等场景的系统开发与验证。

MHD0815的博客 107

一个 ABAP 工具,能打印系统里某个用户对 BSP 应用的浏览历史记录

只要一个用户在 SAP ABAP 系统里浏览过 BSP 页面,会留下浏览历史记录。本工具会解析出这些记录,打印出该用户浏览的历史事件,和浏览过的页面名称。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 546

dubbo学习小记

前言 周一入职的新公司,到了公司第一件事自然是要熟悉新公司使用的各种技术,搭建本地的环境。 熟悉新公司技术的过程中,首先就是Maven,这个前面已经写过文章了,然后就是Dubbo----公司的服务都是通过Dubbo来治理的。其实之前我就对SOA、RPC等分布式服务的概念有所了解,Dubbo也多多少少知道一些,不过能亲身使用那是再好不过的了。 此文就对我的Dubbo学习做一个小的总结,基本我总

zhangyuan19880606的专栏 581

【NI Multisim 14.0原理图设计基础——元器件分类】

电阻(RESISTOR):该元器件栏中的电阻都是标称电阻,是根据真实电阻元器件而设计的,其电阻值不能改变。 排阻(RESISTOR PACK):相当于多个电阻并列封装在一个壳内,它们具有相同的阻值。 电位器(POTENTIOMETER):即可调电阻,可以通过键盘字母动态调节电阻,大写表示增加电阻值,小写表示减小电阻值,调节增量可以设置。 电容(CAPACITOR):所有电容都是无极性的,不能改变参数,没有考虑误差,也未考虑耐压大小。 电解电容器(CAP_ELECTROLIT):所有电容都是有极性的,“+”极

RL2698853114的博客 4万+

Dubbo+Zookeeper学习小记

具体的Dubbo+Zookeeper包下载,怎样启动,https://my.oschina.net/xshuai/blog/891281这位博主的博文已经写的很详细,不在赘述; 这第一篇文章主要记录一下,在我整理学习过程中的问题。 一、这里其实我想先放一下dubbo架构图 Provider:服务提供方Consumer:服务消费者Registry:注册中心Monitor:统计...

weixin_30298497的博客 125

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

学习小记 -- Dubbo服务调用过程

服务端流程: Netty收到请求,根据协议得到信息并且反序列化成对象。 按照派发策略派发消息,默认是 All,封装成一个ChannleEventRunnable扔给业务线程池。 业务线程会根据消息类型,调用不同的处理类。 通过请求的id构造出一个响应。 通过一系列参数构造得到 serviceKey ,从之前服务暴露生成的 exporterMap 中得到对应的 Invoker ,然后调用真实的实现类。 返回响应。 客户端流程; 调用接口方法,实际上调用的是代理类。 通过路由和负载均衡得到in.

weixin_42029860的博客 361

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

学习小记--Dubbo基础浅析(服务暴露、服务引入)

Dubbo基础浅析 是一款高性能的Java RPC框架 --远程过程调用 其中Dubbo支持的协议有:dubbo、rmi、hessian、http、webservice、rest、redis等。 推荐使用的是dubbo协议. 层级 第一层:service层,接口层,给服务提供者和消费者来实现的 第二层:config层,配置层,主要是对dubbo进行各种配置的,ServiceConfig 和 ReferenceConfig。 第三层:proxy层,服务代理层,透明生成客户端的stub和服务单

weixin_42029860的博客 408

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

学习小记 -- Dubbo服务路由、负载均衡、集群容错

这里参考某博主举的一个很好的例子: 有一个Dubbo的用户服务,在北京部署了10个,在上海部署了20个。一个杭州的服务消费方发起了一次调用,然后发生了以下的事情: 根据配置的路由规则,如果杭州发起的调用,会路由到比较近的上海的20个 Provider。(服务路由) 根据配置的随机负载均衡策略,在20个 Provider 中随机选择了一个来调用,假设随机到了第7个 Provider。(负载均衡) 结果调用第7个 Provider 失败了。 根据配置的Failover集群容错模式,

weixin_42029860的博客 304

【Dubbo】Dubbo使用小记

上文我们搭建好了服务器上的zookeeper服务,暴露在<公网ip>:2182下。接下来就可以使用zookeeper作为注册中心进行rpc调用了。 这里主要记录一下使用注解的方式配置。还有xml和Api的方式,这篇文章https://segmentfault.com/a/1190000019896723讲的很详细,可以作为参考。 和SofaRpc一样,服务提供者和服务消费者都需要保证接口的包名完全一致,如果接口返回对象,也需要实现java.io.Serializable,而且尽可能保证包名类.

Vaskka的博客 540

dubbo管理控制台找不到服务 解决小记

今天重新配置了下dubbo,结果发现管理控制台上没有显示可用的服务,由于前阵子刚配置的时候是没有问题的,于是开始逐步排查。 项目注册中心用的zookeeper集群,provider是采用jar包方式启动的,consumer在tomcat容器内运行,并且consumer已经可以消费到provider提供的服务了,说明注册中心已经里面已经有服务注册。通过zookeeper客户端连接到zk服务器上,也

指尖下的艺术 2万+

dubbo——小记

官网 dubbo.io 国产的优秀开源框架(阿里巴巴团队开发) 2012停止维护更新,2017.9恢复维护更新 注入京东、当当都在使用 最大程度进行解耦,降低系统耦合性,使得程序员最大限度关注自己的业务单元 基于生产者/消费者模式,使用dubbo需要使用zookeeper来支持 zk注册中心,admin监控中心,协议支持   单体到分层模式代码演示 考虑一下maven聚合项目 ...

GavinZhera的博客 209
上一篇: 集群监控
下一篇: 对一致性Hash算法,Java代码实现的深入研究
xinjing_wangtao
博客等级 码龄14年 232粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值