目录
feign 的用法
一,引入依赖
谁使用feign,或者谁是服务消费者谁添加依赖
<!--springCloud整合feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
二,定义feign 调用接口
package com.zjk.order.feign;
import com.zjk.order.entity.TbProduct;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
//指定需要调用的服务名称
@FeignClient(name = "service-product")
public interface productFeignHttpClient {
//调用的请求路径
@RequestMapping(value = "/product/{id}",method = RequestMethod.GET)
public TbProduct findById(@PathVariable("id") Long id);
}
- 定义各参数绑定时,@PathVariable、@RequestParam、@RequestHeader等可以指定参数属性,在Feign中绑定参数必须通过value属性来指明具体的参数名,不然会抛出异常
- @FeignClient:注解通过name指定需要调用的微服务的名称,用于创建Ribbon的负载均衡器。所以Ribbon会把 shop-service-product 解析为注册中心的服务。
三,在服务消费者启动类上激活feign注解
@EnableFeignClients
package com.zjk.order;
import com.netflix.discovery.DiscoveryClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EntityScan("com.zjk.order.com.zjk.product.entity")
@EnableEurekaClient
//通过@EnableFeignClients 激活feign
@EnableFeignClients
public class OrderApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}
四,通过自动的接口调用远程微服务
修改
OrderController
,添加
ProductFeginClient
的自动注入,并在
order
方法中使用
ProductFeginClient
完成微服务调用
@Autowired
private productFeignHttpClient productFeignHttpClient;
/**
* 基于ribbon 的服务调用,使用服务提供者的服务名称
* @param Id
* @return
*/
@GetMapping(value = "/findByIdByRibbon/{Id}")
public TbProduct findByIdByRibbon(@PathVariable Long Id){
try {
TbProduct byId = productFeignHttpClient.findById(Id);
return byId;
}catch (Exception e){
e.printStackTrace();
}
return null;
}