上一篇讲了用RestTemplate加上@LoadBalanced实现负载均衡,这次介绍个更方便的工具 -> feign,feign不需要将url硬编码在代码里,可以通过配置文件的方式来做,而且只需要定义几个接口,这些接口里的抽象方法可以看做controller中方法的空实现。
spring cloud为我们把feign封装了一遍,更便于我们使用,feign自带了ribbon,不需要重新引入ribbon。
详细代码请看 feign 模块
创建 feign-provider 模块用来提供服务,和eureka-provider-consumer中的provider一样,也是启动两个端口,代码实现部分都是一样的
唯一区别是消费端,请看feign-consumer。
先引入openfeign依赖
feign-consumer 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>fegin</artifactId>
<groupId>com.coddox.fegin</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.coddox.fegin.consumer</groupId>
<artifactId>feign-consumer</artifactId>
<dependencies>
<!-- feign依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<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>
</dependencies>
</project>
在消费端的启动类添加@EnableFeignClients注解
创建feign接口,@FeignClient里面指定的是provider的服务名,@RequestMapping是接口地址
@FeignClient("FEIGN-PROVIDER")
public interface UserSearchClient {
@RequestMapping("/user-search/list")
String list();
}
消费端的controller使用这个接口
@RestController
@RequestMapping("/user-search")
public class UserSearchController {
@Autowired
private UserSearchClient userSearchClient;
/**
* 通过feign接口调用provider实现负载均衡
*/
@RequestMapping("/list")
public String list() {
return userSearchClient.list();
}
}
启动eureka server(8080端口)和两个provider分别是8081,8082端口还有consumer(8083)
访问consumer接口,可以看到feign已经自动帮我们实现负载均衡了
第一次请求
第二次
源码:https://codox.coding.net/public/springcloud-learning/springcloud-learning/git/files