我们在使用Spring Cloud Ribbon时,通常都会利用它对RestTemplate的请求拦截来实现对依赖服务的接口调用,而RestTemplate已经实现了对HTTP请求的封装处理,形成了一套模版化的调用方法。在之前的例子中,我们只是简单介绍了RestTemplate调用对实现,但是在实际开发中,由于对服务依赖对调用可能不止于一处,往往一个接口会被多处调用,所以我们通常都会针对各个微服务自行封装一些客户端累来包装这些依赖服务的调用。这个时候我们会发现,由于RestTemplate的封装,几乎每一个调用都是简单的模版化内容。综合上述这些情况,Spring Cloud Fegin在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。在Spring Cloud Feign的实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。Spring Cloud Feign具备可插拔的注解支持,包括Feign注解和JAX-RS注解。同时,为了适应Spring的广大用户,它在Netflix Feign的基础上扩展了对Spring MVC的注解支持。这对于习惯于Spring MVC的开发者来说,无疑是一个好消息,你我这样可以大大减少学习适应它的成本。另外,对于Feign自身的一些主要组件,比如编码器和解码器等,它也以可插拔的方式提供,在有需求等时候我们以方便扩张和替换它们。
版本说明
Java : 1.8
Spring Boot : 2.1.5.RELEASE
Spring Cloud: Greenwich.SR1
项目说明
eureka-server:eureka服务中心
feign-client :feign生产者
feign-client-intf:feign接口提供者
feign-consumer-advanced:feign消费者
eureka-server
eureka-server之前的文章已经给大家看过了,这里就不在复制出来了https://blog.csdn.net/qq_40297844/article/details/109645804
feign-client-intf:feign接口提供者
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
IService提供的调用的接口
@FeignClient("feign-client")
public interface IService {
@GetMapping("/sayHi")
public String sayHi();
@PostMapping("/sayHi")
public Friend sayHiPost(@RequestBody Friend friend);
}
Friend实体类 用来接收参数
@Data
public class Friend {
private String name;
private String port;
}
feign-client :feign生产者
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 引入之前创建好的feign-client-intf-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>feign-client-intf</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
application.properties
spring.application.name=feign-client
server.port=40006
eureka.client.serviceUrl.defaultZone=http://localhost:20000/eureka/
Controller
@RestController
public class Controller implements IService {
Logger log = LoggerFactory.getLogger(Controller.class);
@Value("${server.port}")
private String port;
@Override
public String sayHi() {
return "This is " + port;
}
@Override
public Friend sayHiPost(@RequestBody Friend friend) {
log.info("You are " + friend.getName());
friend.setPort(port);
return friend;
}
}
启动类FeignClientApplication
@EnableDiscoveryClient
@SpringBootApplication
public class FeignClientApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(FeignClientApplication.class)
.web(WebApplicationType.SERVLET)
.run(args);
}
}
feign-consumer-advanced:feign消费者
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>feign-client-intf</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
application.properties
spring.application.name=feign-consumer-advanced
server.port=40001
spring.main.allow-bean-definition-overriding=true
eureka.client.serviceUrl.defaultZone=http://localhost:20000/eureka/
# 每台机器最大重试次数
feign-client.ribbon.MaxAutoRetries=2
# 可以再重试几台机器
feign-client.ribbon.MaxAutoRetriesNextServer=2
# 连接超时
feign-client.ribbon.ConnectTimeout=1000
# 业务处理超时
feign-client.ribbon.ReadTimeout=2000
# 在所有HTTP Method进行重试
feign-client.ribbon.OkToRetryOnAllOperations=true
Controller
@RestController
@Slf4j
public class Controller {
@Autowired
private IService service;
@GetMapping("/sayHi")
public String sayHi() {
return service.sayHi();
}
@PostMapping("/sayHi")
public Friend sayHi2() {
Friend friend = new Friend();
friend.setName("test");
return service.sayHiPost(friend);
}
}
启动类FeingConsumerApp
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class FeingConsumerApp {
public static void main(String[] args) {
new SpringApplicationBuilder(FeingConsumerApp.class)
.web(WebApplicationType.SERVLET)
.run(args);
}
}
测试
启动三个项目
成功!
有问题,请小伙伴指出
https://www.jianshu.com/p/59295c91dde7 参考文章