文章目录
<!--feign的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--eureka客户端的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--ribbon的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
DEPT-PROVIDER
@RestController
public class DeptController {
/**
* 根据Id获取部门
* @param id
* @return
*/
@GetMapping("/dept/{id}")
public Dept getDept(@PathVariable("id") Integer id) {
Dept dept=new Dept();
dept.setDeptId(id);
dept.setDeptName("8081");
return dept;
}
/**
* 添加部门
* @param dept
*/
@PostMapping("/dept")
public Dept addDept(@RequestBody Dept dept) {
return dept;
}
}
dept-api
这个项目中添加如下的feign接口,其中@FeignClient
这个注解的value属性必须和对应的服务提供者的实例名称相同package cn.tedu.api.feign;
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;
import cn.tedu.api.doamin.Dept;
/**
* 1、配置一个Feign的客户端,使用@FeignClient(),其中的name是微服务提供者的实例名称
* 2、其中的restful风格的api只能使用RequestMapping,不能使用GetMapping等,有些版本可能会报错
* 3、怎样和提供者的api对应呢?
* 1、并不是方法名称一致,根据uri来区分的,只要uri访问一致,那么就会匹配对应的服务提供者的api
* 2、虽然不是根据方法名称来匹配,但是我们最好保持一致
*/
@FeignClient("DEPT-PROVIDER")
public interface DeptFeign {
/**
* 获取部门,使用Get方式请求
* @param id
* @return
*/
@RequestMapping(value="/dept/{id}",method=RequestMethod.GET)
Dept get(@PathVariable("id")Integer id);
/**
* 添加部门,使用POST请求的方式
* @param dept
* @return
*/
@RequestMapping(value="/dept",method=RequestMethod.POST)
Dept addDept(Dept dept);
}
DeptFeign
这个接口实例即可使用,如下:@RestController
public class DeptController {
@Resource
private DeptFeign deptFeign; //直接注入Feign接口,不过需要在主启动类上扫描该类所在的包或者父包
/**
* 根据部门Id获取部门
* @param id
* @return
*/
@GetMapping("/dept/{id}")
public Dept getDept(@PathVariable("id") Integer id) {
return deptFeign.get(id);
}
/**
* 添加部门,json方式提交
* @param dept
* @return
*/
@PostMapping("/dept")
public Dept addDept(@RequestBody Dept dept) {
return deptFeign.addDept(dept);
}
}
@EnableFeignClients
这个注解,注意一定要扫描带有@FeignClient
这个注解的接口的包或者父包,将其注入到ioc容器中@SpringBootApplication
@EnableEurekaClient //eureka客户端
@EnableFeignClients(basePackages= {"cn.tedu.api"}) //开启Feign,其中basePackages扫描的包一定要是@FeignClient这个注解的所在包或者父包
public class DeptConsumer8003Application {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer8003Application.class, args);
}
}
@EnableFeignClients
并且扫描带有@FeignClient
这个注解的包或者父包@EnableEurekaClient
RequestMapping
,不能使用GetMapping
等,有些版本可能会报错import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
/**
* Feign的负载均衡算法的配置类,和Ribbon一样
*/
@Configuration
public class FeignRule {
/**
* 注入随机算法
* @return
*/
@Bean
public IRule myRule() {
return new RandomRule(); //直接创建一个随机算法返回即可
}
}