Feign
1.定义: feign是声明式的web service 客户端,它让微服务之间的调用变的更加简单了,类似于controller调用service,springCloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端
**2.使用:**只需要创建一个接口,然后添加注解即可
接口就是相当于在dao接口上加一个@feignClient注解。
然后在消费者那里的controller层就不需要使用restTemplate了。实现了面向接口编程
-
依赖:
<!--feign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.7.RELEASE</version> </dependency>
-
写方法(这里是在公共model中创建的)
package com.zhang.service; import com.zhang.pojo.Dept; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import java.util.List; @Component // value为注册中心服务节点名称 @FeignClient(value = "springcloud-provider-dept-8001") public interface FeignService { // 对表进行基础操作 Dept getByDno(Integer dno); int delectByDno(Integer dno); List<Dept> selectDept(); boolean insertDept(Dept dept); }
-
在消费者controller层进行调用,这里注意和使用RestTemplate的区别
package com.zhang.controller;
import com.zhang.pojo.Dept;
import com.zhang.service.FeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class FeignController {
@Autowired
private RestTemplate restTemplate;
// 将请求地址头定义成常量
@Autowired
private FeignService service;
@RequestMapping("/consumer/select")
public List<Dept> getSelect(){
return service.selectDept();
}
@RequestMapping("/consumer/add")
public boolean getAdd(Dept dept){
return service.insertDept(dept); //注意这里使用了post
}
}
```
- 在消费者启动类中使用注解启动feign
```java
package com.zhang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@EnableFeignClients(basePackages ={"com.zhang.service"}) // 加载feign并启动
/*@ComponentScan("com.zhang")*/
public class SpringCloudConsumer80 {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsumer80.class,args);
}
}
3.调用微服务的两种方法:
1.微服务名字(ribbon)----------符合Restful风格编程
2.接口和注解(feign)------------- 面向接口编程
两种都一样,就是方式不同。