调用 Rest 接口可以使用 RestTemplate 比如
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/query/{id}")
public String qurey(@PathVariable Long id) {
String forObject = restTemplate.getForObject("http://consul-service-1/product/" + id, String.class);
return forObject;
}
可以看到需要拼接 URL,而 Feign 则提供了便捷优雅的方式
Feign 是 Netflix 开发的声明式、模板化的 HTTP 客户端
Feign 需要使用服务发现 Eureka 或 Consul,以及负载均衡 Robbin,这里使用 Consul
因为 Consul 已经包含了 Robbin 依赖,所以不用再添加 Robbin 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
需要配置 Consul 信息
server:
port: 9000
spring:
application:
name: spring-cloud-feign-example
cloud:
consul:
host: localhost
port: 8500
discovery:
# 设置不需要注册到 consul 中
register: false
主程序通过 @EnableFeignClients 注解开启 Spring Cloud Feign 功能
@SpringBootApplication
@EnableFeignClients
public class FeignExampleApplication {
public static void main(String[] args) {
SpringApplication.run(FeignExampleApplication.class, args);
}
}
Feign 接口
@FeignClient(name="consul-service-1")
public interface DemoFeignClient {
// 这个函数会自动从 Consul 获取 producer consul-service-1 的信息,然后发送请求到相应的 URL
@RequestMapping(value="/product/{id}", method = RequestMethod.GET)
public String findProductById(@PathVariable("id") Long id);
}
在 consul producer 项目加入
@GetMapping("/product/{id}")
public String product(@PathVariable("id") String id) {
return "price of product " + id + " is 100";
}
添加 consumer 的 controller
@RestController
public class Controller {
@Autowired
private DemoFeignClient demoFeignClient;
@RequestMapping("/query/{id}")
public String qurey(@PathVariable Long id) {
// 调用 Feign Client,本质上还是调用 RestTemplate 的方式,Feign 会进行转化
return demoFeignClient.findProductById(id);
}
}
访问 http://localhost:9000/query/123
返回 price of product 123 is 100
Feign 的一些配置
feign:
client:
config:
feignName: ## 定义 FeginClient 的名称,可以是任意名字
connectTimeout: 5000
readTimeout: 5000
loggerLevel: full
compression:
request:
enabled: true ## 开启请求压缩
response:
enabled: true ## 开启响应压缩
也可以通过代码的方式配置