springcloud常用组件
1、服务注册与发现:Eureka ---由nacos替换
2、服务网关: Zuul ---版本不更新,由 GateWay替换
3、服务负载均衡:Ribbon
4、服务之间调用:Feign ----Feign是在2019就已经不再更新了,随之取代的是OpenFeign,从名字上就可以知道,它是Feign的升级版
5、服务熔断:Hystrix ---因官网不继续维护,可以使用阿里提供的Alibaba Sentinel 轻量级的流量控制、熔断降级 Java 库
6、配置中心:config ---如果不想自己维护,可以使用阿里云nacos作为配置中心
7、服务链路追踪:Sleuth
8、链路日志服务:Zipkin ---Sleuth和Zipkin一起组合使用
9、分布式事务:Seata
4、Feign组件
Feign的关键机制是使用了动态代理
1、 首先,对某个接口定义了@FeignClient注解,Feign就会针对这个接口创建一个动态代理
2、 接着调用接口的时候,本质就是调用Feign创建的动态代理
3、 Feign的动态代理会根据在接口上的@RequestMapping等注解,来动态构造要请求的服务的地址
4、 针对这个地址,发起请求、解析响应,其实就是http请求的封装
(通过JDK的动态代理来生成RequestTemplate。RequestTemplate中包含请求的所有信息,如请求参数,请求URL等
RequestTemplate生成Request,然后将Request交给client处理,这个client默认是JDK的HTTPUrlConnection)
Feign是和Ribbon以及Eureka紧密协作的
1、 首先Ribbon会从Eureka Client里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口
2、 然后Ribbon就可以使用默认的Round Robin算法(轮询,随机,权重等等),从中选择一台机器
3、 Feign就会针对这台机器,构造并发起请求
超时重试次数
Feign的超时与重试设置(SpringCloud2.0)_varyall的专栏_feignclient 重试
OpenFeign介绍
是一个Web声明式的Http客户端远程远程调用工具,底层是封装HttpClient技术,提供接口和注解形式调用。
注意feign客户端调用的事项:
如果请求参数没有加上注解的话,默认采用post请求发送。
服务的名称命名不能够有下划线,只能使用中划线,否则会报下列的错。
java.lang.IllegalStateException:Service id not legal hostname
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
接口类上:@FeignClient("被调用的服务器名")
启动类上:@EnableFeignClients
然后在需要使用的地方@Resource注入
OpenFeign的用途及实现原理
openfeign的用途:服务发现,负载均衡,服务调用
openfeign的实现原理:基于@EnableFeignClients 将所有被@FeignClient注解的类 注册到容器中。当这些被@FeignClient注解的类被调用时会创建一个动态代理的对象为我们创建被调用类的实例,然后都会被统一转发给 Feign 框架所定义的一个 InvocationHandler , 由该 Handler 完成后续的 HTTP 转换, 发送, 接收, 翻译HTTP响应的工作
OpenFeign默认等待时间为1s,如果超过1s就会直接报错。
但对于一些耗时长的业务而言1s是不够的,我们可以在yaml文件里手动设置OpenFeign的等待时间。
单位ms
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
日志打印
需要注入bean、配置yaml
config类如下:
FULL
为日志级别
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
日志级别如下:
NONE:默认的,不显示任何日志;
BASIC:仅记录请求方法、URL、响应状态码及执行时间;
HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息;
FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。
yaml配置
以debug方式显示PaymentFeignService
类的日志信息