这节我们讨论一下feign配置,通过编写配置类,我们可以自定义feign的日志级别,日志扫描目录,可以通过feign调用服务在eureka上的调用信息。
feign声明接口之后,在代码中通过@Resource或者@Autowired注入之后即可使用。
@FeignClient标签的常用属性如下:
name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现了解springcloud架构可以加求求:三五三六二四七二五九
url: url一般用于调试,可以手动指定@FeignClient调用的地址
decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
path: 定义当前FeignClient的统一前缀
一、创建模块(microservice-consumer-movie-feign-customizing)
项目结构如下:
二、pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>microservice-spring-cloud</artifactId> <groupId>com.jacky</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservice-consumer-movie-feign-customizing</artifactId> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <executions> <!--设置在执行maven 的install时构建镜像--> <execution> <id>build-image</id> <phase>install</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <!--安装了docker的主机,并且打开了api remote接口设置--> <dockerHost>http://192.168.6.130:5678</dockerHost> <pushImage>true</pushImage><!--设置上传镜像到私有仓库,需要docker设置指定私有仓库地址--> <!--镜像名称--> <imageName>${docker.repostory}/${docker.image.prefix}/${project.artifactId}:${project.version}</imageName> <!--镜像的基础版本--> <baseImage>java:openjdk-8-jdk-alpine</baseImage> <!--镜像启动参数--> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build> </project>
三、配置文件
spring: application: name: microservice-consumer-movie-feign-customizing server: port: 7901 eureka: client: healthcheck: enabled: true serviceUrl: defaultZone: http://jacky:admin@peer1:8761/eureka/,http://jacky:admin@peer2:8762/eureka/,http://jacky:admin@peer3:8763/eureka/ instance: prefer-ip-address: true #feign日志配置 logging: level: com.jacky.cloud.feign.UserFeignClient: DEBUG # 解决第一次请求报超时异常的方案: # hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000 #延长超时时间 # 或者: # hystrix.command.default.execution.timeout.enabled: false # 或者: feign.hystrix.enabled: false # 索性禁用feign的hystrix支持 # 超时的issue:https://github.com/spring-cloud/spring-cloud-netflix/issues/768 # 超时的解决方案: http://stackoverflow.com/questions/27375557/hystrix-command-fails-with-timed-out-and-no-fallback-available # hystrix配置: https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.thread.timeoutInMilliseconds
四、实体类User.java
package com.jacky.cloud.entity; import java.math.BigDecimal; public class User { private Long id; private String username; private String name; private Short age; private BigDecimal balance; public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public String getUsername() { return this.username; } public void setUsername(String username) { this.username = username; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Short getAge() { return this.age; } public void setAge(Short age) { this.age = age; } public BigDecimal getBalance() { return this.balance; } public void setBalance(BigDecimal balance) { this.balance = balance; } }
五、feign客户端1(UserFeignClient1.java)
package com.jacky.cloud.feign; import org.springframework.cloud.netflix.feign.FeignClient; import com.jacky.cloud.entity.User; import com.jacky.config.Configuration1; import feign.Param; import feign.RequestLine; @FeignClient(name = "microservice-provider-user", configuration = Configuration1.class) public interface UserFeignClient1 { @RequestLine("GET /simple/{id}") public User findById(@Param("id") Long id); }
六、feign客户端2(UserFeignClient2.java)
package com.jacky.cloud.feign; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import com.jacky.config.Configuration2; @FeignClient(name = "xxxx", url = "http://localhost:8761/", configuration = Configuration2.class) public interface UserFeignClient2 { @RequestMapping(value = "/eureka/apps/{serviceName}") public String findServiceInfoFromEurekaByServiceName(@PathVariable("serviceName") String serviceName); }
七、feign配置类1(Configuration1.java)
package com.jacky.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import feign.Contract; import feign.Logger; @Configuration public class Configuration1 { @Bean public Contract feignContract() { return new feign.Contract.Default(); } @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; //定义feign日志显示级别 } }
八、feign配置类2(Configuration2.java)
package com.jacky.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import feign.auth.BasicAuthRequestInterceptor; @Configuration public class Configuration2 { @Bean public BasicAuthRequestInterceptor basicAuthRequestInterceptor() { return new BasicAuthRequestInterceptor("jacky", "admin"); //Eureka添加了安全验证,则需要配置上面的用户名、密码 } }
九、MovieController.java
package com.jacky.cloud.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import com.jacky.cloud.entity.User; import com.jacky.cloud.feign.UserFeignClient2; import com.jacky.cloud.feign.UserFeignClient1; @RestController public class MovieController { @Autowired private UserFeignClient1 userFeignClient1; @Autowired private UserFeignClient2 userfeignClient2; /** * 调用生产者服务 * @param id * @return */ @GetMapping("/movie/{id}") public User findById(@PathVariable Long id) { return this.userFeignClient1.findById(id); } /** * 获得服务在eureka信息 * @param serviceName * @return */ @GetMapping("/{serviceName}") public String findServiceInfoFromEurekaByServiceName(@PathVariable String serviceName) { return this.userfeignClient2.findServiceInfoFromEurekaByServiceName(serviceName); } }
十、启动类ConsumerMovieFeignApplication.java
package com.jacky.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; @SpringBootApplication @EnableEurekaClient @EnableFeignClients public class ConsumerMovieFeignApplication { public static void main(String[] args) { SpringApplication.run(ConsumerMovieFeignApplication.class, args); } }
相关推荐
本项目名为"简易的SpringCloud分布式微服务项目",它旨在提供一个简单易懂的入门示例,帮助开发者理解如何利用SpringCloud实现微服务的搭建和管理。 1. **微服务概念**:微服务是一种软件开发方法,它提倡将单一...
ruoyi-cloud微服务Linux中docker-compose部署 博客链接:https://blog.csdn.net/zht3306/article/details/124687425?spm=1001.2014.3001.5501
spring cloud 示例 docker-compose.yml eureka config
《基于SpringCloud分布式微服务+微信小程序实现短视频社交App设计源码详解》 在现代互联网技术的推动下,短视频社交应用已经成为人们日常生活中不可或缺的一部分。本文将深入探讨如何利用SpringCloud分布式微服务...
SpringCloud是Java领域中广泛使用的微服务开发工具集,它提供了众多服务发现、配置管理、负载均衡、熔断机制等组件,使得开发者能够轻松构建分布式系统。 首先,我们需要了解SpringCloud的核心组件。Eureka是服务...
离线环境下,在centos7.6系统上安装docker-ce-19.03,nvidia-docker2.4版本,其中docker-ce-19.03在docker-local.tar压缩文件里面,nvidia-docker2在nvidia-docker2.zip文件中。 具体安装流程如下: 1.安装docker ...
docker-compose 容器部署 mqtt 配置文件
1、docker-compose 配置详解 2、docker-img制作 3、docker 操作手册
在使用Spring Cloud构建微服务时,可以发现如下几个核心组件:配置管理、服务发现、断路器和分布式会话。配置管理遵循了十二因素应用原则中的配置管理部分,服务发现则是微服务架构中的关键组件,它允许服务间相互...
1. **服务定义**:在`docker-compose.yml`文件中,你可以定义一系列的服务,每个服务都包含了容器镜像、端口映射、环境变量、数据卷等信息。 2. **网络管理**:Compose可以自动创建和管理网络,让服务之间能够相互...
docker-ce-17.03.2.ce-1.el7.centos.x86_64 Centos7 离线安装包和依赖包、 audit-libs-python-2.7.6-3.el7.x86_64.rpm checkpolicy-2.5-4.el7.x86_64.rpm docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm docker-ce-...
docker-compose php7.3.4-fpm+nginx+mysql配置
docker-compose v2.17.2
4. **启动ELK**:在`docker-compose.yml`文件所在的目录下运行`docker-compose up -d`命令,这将后台启动所有服务。 5. **验证安装**:现在你应该能在浏览器中访问`http://localhost:5601`,看到Kibana的界面。在...
本文将详细讲解如何利用Docker Compose搭建一个高可用的Apollo配置中心,该中心包括Eureka服务发现、Spring Boot应用、Spring Cloud组件以及Apollo自身的各个服务组件。 Apollo是携程开源的一款分布式配置中心,它...
安装maven环境,通过docker命令打包镜像,然后编写docker-compose编排文件,部署springboot工程
docker-compose-1.26.2 ,linux 64位版。 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中...
docker-compose 编排springcloud 微服务 请参考博客:https://mp.csdn.net/mdeditor/81952536
1、免积分,不需要VIP,直接下载即可(如果后期被系统修改要VIP,可随意私信我要); 2、由于网上关于 aarch64 的资源特别少,尤其是 docker 这一块的,其他网友写的...3、本资源适用于docker-compose-linux-aarch64
Docker Compose提供了命令行工具,使得我们可以方便地通过`docker-compose up`启动所有服务,`docker-compose down`停止并清理资源,以及使用`docker-compose logs`查看服务日志。这对于开发、测试和生产环境的快速...