1、openFeign是一个HTTP客户端,它融合了springmvc的注解,使之可以用REST风格的映射来请求转发。
2、可以把openFegin理解为是controller层或是service层。可以取代springmvc控制层作为请求映射,亦或是作为service层处理逻辑,只不过这里,openFeign只是做一个请求转发的逻辑操作。
3、openFeign整合了hystrix做熔断处理,同时,可以和ribbon客户端负载均衡、Eureka注册中心配合使用,实现负载均衡的客户端。
4、openFeign有一个很重要的功能:fallback,其实它是hystrix的特性
Feign集成了Ribbon、RestTemplate实现了负载均衡的执行Http调用,只不过对原有的方式(Ribbon+RestTemplate)进行了封装,开发者不必手动使用RestTemplate调服务,而是定义一个接口,在这个接口中标注一个注解即可完成服务调用,这样更加符合面向接口编程的宗旨,简化了开发。
OpenFeign是springcloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
OpenFeign远程调用的底层原理
OpenFeign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加容易。它的底层原理主要基于几个关键组件的协作:
「Feign Client」
在OpenFeign中,你可以通过创建一个接口并使用@FeignClient注解来定义一个Feign客户端。这个接口定义了服务的请求绑定,参数和回调处理。
「Contract」
Contract定义了如何将方法调用转换为HTTP请求。默认情况下,Feign使用自己的注解,但是也可以配置为使用JAX-RS或Spring MVC注解。
「Encoder & Decoder」
「Encoder」: 负责将Java对象编码成HTTP请求体。
「Decoder」: 负责将HTTP响应体解码成Java对象。
「Client」
Client是一个用于发送请求的组件。Feign有多个Client实现,如默认的Java HttpURLConnection、Apache HttpClient和OkHttp。
「Logger」
Feign提供了日志机制来记录HTTP请求和响应的详细信息。
「总结」
OpenFeign的底层原理是通过动态代理技术,将接口的方法调用转换为HTTP请求,并通过Client组件发送到远程服务。它通过Encoder和Decoder处理请求和响应的编码和解码,并且可以与负载均衡器集成以实现服务的高可用性。
如果openFeign没有设置对应得超时时间,那么将会采用Ribbon的默认超时时间,Ribbon的默认超时连接时间、读超时时间都是是1秒。
设置openFeign的超时时间
default设置的是全局超时时间,对所有的openFeign接口服务都生效
feign:
client:
config:
## default 设置的全局超时时间,指定服务名称可以设置单个服务的超时时间
default:
connectTimeout: 5000
readTimeout: 5000
给serviceC这个服务单独配置一个超时时间,配置如下:
feign:
client:
config:
## default 设置的全局超时时间,指定服务名称可以设置单个服务的超时时间
default:
connectTimeout: 5000
readTimeout: 5000
## 为serviceC这个服务单独配置超时时间
serviceC:
connectTimeout: 30000
readTimeout: 30000
| Feign | openFiegn |
|---|---|
| Feign是SpringCloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。 | OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。 |
消息队列的场景使用场景很多,主要是三个:解耦、异步、和削峰。
一个系统或者一个模块,调用了多个系统,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要同步调用接口的,如果用MQ给他异步化解耦,也是可以的,这个时候可以考虑在自己的项目中,是不是可以运用这个MQ来进行系统的解耦。

通过一个MQ,发布和订阅模型,Pub/Sub模型,系统A就和其它系统彻底解耦。
系统A只需要发送消息到MQ中就直接返回了,然后其它系统各自在MQ中进行消费。用户在执行系统A的时候,就会感觉非常快就得到响应了。

削峰就是大量的请求过来,然后MQ将其消化掉了,然后通过其它系统从MQ中取消息,在逐步进行消费,保证系统的有序运行。一般高峰期不会持续太长,在一段时间后,就会被下游系统消化掉。


生产者、broker、消费者在哪些阶段会发生消息丢失?
生产阶段:网络故障
Broker存储阶段:异步刷盘失败
消费者:消费消息失败

生产者:
同步/异步

RocketMQ的消息持久化机制是指将消息存储在磁盘上,以确保消息能够可靠地存储和检索。
三个角色:CommitLog、ConsumeQueue和IndexFile

队列有序
发送顺序
消费顺序
发送到同一个队列中
内存队列:同一个订单的消息存储到一个队列中 再由消费线程消费
高可用的,如果整个系统仅仅靠着一个 Broker 来维持的话,那么这个 Broker 的压力会不会很大?
Nameserver提供Broker 管理 和 路由信息管理。使用多个 Broker 来保证 负载均衡 。
业务端做幂等性 唯一ID
先修复Consumer的问题
将堆积的消息写入到另外的主题中
用更多的机器部署Consumer,消费消息





所谓单点登录,就是只需登录一次,便可访问受信任的其他web应用。


weight为字符串"0",lua脚本为若弱语言,会导致入参b为"0",最终导致 a%b 为NaN,导致gcd(NaN, NaN)一直递归调用。



