03 2020 档案
摘要:如何获取UA和TPS 比如一个系统系统用户数是500万 但是最高峰日活用户10万 但是10万里面,并不是每个用户都会对系统实时发起请求,有的用户可能再浏览商品,有的用户可能在填写表单,或者用户的用户挂起,做别的事情去了,或者是短暂访问后退出了系统。这一部分用户是不会对系统的负载产生影响,所以取10%
阅读全文
摘要:享元模式的应用场景 当一个系统中存在大量重复对象的时候,如果这些重复的对象是不可变对象,我们就可以利用享元模式将对象设计成享元,在内存中只保留一份实例,供多处代码引用。这样可以减少内存中对象的数量,起到节省内存的目的。 例子一 开发一个棋牌游戏(比如象棋)。一个游戏厅中有成千上万个“房间”,每个房间
阅读全文
摘要:应用场景 将一组对象组织(Compose)成树形结构,以表示一种“部分 - 整体”的层次结构 例子1目录描述 描述文件目录 public abstract class FileSystemNode { protected String path; public FileSystemNode(Stri
阅读全文
摘要:说明 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。最核心的目的:简化子系统,简化客户使用,屏蔽多个子系统 比如 跨领域调用编排复杂逻辑,或者跨领域跨系统依赖各种api 再或者跨服务调用的Adapter防腐层 源码中的应用 flow
阅读全文
摘要:说明 这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作 源码中应用 1.《SpringMVC源码阅读-一个请求主要处理流程DispatcherServlet(四)》 2.中 Handle是object可以以任何一种方式存在 通过Hand
阅读全文
摘要:什么是装饰者模式 在不破坏被装饰类的业务逻辑的情况下进行增强 同时支持装饰多层,与代理模式很像 装饰者侧重增强,代理侧重控制 装饰器模式强调的是增强自身,在被装饰之后你能够在被增强的类上使用增强后的功能。增强后你还是你,只不过能力更强了而已;代理模式强调要让别人帮你去做一些本身与你业务没有太多关系的
阅读全文
摘要:JDBC实现 说明 jdbc实现就是桥接模式 关注点在依赖关系的维护。对于jdbc技术来说,它解耦了业务与数据库通信协议这两个纬度之间的关系,所以这两个纬度之间的关系就需要一个桥,即Driver,至于DriverManager把这个关系接到哪里就是运行时的事情了。 微观上,从connection的创
阅读全文
摘要:什么是代理模式 在不侵入原有业务逻辑的情况下,实现功能的扩展和增强 注:静态代理和装饰者模式非常像,个人理解应该是语义上的区别,代理侧重重于控制:比如限流 权限控制 而装饰者只是功能增强 源码中使用到的代理模式 《dubbo源码阅读-服务暴露(七)之本地暴露(Injvm》 《dubbo源码阅读-Pr
阅读全文
摘要:说明 如果对象的创建成本比较大(如会经过io,RPC,数据库,大量计算创建),而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式(Prot
阅读全文
摘要:场景一构建复杂参数的对象 需求 我们需要定义一个资源池配置类 ResourcePoolConfig。这里的资源池,你可以简单理解为线程池、连接池、对象池等。在这个资源池配置类中,有以下几个成员变量,也就是可配置项。现在,请你编写代码实现这个 ResourcePoolConfig 类。 传统实现一 实
阅读全文
摘要:简单工厂 if实现 public class RuleConfigSource { //加载指定文件到config public RuleConfig load(String ruleConfigFilePath) { //获取文件后缀 String ruleConfigFileExtension
阅读全文
摘要:说明 从业务概念上,有些数据在系统中只应该保存一份,就比较适合设计为单例类。比如,系统的配置信息类。除此之外,我们还可以使用单例解决资源访问冲突的问题。 饿汉式 在类加载的时候就创建 public class IdGenerator { private AtomicLong id = new Ato
阅读全文
摘要:挖矿病毒 排查 今天上线发现linux cpu飙升到100% 输入top -c 命令找到最号cpu的进程 top -c 2.使用 kill -9后 几秒会后 又起起来了 3.输入命令 ls -l /proc/{pid号}/exe 4. 我们进入etc目录下面看看 5.发现里面有个update.sh脚
阅读全文
摘要:ReferenceConfig createProxy 参见《dubbo源码阅读-服务订阅(八)之主流程》 rivate T createProxy(Map<String, String> map) { URL tmpUrl = new URL("temp", "localhost", 0, map
阅读全文
摘要:类图 服务注册 RegistryProtocol <1>register 参见《dubbo源码阅读-服务暴露(七)之远程暴露(dubbo)》 public void register(URL registryUrl, URL registedProviderUrl) { //<2>SPI扩展点 此时
阅读全文
摘要:接口定义 @SPI("netty") //缺省值netty public interface Transporter { /** * Bind a server. * * @param url erver url * @param handler * @return server * @throws
阅读全文
摘要:接口定义 @SPI(HeaderExchanger.NAME)//缺省值为header public interface Exchanger { /** * bind. * * @param url * @param handler * @return message server */ @Adap
阅读全文
摘要:使用例子 <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoServiceImpl" protocol="injvm" scope="local" /> 本地如何引用 ReferenceConfig#crea
阅读全文
摘要:说明 Wrapper调用时机可以看:https://www.cnblogs.com/LQBlog/p/12470179.html#autoid-2-0-0 /** * StubProxyFactoryWrapper */ public class StubProxyFactoryWrapper im
阅读全文
摘要:说明 详见《dubbo源码阅读-ProxyFactory(十一)之JdkProxyFactory》 接口定义 详见《dubbo源码阅读-ProxyFactory(十一)之JdkProxyFactory》 类图 JavassistProxyFactory /** * JavaassistRpcProx
阅读全文
摘要:接口定义 /** * ProxyFactory. (API/SPI, Singleton, ThreadSafe) */ @SPI("javassist") //缺省值是javasist public interface ProxyFactory { /** * create proxy. * 需要
阅读全文
摘要:/** * DeprecatedInvokerFilter * 服务于consumer 包含deprecated属性 */ @Activate(group = Constants.CONSUMER, value = Constants.DEPRECATED_KEY) public class Dep
阅读全文
摘要:/** * Log any invocation timeout, but don't stop server from running * 服务于服务提供者 */ @Activate(group = Constants.PROVIDER) public class TimeoutFilter im
阅读全文
摘要:@Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { try { //调用 Result result = invoker.invoke(invocation);
阅读全文
摘要:ContextFilter /** * ContextInvokerFilter * 用于服务提供者 排序第一 */ @Activate(group = Constants.PROVIDER, order = -10000) public class ContextFilter implements
阅读全文
摘要:文档 http://dubbo.apache.org/zh-cn/docs/user/demos/concurrency-control.html ActiveLimitFilter /** * 控制调用服务的并发量 限流 * 同时支持多少请求 consumer有效 含有actives配置 */ @
阅读全文
摘要:文档 http://dubbo.apache.org/zh-cn/docs/user/demos/accesslog.html AccessLogFilter @Override public Result invoke(Invoker<?> invoker, Invocation inv) thr
阅读全文
摘要:文档 http://dubbo.apache.org/zh-cn/docs/user/demos/token-authorization.html 随机生成token 详情见:https://www.cnblogs.com/LQBlog/p/12469007.html#autoid-6-11-0 /
阅读全文
摘要:EchoFilter /** * EchoInvokerFilter * 用于仅限provider 用于校验服务是否可用 并不执行处理逻辑 */ @Activate(group = Constants.PROVIDER, order = -110000) public class EchoFilte
阅读全文
摘要:API文档 http://dubbo.apache.org/zh-cn/docs/user/demos/parameter-validation.html ValidationFilter /** * ValidationFilter consumer和Provider使用 含有validation
阅读全文
摘要:API文档 http://dubbo.apache.org/zh-cn/docs/user/demos/result-cache.html 缓存使用例子 可参考:https://blog.csdn.net/hardworking0323/article/details/81293402 CacheF
阅读全文
摘要:SPI配置的默认实现 cache=com.alibaba.dubbo.cache.filter.CacheFilter validation=com.alibaba.dubbo.validation.filter.ValidationFilter echo=com.alibaba.dubbo.rpc
阅读全文
摘要:最近完成一个需求,使用阿里Arms需要在log里面加上traceId,但是发现dubbo异常 被ExceptionFilter捕获 并打印 打印不出traceI,然后百度搜索如何重写Filter 参考了这篇文章 https://www.jianshu.com/p/7e7076212bd0 重写Exc
阅读全文
摘要:说明 从《服务订阅主流程》可以看到根据协议来注册 我们默认没有根据url直接配置所以url是registry SPI扩展就是走的RegistryProtocol RegistryProtocol <1>refer /** * type为订阅接口 * @param type Service class
阅读全文
摘要:说明 《dubbo服务订阅主流程》可以发现本地引用协议写死了是injvm 所以protocol SPI获取获得到的InJvmProtocol InJvmProtocol refer public <T> Invoker<T> refer(Class<T> serviceType, URL url)
阅读全文
摘要:说明 在api配置,注解配置 可以发现服务订阅是调用RefreceBean的get方法 类图 ReferenceConfig <1>get com.alibaba.dubbo.config.ReferenceConfig#get public synchronized T get() { //是否已
阅读全文
摘要:说明 https://www.cnblogs.com/LQBlog/p/12469007.html#autoid-6-10-0 注释:<17>处开始看 这里的SPI Key=registry 但是Protocol会被代理具体可以看: https://www.cnblogs.com/LQBlog/p/
阅读全文
摘要:什么是本地暴露 具体可以参考:https://zhuanlan.zhihu.com/p/98423741 我们从上一篇的服务暴露本地暴露开始看起 https://www.cnblogs.com/LQBlog/p/12469007.html#autoid-6-13-0 com.alibaba.dubb
阅读全文
摘要:api方式暴露服务 https://www.cnblogs.com/LQBlog/p/12402704.html#autoid-4-0-0 // 服务提供者暴露服务配置 ServiceConfig<XxxService> service = new ServiceConfig<XxxService>
阅读全文
摘要:说明 前面demo都是我们手动在main方法粗创建容器再star(),dubbo提供了一个main方法更友好的容器启动 public static void main(String[] args) throws Exception { //<1>使用dubbo 提供的main方法启动容器 com.a
阅读全文
摘要:说明 链接 dubboSPI扩展点 项目结构 SPI注解 @SPI /** * 标识一个接口是否是@SPI接口 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interfa
阅读全文
摘要:dubbo可扩展的点的类的对象创建 都是用类似javaspi和javasist的思想来做的。所以看后面代码 先熟悉一下java的SPI和javasist的使用 如ServicesConfig的代码 private static final Protocol protocol = (Protocol)
阅读全文
摘要:dubbo各个配置类图 寻找dubbo schema定义 项目目录 xsd定义 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema
阅读全文
摘要:什么是注解配置? 1.通过BeanConfig 我们自己往容器里面注入配置 一般我们都是像2那样config配置用配置文件配置 跳转 2.通过注解实现我们的服务发布和订阅 注:此篇只会将 ServiceBean初始化 和注解实现订阅原理. 服务发布过程和服务订阅内部过程后面篇幅讲 demo 跟前面二
阅读全文
摘要:示例代码 public class Provider { /** * In order to make sure multicast registry works, need to specify '-Djava.net.preferIPv4Stack=true' before * launch t
阅读全文
摘要:模块目录结构 配置之间的UML类图关系 摘自《Dubbo 用户指南 —— XML 配置》 类图 以上所有config都是对应xml的一个标签形式 API配置demo 官方demo地址:点击 各个Config更多配置参考:点击 服务提供者 import org.apache.dubbo.rpc.con
阅读全文
摘要:说明 之前自己看了一篇dubbo源码,但是对整体还是没有清晰的了解所以重新跟着别人的博文阅读 并整理一遍 获取源码 github代码fork 1.打开https://github.com/alibaba/dubbo fork到自己仓库,为了后续自己看的过程中会写一些自己的注释 从自己仓库将项目拉取到
阅读全文