在自己跟着做项目过程中,对springcloud中的feign实现远程调用不太熟悉,故记录一下
Feign是一个声明式
WebService客户端.使用Feign能让编写WebService客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解.Feign也支持可拔插式
的编码器和解码器.Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters.Feign可以与Eureka
和Ribbon
组合使用以支持负载均衡
.
如果我1服务远程调用2服务,我需要在1服务配置feign的相关注解
@EnableFeignClients(basePackages={"com.xuecheng.content.feignClient"}) //如果feign注册的服务器不跟启动类同一个包,需要配置所在的包名
@SpringBootApplication
<!-- Spring Cloud 微服务远程调用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
代码如下(示例):
spring:
application:
name: content-api #服务名
# datasource:
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://192.168.101.65:3306/xyh_content?serverTimezone=UTC&userUnicode=true&useSSL=false&
# username: root
# password: mysql
cloud:
nacos:
server-addr: 192.168.101.xx:8848 #nacos服务端口号
discovery:
namespace: xyh_dev #nacos空间名称
group: xuecheng-plus-project #nacos组名
config:
namespace: xyh_dev
group: xuecheng-plus-project
file-extension: yaml
refresh-enabled: true
extension-configs: #扩展配置,只有自己服务进行配置
- data-id: content-service-${spring.profiles.active}.yaml
group: xuecheng-plus-project
refresh: true
- data-id: search-${spring.profiles.active}.yaml #这个是els全文索引的配置
group: xuecheng-plus-project
refresh: true
shared-configs: #共享配置,所有服务都需要用的放在共享配置
#- data-id: swagger-${spring.profiles.active}.yaml #这个是swagger的配置
#group: xuecheng1-common
#refresh: true
- #data-id: logging-${spring.profiles.active}.yaml #这个是日志的配置
#group: xuecheng1-common
#refresh: true
#- data-id: freemarker-config-${spring.profiles.active}.yaml #这个是freemarker文件渲染配置
#group: xuecheng1-common
#refresh: true
- data-id: feign-${spring.profiles.active}.yaml #这个是我们的feign的配置
group: xuecheng1-common
refresh: true
profiles:
active: xyh_dev #环境名
咱们的服务中的配置文件需要去找nacos中feign的配置:
feign:
hystrix:
enabled: true
circuitbreaker:
enabled: true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 30000 #熔断超时时间
ribbon:
ConnectTimeout: 60000 #连接超时时间
ReadTimeout: 60000 #读超时时间
MaxAutoRetries: 0 #重试次数
MaxAutoRetriesNextServer: 1 #切换实例的重试次数
例如:远程调用媒资服务中的上传文件接口
//远程调用媒资服务接口 value:远程服务在nacos上的配置名称 fallbackFactory熔断降级调用的类
@FeignClient(value = "media-api",configuration = {MultipartSupportConfig.class},fallbackFactory = com.xuecheng.content.feignClient.MediaServiceClientFallbackFactory.class)
public interface MediaServiceClient {
//直接使用restful类型调用媒资管理服务下面对应的接口
@RequestMapping(value = "/media/upload/coursefile",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String uploadFile(@RequestPart("filedata") MultipartFile upload, @RequestParam(value = "objectName",required=false) String objectName);
}
我们还需要注册一个熔断降级的类,我们自己定义,如果客户端返回null说明远程调用时发生了熔断降级
@Slf4j
@Component
public class MediaServiceClientFallbackFactory implements FallbackFactory<MediaServiceClient> {
@Override
public MediaServiceClient create(Throwable throwable) {
return new MediaServiceClient() {
@Override
public String uploadFile(MultipartFile upload, String objectName) {
//降级方法
log.debug("调用媒资管理服务上传文件时发生熔断,异常信息:{}",throwable.toString(),throwable);
return null;
}
};
}
}