目录
一、概述
二、AdaptiveClassCodeGenerator
三、getExtension方法
四、getActivateExtension方法
一、概述
上一篇文章介绍了Dubbo的SPI机制ExtensionLoader源码,分析了ExtensionLoader如何从META-INFO/dubbo等目录下 获取service provider,并了解了它的缓存机制,缓存class字节码,缓存实例化异常Exception,缓存AdaptiveExtension实体对象, 以及它的自动注入ExtensionFactory的实现原理。
https://blog.csdn.net/qq_33513250/article/details/102818893
本文接着介绍ExtensionLoader通过JavassistCompiler动态生成AdaptiveExtension代码逻辑,并通过Protocol的加载进行实例分析和学习Dubbo的自动包装Wapper功能。
二、 AdaptiveClassCodeGenerator
createAdaptiveExtensionClass方法中使用AdaptiveClassCodeGenerator动态生成代码,下面是生成的Protocol$Adaptive代码。
package org.apache.dubbo.rpc;
import org.apache.dubbo.common.extension.ExtensionLoader;
public class Protocol$Adaptive implements org.apache.dubbo.rpc.Protocol {
public void destroy() {
throw new UnsupportedOperationException(
"The method public abstract void org.apache.dubbo.rpc.Protocol.destroy() of interface org.apache.dubbo.rpc.Protocol is not adaptive method!");
}
public int getDefaultPort() {
throw new UnsupportedOperationException(
"The method public abstract int org.apache.dubbo.rpc.Protocol.getDefaultPort() of interface org.apache.dubbo.rpc.Protocol is not adaptive method!");
}
public org.apache.dubbo.rpc.Invoker refer(java.lang.Class arg0, org.apache.dubbo.common.URL arg1) throws org.apache.dubbo.rpc.RpcException {
if (arg1 == null)
throw new IllegalArgumentException("url == null");
org.apache.dubbo.common.URL url = arg1;
String extName = (url.getProtocol() == null ? "dubbo" : url.getProtocol());
if (extName == null)
throw new IllegalStateException(
"Failed to get extension (org.apache.dubbo.rpc.Protocol) name from url (" + url.toString() + ") use keys([protocol])");
org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol.class)
.getExtension(extName);
return extension.refer(arg0, arg1);
}
public org.apache.dubbo.rpc.Exporter export(org.apache.dubbo.rpc.Invoker arg0) throws org.apache.dubbo.rpc.RpcException {
if (arg0 == null)
throw new IllegalArgumentException("org.apache.dubbo.rpc.Invoker argument == null");
if (arg0.getUrl() == null)
throw new IllegalArgumentException("org.apache.dubbo.rpc.Invoker argument getUrl() == null");
org.apache.dubbo.common.URL url = arg0.getUrl();
String extName = (url.getProtocol() == null ? "dubbo" : url.getProtocol());
if (extName == null)
throw new IllegalStateException(
"Failed to get extension (org.apache.dubbo.rpc.Protocol) name from url (" + url.toString() + ") use keys([protocol])");
org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol.class)
.getExtension(extName);
return extension.export(arg0);
}
}
其中destroy和getDefaultPort方法都是不支持的,会抛出异常UnsupportedOperationException。是因为接口上的Method,没有标注@Adaptive注解,只有标注@Adaptive注解的才会generateExtensionAssignment。
private String generateMethodContent(Method method) {
Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive.class);
StringBuilder code = new StringBuilder(512);
if (adaptiveAnnotation == null) {
return generateUnsupported(method);
} else {
int urlTypeIndex = getUrlTypeIndex(method);
// found parameter in URL type
if (urlTypeIndex != -1) {
// Null Point check
code.append(generateUrlNullCheck(urlTypeIndex));
} else {
// did not find parameter in URL type
code.append(generateUrlAssignmentIndirectly(method));
}
String[] value = getMethodAdaptiveValue(adaptiveAnnotation);
boolean hasInvocation = hasInvocationArgument(method);
code.append(generateInvocationArgumentNullCheck(method));
code.append(generateExtNameAssignment(value, hasInvocation));
// check extName == null?
code.append(generateExtNameNullCheck(value));
code.append(generateExtensionAssignment());
// return statement
code.append(generateReturnAndInvocation(method));
}
return code.toString();
}
refer和export方法在这里可以看到生成code的时候,会根据他们的协议去自动使用不同的协议处理器处理逻辑。
a)when the url is registry://224.5.6.7:1234/org.apache.dubbo.registry.RegistryService?application=dubbo-sample, then the protocol is RegistryProtocol
b)when the url is dubbo://224.5.6.7:1234/org.apache.dubbo.config.api.DemoService?application=dubbo-sample, thenthe protocol is DubboProtocol
c) Actually,when the {@link ExtensionLoader} init the {@link Protocol} instants,it will automatically wraps two layers, and eventually will get a ProtocolFilterWrapper or ProtocolListenerWrapper
private String generateExtNameAssignment(String[] value, boolean hasInvocation) {
// TODO: refactor it
String getNameCode = null;
for (int i = value.length - 1; i >= 0; --i) {
if (i == value.length - 1) {
if (null != defaultExtName) {
if (!"protocol".equals(value[i])) {
if (hasInvocation) {
getNameCode = String.format("url.getMethodParameter(methodName, \"%s\", \"%s\")", value[i], defaultExtName);
} else {
getNameCode = String.format("url.getParameter(\"%s\", \"%s\")", value[i], defaultExtName);
}
} else {
getNameCode = String.format("( url.getProtocol() == null ? \"%s\" : url.getProtocol() )", defaultExtName);
}
} else {
if (!"protocol".equals(value[i])) {
if (hasInvocation) {
getNameCode = String.format("url.getMethodParameter(methodName, \"%s\", \"%s\")", value[i], defaultExtName);
} else {
getNameCode = String.format("url.getParameter(\"%s\")", value[i]);
}
} else {
getNameCode = "url.getProtocol()";
}
}
} else {
if (!"protocol".equals(value[i])) {
if (hasInvocation) {
getNameCode = String.format("url.getMethodParameter(methodName, \"%s\", \"%s\")", value[i], defaultExtName);
} else {
getNameCode = String.format("url.getParameter(\"%s\", %s)", value[i], getNameCode);
}
} else {
getNameCode = String.format("url.getProtocol() == null ? (%s) : url.getProtocol()", getNameCode);
}
}
}
return String.format(CODE_EXT_NAME_ASSIGNMENT, getNameCode);
}
三、getExtension方法
ExtensionLoader还提供了通过name获取service provider的getExtension方法,为了保证线程安全采用了Holder对象持有name的实体类,具体创建逻辑在createExtension中。
public T getExtension(String name) {
if (StringUtils.isEmpty(name)) {
throw new IllegalArgumentException("Extension name == null");
}
if ("true".equals(name)) {
return getDefaultExtension();
}
final Holder holder = getOrCreateHolder(name);
Object instance = holder.get();
if (instance == null) {
synchronized (holder) {
instance = holder.get();
if (instance == null) {
instance = createExtension(name);
holder.set(instance);
}
}
}
return (T) instance;
}
createExtension方法,会去获取所有的Class,同样先从缓存EXTENSION_INSTANCES中获取实体对象,然后再实例化,如果此name的接口Type类型有包装类加载,会对当前实体进行包装。如DubboProtocol实际上会被包装3层(ProtocolListenerWrapper,ProtocolFilterWrapper,QosProtocolWrapper)。
private T createExtension(String name) {
Class clazz = getExtensionClasses().get(name);
if (clazz == null) {
throw findException(name);
}
try {
T instance = (T) EXTENSION_INSTANCES.get(clazz);
if (instance == null) {
EXTENSION_INSTANCES.putIfAbsent(clazz, clazz.newInstance());
instance = (T) EXTENSION_INSTANCES.get(clazz);
}
injectExtension(instance);
Set> wrapperClasses = cachedWrapperClasses;
if (CollectionUtils.isNotEmpty(wrapperClasses)) {
for (Class wrapperClass : wrapperClasses) {
instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));
}
}
return instance;
} catch (Throwable t) {
throw new IllegalStateException("Extension instance (name: " + name + ", class: " +
type + ") couldn't be instantiated: " + t.getMessage(), t);
}
}
四、 getActivateExtension方法
Extensionloader还提供getActivateExtension方法,用来根据url的参数值选着不同的service provider。key,group参数分别为实现类上注解@Activate的value,grop值。
public List getActivateExtension(URL url, String[] values) {
return getActivateExtension(url, values, null);
}
public List getActivateExtension(URL url, String key, String group) {
String value = url.getParameter(key);
return getActivateExtension(url, StringUtils.isEmpty(value) ? null : COMMA_SPLIT_PATTERN.split(value), group);
}
上面两个方法实际调用如下方法,cachedActivates为Extensionloader为@Activate注解的缓存map,key为服务提供者名称,value为Activate对象。然后再遍历Activate对象,找到与传入参数匹配的name,然后遍历再调用getExtension(name)获取所有服务提供者。
public List getActivateExtension(URL url, String[] values, String group) {
List exts = new ArrayList<>();
List names = values == null ? new ArrayList<>(0) : Arrays.asList(values);
if (!names.contains(REMOVE_VALUE_PREFIX + DEFAULT_KEY)) {
getExtensionClasses();
for (Map.Entry entry : cachedActivates.entrySet()) {
String name = entry.getKey();
Object activate = entry.getValue();
String[] activateGroup, activateValue;
if (activate instanceof Activate) {
activateGroup = ((Activate) activate).group();
activateValue = ((Activate) activate).value();
} else if (activate instanceof com.alibaba.dubbo.common.extension.Activate) {
activateGroup = ((com.alibaba.dubbo.common.extension.Activate) activate).group();
activateValue = ((com.alibaba.dubbo.common.extension.Activate) activate).value();
} else {
continue;
}
if (isMatchGroup(group, activateGroup)) {
T ext = getExtension(name);
if (!names.contains(name)
&& !names.contains(REMOVE_VALUE_PREFIX + name)
&& isActive(activateValue, url)) {
exts.add(ext);
}
}
}
exts.sort(ActivateComparator.COMPARATOR);
}
List usrs = new ArrayList<>();
for (int i = 0; i < names.size(); i++) {
String name = names.get(i);
if (!name.startsWith(REMOVE_VALUE_PREFIX)
&& !names.contains(REMOVE_VALUE_PREFIX + name)) {
if (DEFAULT_KEY.equals(name)) {
if (!usrs.isEmpty()) {
exts.addAll(0, usrs);
usrs.clear();
}
} else {
T ext = getExtension(name);
usrs.add(ext);
}
}
}
if (!usrs.isEmpty()) {
exts.addAll(usrs);
}
return exts;
}
@Activate注解的缓存
private final Map cachedActivates = new ConcurrentHashMap<>();
cachedActivates缓存方法,同时兼容alibaba包下旧的注解
private void cacheActivateClass(Class clazz, String name) {
Activate activate = clazz.getAnnotation(Activate.class);
if (activate != null) {
cachedActivates.put(name, activate);
} else {
// support com.alibaba.dubbo.common.extension.Activate
com.alibaba.dubbo.common.extension.Activate oldActivate = clazz.getAnnotation(com.alibaba.dubbo.common.extension.Activate.class);
if (oldActivate != null) {
cachedActivates.put(name, oldActivate);
}
}
}
你可能感兴趣的:(dubbo)
Dubbo应用接入
weixin_34281477
java python
2019独角兽企业重金招聘Python工程师标准>>>一、应用配置1、pom文件引入下面的jar包com.niwodai.infdubbo-cat-extend3.0.02、如果要对全局dubbo服务加监控,增加如下filter:服务提供方:服务消费方:如果只需要对单个服务加监控,增加如下filter:服务提供方:服务消费方:3、配置disconf开关,一个应用只需要配置一次。Disconf监控开
Dubbo+zookeeper
可乐丿不加冰
zookeeper 分布式 java
Dubbo+zookeeperdubbo中文官方文档:https://dubbo.gitbooks.io/dubbo-user-book/content/preface/background.html随着互联网的高速发展,网站不断地扩大,我们的垂直应用架构无法应对,分布式服务架构以及流动计算架构势在必得,急需一个治理系统确保架构有条不紊的演进网站架构迭代:单一应用架构(所有功能都写在一个方法中)-
如何自定义协议
kshzhaohui
后端 java
前言何为自定义协议,其实是相对标准协议来说的,这里主要针对的是应用层协议;常见的标准的应用层协议如http、ftp、smtp等,如果我们在网络通信的过程中不去使用这些标准协议,那就需要自定义协议,比如我们常用的RPC框架(dubbo,thrift),分布式缓存(redis,memcached)等都是自定义协议;本文就来讲讲如何去自定义私有协议,在此之前我们先考虑一下为什么要自定义协议。为什么要自定
Dubbo 的自定义协议
firepation
Dubbo dubbo
1.背景介绍Dubbo是一个高性能的JavaRPC框架,广泛用于构建分布式系统。在Dubbo的架构中,协议是核心组件之一,它负责定义服务的通信方式和数据格式。Dubbo内置了多种协议,如Dubbo协议、HTTP协议、RMI协议等,但在实际应用中,有时需要根据特定的业务需求或技术要求自定义协议。本文将详细探讨Dubbo的自定义协议,包括其工作原理、实现机制以及如何在Dubbo中定义和使用自定义协议。
开源项目
cs294639693
阿里阿里的开源项目很多,这也跟@淘宝正明的开源态度密不可分。有很多重量级的项目,例如LVS、Tengine,或者很有实践价值的中间件,例如MetaQ(分布式消息系统)、dubbo(RPC框架)、cobar(数据库中间件),或者是Java世界的工具,例如druid、fastjson。都说国内Java公司的技术架构大部分来自阿里系,我觉得一方面来自阿里员工,一方面也可以来自阿里的开源项目。地址有几个:
Nacos 深度解析与实战指南:构建云原生微服务的核心枢纽
小小初霁
云原生 微服务 架构
1.Nacos简介Nacos(DynamicNamingandConfigurationService)是阿里巴巴开源的云原生平台核心组件,集服务发现、配置管理、动态DNS和服务元数据管理于一体,支持Kubernetes、SpringCloud、Dubbo等主流生态。其核心理念是帮助开发者快速构建弹性可扩展、高可用的微服务架构。核心优势:一站式解决方案:同时管理服务与配置,降低组件维护成本。多环境
深入探索 Dubbo:高效的 Java RPC 框架
Kale又菜又爱玩
dubbo java rpc
深入探索Dubbo:高效的JavaRPC框架随着微服务架构的流行,分布式系统中的服务间通信变得愈加复杂。Dubbo作为阿里巴巴开源的高性能JavaRPC框架,已成为开发高可用、高性能微服务架构的核心工具之一。本文将深入探讨Dubbo的核心特性、配置方法,以及如何利用Dubbo提供的高级功能来构建一个高效、可靠的分布式系统。什么是Dubbo?Dubbo是一个轻量级、高性能的JavaRPC框架,主要用
学习笔记 3.容器化技术 1.2 Docker进阶
薛定谔的悠米
Docker进阶Docker进阶数据挂载数据卷挂载主机目录Compose集成式应用组合Compose简介安装和卸载使用Compose构建dubbo-admin服务Compose命令说明Compose模板文件Docker进阶数据挂载在容器中管理数据主要有两种方式:数据卷(Volumes):在Docker可管理的范围内挂载主机目录(Bindmounts):在宿主机上的内存数据卷数据卷是一个可供一个或者
Spring Cloud 和 Dubbo 区别
SpringCloud和Dubbo是两种主流的微服务框架,它们在设计理念、技术实现和应用场景上有显著差异。以下是两者的核心区别及各自的优缺点分析:一、核心区别1.初始定位与设计理念SpringCloud:定位为微服务架构的一站式解决方案,提供完整的分布式系统开发工具链(如服务注册、配置中心、网关、熔断器等),注重微服务治理的全面性。Dubbo:起源于SOA时代,核心关注服务调用与治理(如RPC通信
Github 2024-08-16Java开源项目日报 Top10
老孙正经胡说
github 开源 Github趋势分析 开源项目 Python Golang
根据GithubTrendings的统计,今日(2024-08-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下:开发语言项目数量Java项目10TypeScript项目1Ruby项目1ApacheDubbo:高性能的Java开源RPC框架创建周期:4441天开发语言:Java协议类型:ApacheLicense2.0Star数量:40303个Fork数量:26383次关注人数
远程调用Dubbo和OpenFeign的详解
格子先生Lab
dubbo spring cloud
在微服务架构中,服务之间的远程调用(RPC)是核心功能之一。Dubbo和OpenFeign是两个常用的远程调用框架,分别适用于不同的场景。Dubbo是一个高性能的JavaRPC框架,而OpenFeign是SpringCloud生态中的声明式HTTP客户端,主要用于RESTful服务的调用。本文将详细介绍如何使用Dubbo和OpenFeign实现远程调用,并分析它们的适用场景。1.Dubbo简介Du
ClassNotFoundException: com.alibaba.spring.beans.factory.annotation.AnnotationInjectedBeanPostProces
驜鸈
java 服务器
最近在搞seata相关的项目。在跑官方seata-dubbo的官方demo时启动服务老是报标题这个错,上网搜总是说引入下面的依赖就可以了com.alibaba.springspring-context-support1.0.2emmmm引入1.0.2好像也么什么用!!!!!!!!!最后在不懈的百度下原来要引入1.0.11版本emmmmcom.alibaba.springspring-context
JAVA单服务应用拆分成多个服务的实践(3)--前端的nginx转发
秤秤biubiu
开发(应用软件 网站相关) niginx
上篇文章JAVA单服务应用拆分成多个服务的实践(2)--服务的dubbo化已经将部分模块微服务化了,但我们怎么测试?我们的目标是支持ALLInOne,又要支持多个微服务,但前端怎么处理,前端代码又只有一个版本,但又要怎么面向多个微服务呢。这样的话,我们只能引入伟大的nginx。前端只认一个,就使用nginx的转发,将特定的请求转发到微服务的接口里,让前端无感请求到到另一服务中。nginx的配置如下
Redis学习归纳总结--包含redis的所有基础知识点
小白白007
数据库 redis 数据库 java 缓存 后端
Redisredis是开源的,内存中的数据结构存储系统,他可以用作数据库,缓存和消息中间件它支持多种类型的数据结构,如字符串,散列,列表,突然关机可能导致内存内容丢失,所以redis有磁盘持久化,减少损失dubbo的数据中心关系型数据库和非关系型数据库关系型数据库优点:清晰易理解使用方便,通用的sql语言易于维护,丰富的完整性缺点:磁盘I/O是并发的瓶颈海量数据查询效率低横向扩展困难,无法简单的通
Feign vs Dubbo:轻量级REST对决高性能RPC,谁才是微服务通信的真命天子?
码农技术栈
dubbo rpc 微服务 spring cloud spring boot
微服务架构中,服务间的通信就像一场“默契对话”——Feign和Dubbo是两种截然不同的“语言”。一个像“打电话”一样简单直接,一个像“视频会议”一样高效复杂。今天我们就用最接地气的方式,拆解它们的差异与适用场景!一、角色定位:一个像“电话”,一个像“视频会议”Feign:轻量级HTTP通信专家出身:SpringCloud生态的“亲儿子”,基于HTTP协议,主打声明式RESTful调用。特点:像打
Dubbo从入门到精通:一步步构建分布式服务架构
Leaton Lee
java dubbo
引言:为什么选择Dubbo?在现代互联网应用中,分布式系统已经成为一种趋势。随着业务规模的不断扩大,单体应用逐渐暴露出性能瓶颈和维护困难等问题。为了应对这些挑战,微服务架构应运而生,而Dubbo作为国内最流行的微服务框架之一,在企业级应用中得到了广泛的应用。本文将从零开始,全面讲解Dubbo的核心概念、配置方法以及高级使用技巧。无论你是刚接触微服务的小白,还是有一定经验的开发者,都能通过本文快速掌
springboot+dubbo+zookeeper搭建微服务框架基础
2401_89285764
java-zookeeper spring boot dubbo
org.apache.maven.pluginsmaven-compiler-plugin${java.version}${java.version}UTF-8org.apache.maven.pluginsmaven-resources-pluginUTF-8parent父工程到这里就可以不动他了,如果你的子模块有变动再更新三、创建common模块对parent项目创建cmmon子模块,comm
sentinel 使用说明
o_瓜田李下_o
spring cloud alibaba sentinel sentinel
sentinel使用说明相关依赖com.alibaba.cloudspring-cloud-starter-alibaba-sentinelcom.alibaba.cspsentinel-apache-dubbo-adaptercom.alibaba.cloudspring-cloud-alibaba-sentinel-datasourcecom.alibaba.cloudspring-cloud
【RPC】市面上有哪些 RPC 框架?Dubbo 实战 + 手写 RPC 框架,彻底搞懂分布式调用!
工一木子
系统框架 RPC 软件架构 rpc dubbo 分布式
市面上有哪些RPC框架?Dubbo实战+手写RPC框架,彻底搞懂分布式调用!大家好!今天我们来聊聊RPC框架。RPC(RemoteProcedureCall,远程过程调用)是分布式系统中非常重要的技术,它允许程序调用远程服务就像调用本地方法一样简单。本文将分为三部分:市面上有哪些RPC框架?Dubbo框架代码实战。手写一个简单的RPC框架(Java实现)。通过这篇文章,你将彻底搞懂RPC的原理,并
Kafka 基础教程 — 可靠的数据传递
码炫课堂-码哥
kafka专题 kafka 消息队列
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对
SpringCloud Alibaba系列——6Dubbo的SPI机制分析
木木_2024
SpringCloud alibaba系列 spring cloud dubbo java spring boot 微服务
目标理解Dubbo的SPI机制能口述Dubbo和JDK中的SPI机制的区别第1章SPI简介SPI,全称为ServiceProviderInterface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。我们先通过一个很简单的例子来看下
分布式服务框架 Dubbo
Dubbo是一款高性能的分布式服务框架,主要用于实现服务的调用、管理和监控。它最早由阿里巴巴开发,现已成为一个开源项目,并且广泛应用于微服务架构中。Dubbo的核心功能远程过程调用(RPC):Dubbo主要用于服务之间的远程调用,它允许不同的服务在不同的机器上运行,并通过网络相互调用。Dubbo会自动处理网络通信、序列化和反序列化、服务发现等细节,开发者只需要关注服务的接口定义。服务注册与发现:D
Docker下Dubbo服务优雅上下线实现
丿似锦
dubbo kubernetes dubbo qos
简介在Docker容器环境中部署基于Dubbo的服务时,实现服务的优雅上下线是至关重要的。这通常涉及到两个关键步骤:首先,确保服务能够从注册中心摘除,停止接受新的请求;其次,等待所有正在处理的请求完成后再终止容器。通过结合Kubernetes的preStopHook和Dubbo的QoS功能,可以有效地实现这一目标。环境Docker+Kubernetes+SpringBoot+Dubbo⭐实现Pre
分布式消息中间件(十三)——RocketMQ延时消息
码炫课堂-码哥
rocketmq专题 rocketmq 消息中间件
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对
什么是Dubbo?Dubbo框架知识点,面试题总结
沐闻题
dubbo java 面试 后端
本篇包含什么是Dubbo,Dubbo的实现原理,节点角色说明,调用关系说明,在实际开发的场景中应该如何选择RPC框架,Dubbo的核心架构,Dubbo的整体架构设计及分层。主页还有其他的面试资料,有需要的可以去看一下,喜欢的就留个三连再走吧~云文档地址:https://kdocs.cn/l/cekk21xdrlmE大致截图:
微服务结构的项目出现dubbo服务异常
能解决问题才是价值
微服务 dubbo 架构
当你的微服务结构项目突然出现调用远程服务的dubbo时候出现,调用了别人的IP地址服务,或者出现首先调用的自己的IP地址失败后,又去调用了别人的地址,解决的方式就是让调用了谁的IP服务,让对方把防火墙关掉就可解决。希望能帮助跟我遇到同一个问题的技术开发者,如果感觉这个解决对你有价值,可以关注我,每天不定时为大家分享更多技术解决方案。
SpringCloud常见面试题
百百味
spring cloud java
1.SpringCloud什么是微服务?谈谈你对微服务的理解?微服务以前所有的代码都放在同一个工程中、部署在同一个服务器、同一项目的不同模块不同功能互相抢占资源,微服务就是将工程根据不同的业务规则拆分成微服务,部署在不同的服务器上,服务之间相互调用,java中有的微服务有dubbo(只能用来做微服务)、springcloud(提供了服务的发现、断路器等)。微服务的特点:按业务划分为一个独立运行的程
spring cloud和dubbo的特点和优劣势
zzyh123456
spring cloud dubbo spring
SpringCloud和Dubbo都是微服务架构中常用的服务治理框架,它们在特点和优劣势上各有千秋。以下是对两者的详细对比分析:SpringCloud的特点和优劣势特点一站式解决方案:SpringCloud定位为微服务架构下的一站式解决方案,依托于Spring生态,提供了包括服务注册与发现、配置中心、消息总线、断路器、智能路由等在内的多种组件。易于集成:SpringCloud的组件通常设计得更加易
Dubbo
java
Dubbo是一个高性能的分布式服务框架,提供了多种调用策略来优化服务调用的性能和可靠性。一、负载均衡策略:随机(Random):随机选择一个服务提供者进行调用,适合动态调整权重的场景。轮询(RoundRobin):按顺序依次选择服务提供者,适合请求分布均匀的场景,但可能存在请求累积的问题。最少活跃调用(LeastActive):选择当前活跃调用数最少的服务提供者,适合解决慢提供者接收更少请求的场景
RPC框架Dubbo深入分析
radcb55226
程序员 rpc dubbo 网络协议
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!依赖于Zookeeper的稳定性Redis支持基于客户端双写的集群方式,性能高要求服务器时间同步,用于检查心跳过期脏数据Multicast去中心化,不需要安装注册中心依赖于网络拓普和路由,跨机房有风险SimpleDogfooding,注册中心本身也是一个标准的RPC服务没有集群支持,可能单点故障cl
安装数据库首次应用
Array_06
java oracle sql
可是为什么再一次失败之后就变成直接跳过那个要求
enter full pathname of java.exe的界面
这个java.exe是你的Oracle 11g安装目录中例如:【F:\app\chen\product\11.2.0\dbhome_1\jdk\jre\bin】下的java.exe 。不是你的电脑安装的java jdk下的java.exe!
注意第一次,使用SQL D
Weblogic Server Console密码修改和遗忘解决方法
bijian1013
Welogic
在工作中一同事将Weblogic的console的密码忘记了,通过网上查询资料解决,实践整理了一下。
一.修改Console密码
打开weblogic控制台,安全领域 --> myrealm -->&n
IllegalStateException: Cannot forward a response that is already committed
Cwind
java Servlets
对于初学者来说,一个常见的误解是:当调用 forward() 或者 sendRedirect() 时控制流将会自动跳出原函数。标题所示错误通常是基于此误解而引起的。 示例代码:
protected void doPost() {
if (someCondition) {
sendRedirect();
}
forward(); // Thi
基于流的装饰设计模式
木zi_鸣
设计模式
当想要对已有类的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有的功能,并提供加强功能。
自定义的类成为装饰类
模仿BufferedReader,对Reader进行包装,体现装饰设计模式
装饰类通常会通过构造方法接受被装饰的对象,并基于被装饰的对象功能,提供更强的功能。
装饰模式比继承灵活,避免继承臃肿,降低了类与类之间的关系
装饰类因为增强已有对象,具备的功能该
Linux中的uniq命令
被触发
linux
Linux命令uniq的作用是过滤重复部分显示文件内容,这个命令读取输入文件,并比较相邻的行。在正常情 况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如 果输入文件用“- ”表示,则从标准输入读取。
AD:
uniq [选项] 文件
说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个
正则表达式Pattern
肆无忌惮_
Pattern
正则表达式是符合一定规则的表达式,用来专门操作字符串,对字符创进行匹配,切割,替换,获取。
例如,我们需要对QQ号码格式进行检验
规则是长度6~12位 不能0开头 只能是数字,我们可以一位一位进行比较,利用parseLong进行判断,或者是用正则表达式来匹配[1-9][0-9]{4,14} 或者 [1-9]\d{4,14}
&nbs
Oracle高级查询之OVER (PARTITION BY ..)
知了ing
oracle sql
一、rank()/dense_rank() over(partition by ...order by ...)
现在客户有这样一个需求,查询每个部门工资最高的雇员的信息,相信有一定oracle应用知识的同学都能写出下面的SQL语句:
select e.ename, e.job, e.sal, e.deptno
from scott.emp e,
(se
Python调试
矮蛋蛋
python pdb
原文地址:
http://blog.csdn.net/xuyuefei1988/article/details/19399137
1、下面网上收罗的资料初学者应该够用了,但对比IBM的Python 代码调试技巧:
IBM:包括 pdb 模块、利用 PyDev 和 Eclipse 集成进行调试、PyCharm 以及 Debug 日志进行调试:
http://www.ibm.com/d
webservice传递自定义对象时函数为空,以及boolean不对应的问题
alleni123
webservice
今天在客户端调用方法
NodeStatus status=iservice.getNodeStatus().
结果NodeStatus的属性都是null。
进行debug之后,发现服务器端返回的确实是有值的对象。
后来发现原来是因为在客户端,NodeStatus的setter全部被我删除了。
本来是因为逻辑上不需要在客户端使用setter, 结果改了之后竟然不能获取带属性值的
java如何干掉指针,又如何巧妙的通过引用来操作指针————>说的就是java指针
百合不是茶
C语言的强大在于可以直接操作指针的地址,通过改变指针的地址指向来达到更改地址的目的,又是由于c语言的指针过于强大,初学者很难掌握, java的出现解决了c,c++中指针的问题 java将指针封装在底层,开发人员是不能够去操作指针的地址,但是可以通过引用来间接的操作:
定义一个指针p来指向a的地址(&是地址符号):
Eclipse打不开,提示“An error has occurred.See the log file ***/.log”
bijian1013
eclipse
打开eclipse工作目录的\.metadata\.log文件,发现如下错误:
!ENTRY org.eclipse.osgi 4 0 2012-09-10 09:28:57.139
!MESSAGE Application error
!STACK 1
java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContai
spring aop实例annotation方法实现
bijian1013
java spring AOP annotation
在spring aop实例中我们通过配置xml文件来实现AOP,这里学习使用annotation来实现,使用annotation其实就是指明具体的aspect,pointcut和advice。1.申明一个切面(用一个类来实现)在这个切面里,包括了advice和pointcut
AdviceMethods.jav
[Velocity一]Velocity语法基础入门
bit1129
velocity
用户和开发人员参考文档
http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html
注释
1.行级注释##
2.多行注释#* *#
变量定义
使用$开头的字符串是变量定义,例如$var1, $var2,
赋值
使用#set为变量赋值,例
【Kafka十一】关于Kafka的副本管理
bit1129
kafka
1. 关于request.required.acks
request.required.acks控制者Producer写请求的什么时候可以确认写成功,默认是0,
0表示即不进行确认即返回。
1表示Leader写成功即返回,此时还没有进行写数据同步到其它Follower Partition中
-1表示根据指定的最少Partition确认后才返回,这个在
Th
lua统计nginx内部变量数据
ronin47
lua nginx 统计
server {
listen 80;
server_name photo.domain.com;
location /{set $str $uri;
content_by_lua '
local url = ngx.var.uri
local res = ngx.location.capture(
java-11.二叉树中节点的最大距离
bylijinnan
java
import java.util.ArrayList;
import java.util.List;
public class MaxLenInBinTree {
/*
a. 1
/ \
2 3
/ \ / \
4 5 6 7
max=4 pass "root"
Netty源码学习-ReadTimeoutHandler
bylijinnan
java netty
ReadTimeoutHandler的实现思路:
开启一个定时任务,如果在指定时间内没有接收到消息,则抛出ReadTimeoutException
这个异常的捕获,在开发中,交给跟在ReadTimeoutHandler后面的ChannelHandler,例如
private final ChannelHandler timeoutHandler =
new ReadTim
jquery验证上传文件样式及大小(好用)
cngolon
文件上传 jquery验证
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="jquery1.8/jquery-1.8.0.
浏览器兼容【转】
cuishikuan
css 浏览器 IE
浏览器兼容问题一:不同浏览器的标签默认的外补丁和内补丁不同
问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。
碰到频率:100%
解决方案:CSS里 *{margin:0;padding:0;}
备注:这个是最常见的也是最易解决的一个浏览器兼容性问题,几乎所有的CSS文件开头都会用通配符*来设
Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
daizj
shell $# $? 特殊变量
前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。例如,$ 表示当前Shell进程的ID,即pid,看下面的代码:
$echo $$
运行结果
29949
特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个
程序设计KISS 原则-------KEEP IT SIMPLE, STUPID!
dcj3sjt126com
unix
翻到一本书,讲到编程一般原则是kiss:Keep It Simple, Stupid.对这个原则深有体会,其实不仅编程如此,而且系统架构也是如此。
KEEP IT SIMPLE, STUPID! 编写只做一件事情,并且要做好的程序;编写可以在一起工作的程序,编写处理文本流的程序,因为这是通用的接口。这就是UNIX哲学.所有的哲学真 正的浓缩为一个铁一样的定律,高明的工程师的神圣的“KISS 原
android Activity间List传值
dcj3sjt126com
Activity
第一个Activity:
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import a
tomcat 设置java虚拟机内存
eksliang
tomcat 内存设置
转载请出自出处:http://eksliang.iteye.com/blog/2117772
http://eksliang.iteye.com/
常见的内存溢出有以下两种:
java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Java heap space
------------
Android 数据库事务处理
gqdy365
android
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。事
Java 打开浏览器
hw1287789687
打开网址 open浏览器 open browser 打开url 打开浏览器
使用java 语言如何打开浏览器呢?
我们先研究下在cmd窗口中,如何打开网址
使用IE 打开
D:\software\bin>cmd /c start iexplore http://hw1287789687.iteye.com/blog/2153709
使用火狐打开
D:\software\bin>cmd /c start firefox http://hw1287789
ReplaceGoogleCDN:将 Google CDN 替换为国内的 Chrome 插件
justjavac
chrome Google google api chrome插件
Chrome Web Store 安装地址: https://chrome.google.com/webstore/detail/replace-google-cdn/kpampjmfiopfpkkepbllemkibefkiice
由于众所周知的原因,只需替换一个域名就可以继续使用Google提供的前端公共库了。 同样,通过script标记引用这些资源,让网站访问速度瞬间提速吧
进程VS.线程
m635674608
线程
资料来源:
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001397567993007df355a3394da48f0bf14960f0c78753f000 1、Apache最早就是采用多进程模式 2、IIS服务器默认采用多线程模式 3、多进程优缺点 优点:
多进程模式最大
Linux下安装MemCached
字符串
memcached
前提准备:1. MemCached目前最新版本为:1.4.22,可以从官网下载到。2. MemCached依赖libevent,因此在安装MemCached之前需要先安装libevent。2.1 运行下面命令,查看系统是否已安装libevent。[root@SecurityCheck ~]# rpm -qa|grep libevent libevent-headers-1.4.13-4.el6.n
java设计模式之--jdk动态代理(实现aop编程)
Supanccy2013
java DAO 设计模式 AOP
与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
&
Spring 4.2新特性-对java8默认方法(default method)定义Bean的支持
wiselyman
spring 4
2.1 默认方法(default method)
java8引入了一个default medthod;
用来扩展已有的接口,在对已有接口的使用不产生任何影响的情况下,添加扩展
使用default关键字
Spring 4.2支持加载在默认方法里声明的bean
2.2
将要被声明成bean的类
public class DemoService {