dubbo是做什么的,Dubbo中的那些坑(四)HTTP调用
dubbo是做什么的,Dubbo中的那些坑(四)HTTP调用详细介绍
本文目录一览: dubbo实际应用是需要配置消费者吗
1. Dubbo是什么?
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如
果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)
其核心部分包含:
1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
2. Dubbo能做什么?
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。
之
前使用Web
Service,我想测试接口可以通过模拟消息的方式通过soapui或LR进行功能测试或性能测试。但现在使用Dubbo,接口之间不能直接交互,我尝
试通过模拟消费者地址测试,结果不堪入目,再而使用jmeter通过junit进行测试,但还是需要往dubbo上去注册,如果再不给提供源代码的前提
下,这个测试用例不好写啊....
3. dubbo的架构
dubbo架构图如下所示:
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
这点我觉得非常好,角色分明,可以根据每个节点角色的状态来确定该服务是否正常。
调用关系说明:
0 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
dubbo的容错性显而易见,性能方面还没有还得及测,我们系统某页面需要掉5次接口,本来想建议做个缓存,但业务关系不能采纳,还需要研究下dubbo的性能调优问题...
4. dubbo使用方法。
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。如果不想使用Spring配置,而希望通过API的方式进行调用(不推荐)
下面我们就来看看spring配置方式的写法:
服务提供者:
1. 下载zookeeper注册中心,下载地址: 下载后解压即可,进入D:apach-zookeeper-3.4.5bin,
双击zkServer.cmd启动注册中心服务。
2. 定义服务接口: (该接口需单独打包,在服务提供方和消费方共享)
下面这个例子不错,写的很详细可以做个model.
package com.unj.dubbotest.provider;
import java.util.List;
public interface DemoService {
String sayHello(String name);
public List getUsers();
}
在服务提供方实现接口:(对服务消费方隐藏实现)
package com.unj.dubbotest.provider;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class DemoServiceImpl implements DemoService{
public String sayHello(String name) {
return "Hello " + name;
}
public List getUsers() {
List list = new ArrayList();
User u1 = new User();
u1.setName("jack");
u1.setAge(20);
u1.setSex("男");
User u2 = new User();
u2.setName("tom");
u2.setAge(21);
u2.setSex("女");
User u3 = new User();
u3.setName("rose");
u3.setAge(19);
u3.setSex("女");
list.add(u1);
list.add(u2);
list.add(u3);
return list;
}
}
用Spring配置声明暴露服务:
<beans xmlns=""
xmlns:xsi=""
xmlns:dubbo=""
xsi:schemaLocation="
/spring-beans.xsd
/dubbo.xsd
">
<!-- 使用multicast广播注册中心暴露服务地址
-->
加载Spring配置,启动服务:
package com.unj.dubbotest.provider;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
context.start();
System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟
}
}
服务消费者:
applicationContext-dubbo.xml 中注册自己需要调用的接口,我刚开始测试的时候需要的接口很多,所以把这个文件写的满满的,后来熟悉了把接口按业务类型分开,写了N多个 applicationContext-dubbo-***.xml 简练多了 》。
1.通过Spring配置引用远程服务:
<beans xmlns=""
xmlns:xsi="" xmlns:dubbo=""
xsi:schemaLocation="
/spring-beans.xsd
/dubbo.xsd
">
<dubbo:reference id="demoService"
interface="com.unj.dubbotest.provider.DemoService" />
2.加载Spring配置,并调用远程服务:
package com.alibaba.dubbo.demo.pp;
import java.util.List;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.unj.dubbotest.provider.DemoService;
public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" });
context.start();
DemoService demoService = (DemoService) context.getBean("demoService"); //
String hello = demoService.sayHello("tom"); // ?
System.out.println(hello); //
//
List list = demoService.getUsers();
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
// System.out.println(demoService.hehe());
System.in.read();
}
}
/
dubbo和eureka的区别
dubbo和spring cloud区别是:
1、初始定位不同:
SpringCloud定位为微服务架构下的一站式解决方案;Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用和治理。
2、生态环境不同:
SpringCloud依托于Spring平台,具备更加完善的生态体系;而Dubbo一开始只是做RPC远程调用,生态相对匮乏,现在逐渐丰富起来。
3、调用方式:
SpringCloud是采用Http协议做远程调用,接口一般是Rest风格,比较灵活;Dubbo是采用Dubbo协议,接口一般是Java的Service接口,格式固定。但调用时采用Netty的NIO方式,性能较好。
4、组件差异:
例如SpringCloud注册中心一般用Eureka,而Dubbo用的Zookeeper,SpringCloud生态丰富,功能完善,更像是品牌机,Dubbo则相对灵活,可定制性强,更像是组装机。
5、SpringCloud:
Spring公司开源的微服务框架,SpirngCloud 定位为微服务架构下的一站式解决方案。
6、Dubbo:
阿里巴巴开源的RPC框架,Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用,流量分发、流量监控和熔断。
两者的生态对比:
1、Spring Cloud 的功能很明显比 Dubbo 更加强大,涵盖面更广,而且作为 Spring 的旗舰项目,它也能够与 Spring Framework、Spring Boot、Spring Data、Spring Batch 等其他 Spring 项目完美融合,这些对于微服务而言是至关重要的。
2、使用 Dubbo 构建的微服务架构就像组装电脑,各环节选择自由度很高,但是最终结果很有可能因为一条内存质量不行就点不亮了,总是让人不怎么放心。
3、而 Spring Cloud 就像品牌机,在 Spring Source 的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性,但是如果要在使用非原装组件外的东西,就需要对其基础原理有足够的了解。
dubbo和spring cloud区别
dubbo和spring cloud区别是Spring Cloud抛弃了Dubbo 的RPC通信,采用的是基于HTTP的REST方式。严格来说,这两种方式各有优劣。
虽然在一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更为合适。
Dubbo和Spring Cloud并不是完全的竞争关系,两者所解决的问题域不一样:Dubbo的定位始终是一款RPC框架,而Spring Cloud的目的是微服务架构下的一站式解决方案。
非要比较的话,Dubbo可以类比到Netflix OSS技术栈,而Spring Cloud集成了Netflix OSS作为分布式服务治理解决方案,但除此之外Spring Cloud还提供了包括config、stream、security、sleuth等分布式服务解决方案。
当前由于RPC协议、注册中心元数据不匹配等问题,在面临微服务基础框架选型时Dubbo与Spring Cloud只能二选一,这也是两者总拿来做对比的原因。
Dubbo之后会积极寻求适配到Spring Cloud生态,比如作为SpringCloud的二进制通讯方案来发挥Dubbo的性能优势,或者Dubbo通过模块化以及对http的支持适配到Spring Cloud。
dubbo有哪些负载均衡算法?怎么实现的负载均衡算法?dubbo有几层
常见的有LVS、Nginx和HAProxy,者者介绍分别如下:
LVS:使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability),感谢章文嵩博士为我们提供如此强大实用的开源软件。
LVS的特点是:
1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;
2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;
3、工作稳定,自身有完整的双机热备方案;
4、无流量,保证了均衡器IO的性能不会收到大流量的影响;
5、应用范围比较广,可以对所有应用做负载均衡;
6、软件本身不支持正则处理,不能做动静分离。
Nginx的特点是:
1、工作在网络的7层之上,可以针对http应用做一些分流的策略;
2、Nginx对网络的依赖非常小;
3、Nginx安装和配置比较简单,测试起来比较方便;
4、可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;
5、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等;
6、Nginx仅能支持http和Email;
HAProxy的特点是:
1、HAProxy是支持虚拟主机的;
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
3、支持url检测后端的服务器出问题的检测会有很好的帮助;
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;
5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;
6、HAProxy的算法多;
请教Dubbo 如何解决分布式事务
目前比较多的解决方案有几个:
一、结合MQ消息中间件实现的可靠消息最终一致性
二、TCC补偿性事务解决方案
三、最大努力通知型方案
第一种方案:可靠消息最终一致性,需要业务系统结合MQ消息中间件实现,在实现过程中需要保证消息的成功发送及成功消费。即需要通过业务系统控制MQ的消息状态
第二种方案:TCC补偿性,分为三个阶段TRYING-CONFIRMING-CANCELING。每个阶段做不同的处理。
TRYING阶段主要是对业务系统进行检测及资源预留
CONFIRMING阶段是做业务提交,通过TRYING阶段执行成功后,再执行该阶段。默认如果TRYING阶段执行成功,CONFIRMING就一定能成功。
CANCELING阶段是回对业务做回滚,在TRYING阶段中,如果存在分支事务TRYING失败,则需要调用CANCELING将已预留的资源进行释放。
第三种方案:最大努力通知xing型,这种方案主要用在与第三方系统通讯时,比如:调用微信或支付宝支付后的支付结果通知。这种方案也是结合MQ进行实现,例如:通过MQ发送http请求,设置最大通知次数。达到通知次数后即不再通知。
具体的案例你也可以参考下这篇博客,它上面有完整的电商系统分布式事务实现案例:http://www.roncoo.com/article/detail/124243
dubbo泛化调用使用及原理解析
通常我们想调用别人的dubbo服务时,我们需要在项目中引入对应的jar包。而泛化调用的作用是,我们无需依赖相关jar包,也能调用到该服务。
这个特性一般使用在网关类项目中,在业务开发中基本不会使用。
假设我现在要调用下面的接口服务
在xml文件做以下配置
然后注入使用
在两种调用方式中,我们都需要使用被调用接口的字符串参数生成GenericService,通过GenericService的$invoke间接调用目标接口的接口。
$invoke的三个参数分别为,方法名,方法参数类型数组,方法参数数组。
可以看到泛化调用的一个复杂性在于$invoke的第三个参数的组装,下面介绍几种复杂入参的调用方式
首先丰富提供者接口
与入参相似,虽然$invoke的返回定义为Object,实际上针对不同类型有不同的返回。
泛化调用和直接调用在消费者者端,在 使用上的区别 是,我们调用服务时使用的接口为GenericService,方法为$invoker。在 底层的区别 是,消费者端发出的rpc报文发生了变化。
在使用上,不管哪种配置方式,我们都需要配置generic=true
设置generic=true后,RefereceConfig的interfaceClass会被强制设置为GenericService
这也使得我们的RefereanceBean返回的是GenericService类型的代理。
生成的代理是GenericService的代理只是我们使用方式上的变化,更为核心的是,底层发送的rpc报文发生了什么变化。
Dubbo的rpc报文分为header和body两部分。我们这边只需要关注body部分。构造逻辑如下
那么我们通过直接调用与泛化调用ByeService的bye方法在报文上有啥区别呢?
我一开始以为报文中的path是GenericeService,其实并没有,path就是我们调用的目标方法。
path来源???todo
而报文中的方法名,方法参数类型以及具体参数,还是按照GenericeService的$invoke方法入参传递的。
这么个二合一的报文,发送到提供者那边,它估计也会很懵逼,我应该怎么执行?
所以针对泛化调用报文还会把generic=true放在attchment中传递过去
具体逻辑在GenericImplFilter中。
GenericImplFilter中有很多其他逻辑,比如泛化调用使用的序列化协议,正常接口走泛化调用的模式,我们只需要设置attachment的那部分。
知道消费者端报文发生了什么变化,那么接下来就去看提供者端如何处理这个改造后的报文。
总结一下ReferenceConfig中interfaceClass和interfaceName的区别?(这道面试题好像不错)
interfaceClass用于指定生成代理的接口 interfaceName用于指定发送rpc报文中的path(告诉服务端我要调用那个服务)
消费者泛化调用的rpc报文传递到提供者还不能直接使用,虽然path是对的,但是实际的方法名,参数类型,参数要从rpc报文的参数中提取出来。
GenericFilter就是用来做这件事情。
在提供者这边,针对泛化调用的逻辑全部封装到了GenericFilter,解耦的非常好。
注意第4个条件,一开始很疑惑,后来发现rpc报文中的path是目标接口的,这边invoker.getInterface()返回的肯定就是实际接口了
这边有个疑问,为什么这边还要再次反序列化一次,netty不是有decoder么??
嗯,你别忘了,针对一个POJO你传过来是一个Map,从Map转换为POJO需要这边进一步处理。
这边需要注意一下!!针对接口的泛化调用,抛出的异常都会经过GenericException包装一下。
从功能上来看,泛化调用提供了在没有接口依赖情况下进行的解决方案,丰富框架的使用场景。 从设计上来看,泛化调用的功能还是通过扩展的方式实现的,侵入性不强,值得学习借鉴。
Dubbo之SPI实现原理详解
?SPI全称为Service Provider Interface,是一种服务提供机制,比如在现实中我们经常会有这种场景,就是对于一个规范定义方而言(可以理解为一个或多个接口),具体的服务实现方是不可知的(可以理解为对这些接口的实现类),那么在定义这些规范的时候,就需要规范定义方能够通过一定的方式来获取到这些服务提供方具体提供的是哪些服务,而SPI就是进行这种定义的。
说明:
Dubbo 的扩展点加载是基于JDK 标准的 SPI 扩展点发现机制增强而来的,Dubbo 改进了 JDK 标准的 SPI 的以下问题:
dubbo对于SPI的实现主要是在ExtensionLoader这个类中,这个类主要有三个方法:
如下是getExtension()方法的源码:
createExtension()方法的源码:
在createExtension()方法中,其主要做了三件事:
关于wrapper对象,这里需要说明的是,其主要作用是为目标对象实现AOP。wrapper对象有两个特点:
getExtensionClasses()方法的源码
loadDirectory()方法的源码:
loadClass()方法的源码
loadClass()方法主要作用是对子类进行划分,这里主要划分成了三部分:
总结而言,getExtension()方法主要是获取指定名称对应的子类。在获取过程中,首先会从缓存中获取是否已经加载过该子类,如果没加载过则通过定义文件加载,并且使用获取到的wrapper对象封装目标对象返回。
getAdaptiveExtension()方法源码
怎么学习java中的一个框架?
学习Java中的一个框架可以遵循以下步骤:
1. **了解基础知识:** 在开始学习一个框架之前,确保你对Java编程语言有一定的了解,包括面向对象编程、基本语法和概念。
2. **选择框架:** 根据你的需求和兴趣选择一个适合的框架,比如Spring、Hibernate、Spring Boot等。了解框架的用途和特点。
3. **官方文档:** 框架通常都有官方文档,它是学习的重要资源。从框架的官方网站找到文档并详细阅读,了解框架的核心概念、架构和用法。
4. **示例代码:** 查找官方提供的示例代码,从中学习如何使用框架的不同组件和功能。尝试运行这些示例,理解其工作原理。
5. **教程和博客:** 在网络上寻找与该框架相关的教程、博客和视频教程。这些资源通常会提供实际案例、使用技巧和最佳实践。
6. **实践项目:** 创建一个小型的实践项目,尝试在其中应用框架的不同特性。通过实际动手,加深对框架的理解。
7. **参与社区:** 参与框架的社区讨论、论坛和问答平台。在这些地方可以提问、解答问题,与其他学习者和专业人士交流经验。
8. **阅读源代码:** 如果可能,深入研究框架的源代码,了解其内部实现。这对于理解框架的工作机制和原理非常有帮助。
9. **持续学习:** 框架技术不断发展,保持学习的态度。关注框架的更新和新功能,参加培训、研讨会等活动。
10. **项目实践:** 最终,将所学应用到实际项目中。在实际项目中使用框架,解决真实问题,这是巩固知识的最佳途径。
通过以上步骤,你可以逐步深入学习Java框架,掌握其核心概念和用法,并在实际项目中应用所学知识。
框架是程序员们必学的知识点,而且是十分重要的应用,Spring、SpringMVC、Mybatis也是经典中的经典,最常用的框架类型。
作为Java新手应该如何去学习框架呢?搜集了很多网友的建议,现在为大家总结如下:
有同学建议:对于Spring来说,最应该学习的就是Spring的IOC原理,这在使用过程中是必须要理解的、必会的。用配置文件或者是Annonation的方式来代替New创建实例,可以说这是一个历史性的进步,并且前进了一大步,影响深远。也是间接的促成了接口实现分离的优雅风格。
另外,该同学还认为,建议把Hibernate换成Mybatis。
还有更接地气的同学建议说:从配置文件开始,理解三个字母各自是如何工作的,以及是如何协同工作的。我从零开始学ssm的时候就这么干的,花了一个月左右,使用起来就比较熟练了。然后深入框架的一些高级用法。再接着琢磨它们的原理、思想和设计、实现。最后到能自己重新发明轮子。
更有给力的同学给出了详细的建议,连具体步骤都给出了明确的说明。具体如下:
java语法基础,可以看think in java;
servlet,jsp,jdbc,结合html,css,js实现自己想要的小网站,功能慢慢积少成多;
spring,springmvc,springdata,hibernate,mybatis等框架学习,一上来用这些框架忽略基础,这样会出现只会用xxx框架,换个yyy框架又得重新学习的感觉;
设计模式,aop,oop等的学习,当然可以和之前的步骤反复来研究提高。
对于具体的操作,很多有经验的小伙伴也有妙招:其实不外乎实操这一真理,就是亲自去写一些框架,实践出真知,只有实际操作过了才能真正理解那些曾经学过的知识都是怎么回事。
比如这位朋友建议写一些通过JDBC直接到数据库读写数据的代码,写一个简单的web app,可以登记用户,要对数据有效性能控制,要能检测错误。然后再想办法优化成spring, mybatis和springmvc。优化到代码越少越好。
实操之后最重要的就是思考,每做完一个项目就做一次总结,动脑多想想为什么、接下来怎么做,那么框架那点事儿就不叫事儿了。
下面把我收藏的Java框架教程分享给大家,绝对值得参考!
1. SSM框架:spring+SpringMVC+MyBatis
强烈推荐!全网最全SSM框架集教程,Spring+SpringMVC+MyBatis一套搞定! Spring整合MyBatis项目开发;SpringMVC框架部署和配置,SprinGMVC框架全流程执行原理 ;ybatis配置和使用、Mybatis常见面试问题解析。
SSM框架教程(附源码)Spring+SpringMVC+MyBatis入门一套搞定!
2. Spring全套详解(Ioc-AOP-整合MyBatis)
包括Spring IoC、Spring AOP(CGLib、JDK动态代理)、Spring整合MyBatis,Spring事务管理等内容。
Spring从入门到精通全套教程_通俗易懂进阶必看(Ioc-AOP-整合MyBatis)
3. Mybatis框架(全程带练,源码解析)
包括ORM概述、Mybatis概述、Mybatis增删查改、Mybatis配置文件详解、Mybatis关联映射、MyBatis动态SQL、Mybatis日志配置、Mybatis连接池、Mybatis缓存、Mybatis延迟加载、Mybatis原理解析等。
Mybatis框架视频教程,mybatis(idea版)实战教程(全程带练,源码解析)
4. SpringMVC(框架源码解析)
包括SpringMVC的框架部署配置、创建控制器、前端请求控制器或者静态资源配置、控制器接收前端数据、并对前端请求作出响应等全流程全细节的讲解。最后将会完成三大框架(Spring、SpringMVC、Mybatis)终极整合。
一套快速掌握spring mvc(框架源码解析)
5. 持久层开发框架-MybatisPLUS
MybatisPlus教程(深入浅出,快速上手),Mybatis-Plus带你高效开发WEB应用。
MybatisPlus教程(深入浅出,快速上手)
6. 服务快速开发技术-springboot
课程提供了配套的所有资料,领取方法见评论区置顶。本套视频基于官方提供的最新版本SpringBoot 2.7.1进行讲解,不仅课程内容全网最新,内容也非常全面,覆盖机构及企业针对于springBoot所有的内容需求,课程一共分为4个章节,课程围绕着核心基础、日志框架、SpringBoot与其他技术整合(如Redis Ecache Elasticsearch MQ Quarts....)等、源码的剖析(搭建源码环境、运行的原理、内置tomcat、自定义starter等等)还有部署监控等内容。
SpringBoot2全套,springboot快速入门到项目实战视频教程
7.Spring Security
本套课程首先带来大家学会Spring Security框架的基本用法,手把手教大家完成框架的基本配置。然后详细讲解Security框架中的过滤器、认证方式、JWT的使用等内容。最后使用Spring Security+JWT的方式,做一个权限认证系统的微服务项目。从单体环境下的权限认证,到微服务前后端分离式的权限系统,实现对整个课程内容的升级。
SpringSecurity最新框架教程,从基础入门到Spring Security+JWT微服务项目实战
8.Java日志框架
本套课程是针对有Java基础的小伙伴进行讲解,由浅入深详细讲解每个知识点以及编程思想,系统完整的帮助小伙伴建立完备的Java日志系统知识体系以及高性能的日志框架选型。
Java日志框架教程,由浅入深全面精讲多种日志框架(log4j、slf4j、logback、jul、juc、springboot )
9. 微服务框架-Spring cloud
通过学习你将深刻理解微服务架构, 精通springcloud-alibaba各个组件的工作原理及其使用,吊打面试官,高薪拿offer。
SpringCloud框架入门到精通全套教程 java微服务架构基础 史上最简单全面的微服务开发教程
10. 分布式框架-Dubbo
旨在深度分析服务之间调用逻辑,从剖析RPC底层原理开始,通过手写RPC框架,掌握RPC实现逻辑。通过全方位介绍微服务RPC框架Dubbo,实现Dubbo在各实战场景中的应用。通过剖析Dubbo源码,掌握Dubbo的服务通信、负载均衡、SPI机制及服务治理的实现逻辑。
RPC+Dubbo框架入门最全教程_dubbo源码实战
11. 分布式框架-zookeeper
通过学习你将具备: Zookeeper的底层数据存储逻辑 Zookeeper客户端的完整操作流程 Zookeeper集群实战技能 分布式架构思维的引导及建立。
Zookeeper集群教程-全网最全Zookeeper应用及原理分析课程
以上就是为大家总结的关于学习Java框架的一些技巧和方法,尤其对于初学者最为重要。
还是那句话,学得再多不如一次实操,边学边练是永远不变的真理,也只有这样才能真正的学到东西,才能真正的把知识转化为技能从而转化为自己的财富。
Dubbo中的那些坑(四)HTTP调用
Dubbo实现了HTTP调用,但只是走了HTTP协议而已,并没有使用诸如REST的调用方式。换句话说,其他语言不能直接调用Dubbo的HTTP协议。而如今异构的系统的REST调用都比较常见,也出现了对Dubbo的REST协议的各种实现。
当当网改进的Dubbox,用了JBOSS的RESTEasy实现REST功能,比Jersey、Restlet、CXF好用。具体参见当当网开源项目: Dubbox
热心网友在GitHub上向当当网提交了基于SpringMVC的REST调用实现( Pull request地址 )。互联网项目中SpringMVC用的挺多,基于SpingMVC的实现还是挺好的。(SpringCloud用的也是SpringMVC,将Dubbo作为SpringCloud服务后,可以提供服务给SpringCloud端使用。感兴趣可以参阅,Dubbo的Spring-boot化)
GitHub上的热心网友(好像是阿里巴巴员工)写了个Dubbo-Plus的项目,有实现Dubbo的HTTP调用( 项目地址 ),没用啥框架,手动解析HTTP请求。
以上几种调换用都存在一个问题,并没有传入RpcContext对象,导致一些Dubbo的原生功能如Token校验等无法使用。这里用RestExpress(基于Netty,可脱离Tomcat或者Jetty等servlet容器运行,以极高的性能著称。参见 Benchmark , Benchmark2 )写了简单的实现。通过将HTTP请求头的值,写入RpcContext中来解决这一问题。项目地址: GitHub:xydonne/dubbo-rpc-restexpress