Dubbo

Dubbo解析(三)-动态代理与包装

牧云@^-^@ 提交于 2019-12-25 19:41:05
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Dubbo作为RPC框架,首先要完成的就是跨系统,跨网络的服务调用。消费方与提供方遵循统一的接口定义,消费方调用接口时,Dubbo将其转换成统一格式的数据结构,通过网络传输,提供方根据规则找到接口实现,通过反射完成调用。也就是说,消费方获取的是对远程服务的一个代理(Proxy),而提供方因为要支持不同的接口实现,需要一个包装层(Wrapper)。调用的过程大概是这样: 消费方的Proxy和提供方的Wrapper得以让Dubbo构建出复杂、统一的体系。而这种动态代理与包装也是通过基于SPI的插件方式实现的,它的接口就是 ProxyFactory 。 1. ProxyFactory接口定义 @SPI("javassist") public interface ProxyFactory { @Adaptive({Constants.PROXY_KEY}) <T> T getProxy(Invoker<T> invoker) throws RpcException; @Adaptive({Constants.PROXY_KEY}) <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) throws RpcException; }

ProxyFactory$Adaptive

笑着哭i 提交于 2019-12-25 19:11:37
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> package com.alibaba.dubbo.rpc; import com.alibaba.dubbo.common.Node; import com.alibaba.dubbo.common.URL; import com.alibaba.dubbo.common.extension.ExtensionLoader; public class ProxyFactory$Adaptive implements ProxyFactory { public Object getProxy(Invoker paramInvoker) throws RpcException { if (paramInvoker == null) { throw new IllegalArgumentException("com.alibaba.dubbo.rpc.Invoker argument == null"); } if (paramInvoker.getUrl() == null) { throw new IllegalArgumentException("com.alibaba.dubbo.rpc.Invoker argument getUrl() == null"); } URL localURL =

服务暴露流程

荒凉一梦 提交于 2019-12-25 18:31:39
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> com.alibaba.dubbo.config.spring.ServiceBean.export() com.alibaba.dubbo.config.ServiceConfig.doExport() com.alibaba.dubbo.config.ServiceConfig.doExportUrls() com.alibaba.dubbo.config.ServiceConfig.doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) Protocol&Adaptive.export(Invoker<T> invoker) com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper.export(Invoker<T> invoker) com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper.export(Invoker<T> invoker) com.alibaba.dubbo.qos.protocol.QosProtocolWrapper.export(Invoker<T> invoker) com

Dubbo服务降级实践【SpringBoot2.x与Dubbo2.6.x+Zookeeper集群整合】

懵懂的女人 提交于 2019-12-25 00:42:26
一图告知分布式架构Dubbo原理 /** * 服务提供者: * 调用流程: * 1、服务提供方启动运行,向注册中心注册服务; * 2、服务消费者启动运行,向注册中心注册,并订阅自己所需的服务。 * 3、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送不变更数据给消费者。 * 4、服务消费者,从提供者地址列表中基于负载均衡算法,选一台提供者进行调用,如果调用失败再选另一台调用。 * 5、服务消费者和提供者,在内存中累计调用次数和调用时间,每分钟发送一次统计数据到监控中心。 * */ 引入dubbo相关依赖 <!-- 引入spring-boot-starter以及dubbo和curator的依赖 --> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>org

dubbo-admin 部署

戏子无情 提交于 2019-12-25 00:38:50
上一章主要是谈到zookeeper的安装和部署 因为zookeeper只是一个黑框,我们无法看到是否存在了什么提供者或消费者,这时就要借助Dubbo-Admin管理平台来实时的查看,也可以通过这个平台来管理提者和消费者。 dubbo-admin.war可以通过网上下载得到,但是我下载了很多版本,都不能使用,这个的原因大概是因为我们本地的jdk编译和打包的问题.所以最好的方式是由GITHUB上下载以后自己打包编译。另外本地一直要安装maven和JDK 首先从github上下载dubbo-admin的源码,dubbo的所有源码可在上下载。 使用命令 git clone https://github.com/alibaba/dubbo.git 或者直接在网站上使用Download zip的方式,如下图所示 下载完成后进行解压,直接使用maven导入该项目: 解压后的文件内容,这里你其它的都不用去管,只管导入dubbo-admin. 使用maven命令进行eclipse:eclipse编译,编译完成后, 然后到webapps/ROOT/WEB-INF下,有一个dubbo.properties文件,里面指向Zookeeper ,使用的是Zookeeper 的注册中心: dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.admin

SpringSecurity的简单使用

泄露秘密 提交于 2019-12-25 00:14:43
导入SpringSecurity坐标 在web.xml中配置过滤器 编写spring-securiy配置文件 编写自定义认证提供者 用户新增时加密密码 配置页面的login和logout 获取登录用户的信息 一.SpringSecurity简介    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。 如果要对Web资源进行保护,最好的办法莫过于Filter,要想对方法调用进行保护,最好的办法莫过于AOP。Spring security对Web资源的保护,就是靠Filter实现的。 二.SpringSecurity的使用 1.导入SpringSecurity的坐标 <!-- SpringSecurity相关坐标 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security

分库分表就能无限扩容吗?

眉间皱痕 提交于 2019-12-24 10:03:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 作者:莫那·鲁道 https://www.cnblogs.com/stateis0/p/10275217.html 像我这样的菜鸟,总会有各种疑问,刚开始是对JDK API的疑问,对NIO的疑问,对JVM的疑问,当工作几年后,对服务的可用性,可扩展性也有了新的疑问,什么疑问呢?其实是老生常谈的话题:服务的扩容问题。 一、正常情况下的服务演化之路 让我们从最初开始。 单体应用 每个创业公司基本都是从类似SSM和SSH这种架构起来的,没什么好讲的,基本每个程序员都经历过。 RPC应用 当业务越来越大,我们需要对服务进行水平扩容,扩容很简单,只要保证服务是无状态的就可以了,如下图: 当业务又越来越大,我们的服务关系错综复杂,同时,有很多服务访问都是不需要连接DB的,只需要连接缓存即可,那么就可以做成分离的,减少DB宝贵的连接。如下图: 我相信大部分公司都是在这个阶段。Dubbo就是为了解决这个问题而生的。 分库分表 如果你的公司产品很受欢迎,业务继续高速发展,数据越来越多,SQL操作越来越慢,那么数据库就会成为瓶颈,那么你肯定会想到分库分表,不论通过ID hash或者range的方式都可以。如下图: 这下应该没问题了吧。任凭你用户再多,并发再高,我只要无限扩容数据库,无限扩容应用,就可以了。 这也是本文的标题

dubbo源码-consumer发送请求-直连

情到浓时终转凉″ 提交于 2019-12-24 09:32:33
下面对调用链的方法进行简要的分析, 疑难的部分会重点分析。同时也会根据 上篇文章 创建代理 的分层逐个进行分析。 直连方式的前半部分 直连方式的后半部分,这部分与订阅方式的后半部分是相同的,所以单独提出来 consumer发送请求调用链分析 NettyChannel.send(Object, boolean) //调用 NioClientSocketChannel执行write NettyClient(AbstractClient).send(Object, boolean) /没有连接则创建连接 NettyClient(AbstractPeer).send(Object) //获取 sent 是否等待发送完成 client层:没有连接就创建连接,然后发送数据。 HeaderExchangeChannel.request(Object, int) 创建Request,赋值版本,是否双向,请求data(类型 是RpcInvocation),创建DefaultFuture 传入channel,requst实例,超时时间,以request id为key缓存 future,为同步请求,执行future.get()等待响应做准备. HeaderExchangeClient.request(Object, int) //转发 ReferenceCountExchangeClient

Dubbo 如何成为连接异构微服务体系的最佳服务开发框架

霸气de小男生 提交于 2019-12-24 04:07:27
从编程开发的角度来说,Apache Dubbo (以下简称 Dubbo)首先是一款 RPC 服务框架,它最大的优势在于提供了面向接口代理的服务编程模型,对开发者屏蔽了底层的远程通信细节。同时 Dubbo 也是一款服务治理框架,它为分布式部署的微服务提供了服务发现、流量调度等服务治理解决方案。 在这篇文章中,我们将以以上基础能力为背景,尝试突破 Dubbo 体系自身,探索如何利用 Dubbo 对多协议、多服务发现模型的支持,来实现异构微服务体系间的互联互通。在实际业务场景中,这可以用来解决异构技术体系共存场景下的通信问题,帮助公司实现在异构技术体系间作平滑迁移,解决大规模跨区域、多集群部署场景的地址发现及流量调度等问题。 面向接口代理的透明服务开发框架 我们还是从 Dubbo 是一个微服务开发框架 这个大家熟知的概念开始。就像 Spring 是开发 Java 应用的基础框架一样,我们经常会选用 Dubbo 作为开发微服务业的基础框架。Dubbo 框架的最大优势我认为就在其面向接口的编程模型,使得开发远程服务调用就像开发本地服务一样(以 Java 语言为例): 1、服务定义 public interface GreetingsService { String sayHi(String name); } 2、消费方调用服务 // 和调用本地服务一样,完全透明。 @Reference

Dubbo入门

本小妞迷上赌 提交于 2019-12-24 03:04:08
参考原文: http://www.cnblogs.com/Javame/p/3632473.html http://blog.csdn.net/ruishenh/article/details/23180707?utm_source=tuicool&utm_medium=referral 一、简单介绍 dubbo概念: Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东, 说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册) 其核心部分包含: 1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。 dubbo优势: 1.透明化的远程方法调用,就像调用本地方法一样调用远程方法