springcloud-feign实现服务发现 上一篇介绍了nacos实现配置和注册中心,在微服务中只有配置和注册中心远远不够,还需要有服务发现。本文重点介绍一下基于feign实现服务发现。
springcloud使用服务发现进行服务间调用。对外使用网关gateway屏蔽分流转发接口。服务发现客户端到注册中心拉取服务列表实现客户端负载均衡。客户端实现负载均衡主要有两种方式。一种是ribbon另一种是基于ribbon封装的feign。这是feign官方的解释
我总结了一下主要有一下几个优点:
(1)可插拔的注解支持,包括Feign注解和JAX-RS注解;
(2)支持可插拔的HTTP编码器和解码器;
(3)支持Hystrix和它的Fallback;
(4)支持Ribbon的负载均衡;
(5)支持HTTP请求和相应的压缩。
(1)服务降级:
当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略测不处理或换种简单的方式处理,从而释放资源以保证核心交易正常运作成高效运作。
(2)断路:
熔断这一概念来自于电子工程中的断路器(circuit Breaker)。在互联网系统中,当下游服务因访问压力过大而相应变慢或者失败,上游为了保护系统整体的可用性,可以暂时切断对下游服务的调用。
简单理解就是降级是针对业务,断路是上下游故障。
(3)幂等性:
就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
下面我们开始feign的使用:
(1)添加springcloudalibaba和openfeign的依赖
<dependency>
/<groupId>org.springframework.cloud/</groupId> /<artifactId>spring-cloud-starter-openfeign/</artifactId> /</dependency> /<dependency> /<groupId>org.springframework.cloud/</groupId> /<artifactId>spring-cloud-starter-alibaba-nacos-discovery/</artifactId> /</dependency>
(2)添加注解 @EnableDiscoveryClient开启服务发现,注解 @EnableFeignClients支持feign客户端。
用@FeignClient("serviceName")注解在对外的接口上,这样接口就支持调用服务,因此支持热插拔。serviceName使用注册中心被调用的服务名字。@RequestMapping注解的方法是服务提供方的接口方法,看起来是不是和springmvc使用方法很像,没错因为这是feign对mvc支持的一种契约。feign默认是@RequestLine。它可以支持各种契约。同样子,他可以使用默认的HttpUrlConnection也可以使用httpclient或者okhttp3.
(3)修改application.peoperties配置文件
#服务名字
----- spring.application.name=feign-service
#服务无端口0会随机选择一个
----- server.port=0
#服务集群名字
---- spring.cloud.nacos.discovery.cluster-name=consumer-service
#nacos注册中心地址
----- spring.cloud.nacos.discovery.server-addr=nacos.blog.ailijie.top
ok,完成。下面是feign的高级使用
feign高级使用
(1)feign日志配置
创建feign日志级别,还有feign的重试机制,这样feign可以使用重试机制同时把每一次的请求用日志记录下来。
(2)feign的断路
在feignclient注解中配置fallbackFactory工厂,进行断路解决。使用factory的好处是可以处理异常信息。还可以使用fallback处理。如果使用fallback,fallbackFactory将不会生效。看一下,Factory
需要返回一个IProviderService的实现类,在create方法里可以处理异常。这样在服务端发生异常或者下线后,将会走断路方法。
(2)feign的高级配置
#开启okhttp
----- feign.okhttp.enabled=true
#开启hystrix断路,不开启feign的降级不生效
----- feign.hystrix.enabled=true
#hystrix断路超时时间
----- hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 2000
----- provider- ----- service.ribbon.ConnectTimeout = 1000
----- provider-service.ribbon.ReadTimeout = 1000
#对所有操作请求都进行重试
----- provider-servicee.ribbon.OkToRetryOnAllOperations = true
#切换实例的重试次数
----- provider-service.ribbon.MaxAutoRetriesNextServer = 2
#对当前实例的重试次数
----- provider-service.ribbon.MaxAutoRetries = 1
#设置日志级别
----- logging.level.com.wotrd.feignservice.service.IProviderService=DEBUG
断路的超时时间需要大于读超时时间,不然重试不生效。
未完待续,接下来将会更新springmvc全局异常处理和springdataflow。有问题请留言。
个人博客地址 https://blog.ailijie.top/arch...