目录
2、restful传参 : @PathVariable("id")
一,Feign的介绍
1,什么是Feign?
Feign是Spring Cloud提供的声明式、模板化的HTTP客户端,工作在consumer端。
Feign支持了Spring MVC注解
Feign默认集成了Ribbon,所以Fegin默认就实现了负载均衡的效果
2,Feign工作原理
1,将Feign接口代理类注入到Spring容器中:
@EnableFeignClients注解开启Feign扫描,先调用FeignClientsRegistrar.registerFeignClients()方法扫描@FeignClient注解的接口,再将这些接口注入到Spring IOC容器中,方便后续被调用。
2,为接口的方法创建RequestTemplate
当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()创建RequestTemplate(url,参数,httpMethod)
3,发出请求
发请求时会通过RequestTemplate创建Request对象,然后client(HttpClient、OkHttp、UrlConnect)使用Request对象发送请求
二,Feign的入门
1,创建服务提供者:Feign_provider
pom文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Nacos服务中心的启动器-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>Feign_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
yml文件
server:
port: 8090
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.122.131:8848 #nacos服务的地址
application:
name: Feign-provider #注册到nacos的服务名
启动类
@SpringBootApplication
@EnableDiscoveryClient //把当前服务注册到nacos,并发现其它服务
public class FeignProviderApp {
public static void main(String[] args) {
SpringApplication.run(FeignProviderApp.class, args);
}
}
controller类
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Autowired
private UserService userService;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
return userService.getUserById(id);
}
}
service类
//实现类
@Service
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Integer id) {
return new User(id,"@遗失的风",18);
}
}
//接口
public interface UserService {
User getUserById(Integer id);
}
2,创建feign接口
pom文件
<dependencies>
<!--Spring Cloud OpenFeign Starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
feign
@FeignClient("Feign-provider")//调用的服务名
@RequestMapping("/provider")
public interface UserFeign {
@RequestMapping("/getUserById/{id}")//请求的url
public User getUserById(@PathVariable("id") Integer id);
}
3,创建服务消费者:Feign_consumer
pom文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>Feign_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
</dependencies>
yml文件
server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.122.131:8848 #nacos服务的地址
application:
name: Feign-consumer #注册到nacos的服务名
启动类
@SpringBootApplication
@EnableDiscoveryClient //开启nacos,允许注册当前服务,并发现其它服务
@EnableFeignClients //开启feign注解的扫描
public class FeignConsumerApp {
public static void main(String[] args) {
SpringApplication.run(FeignConsumerApp.class, args);
}
}
controller类
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
public UserFeign userFeign;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
System.out.println(userFeign.getClass());
return userFeign.getUserById(id);
}
}
测试 :
三,Feign的参数传递
1、?传参 :@RequestParam("id")
Feign_consumer:
@RequestMapping("/editUserById")//?传参
public User editUserById(Integer id){
return userFeign.editUserById(id);
}
feign接口:
@RequestMapping("/editUserById")//?传参
User editUserById(@RequestParam("id") Integer id);
Feign_provider:
@Override
public User editUserById(Integer id) {
return new User(id,"@遗失的风修改007",18);
}

2、restful传参 : @PathVariable("id")
Feign_consumer:
@RequestMapping("/getUserById/{id}")//restful传参
public User getUserById(@PathVariable Integer id){
return userFeign.getUserById(id);
}
feign接口:
@RequestMapping("/getUserById/{id}")//请求的url restful传参
public User getUserById(@PathVariable("id") Integer id);
Feign_provider:
@Override
public User getUserById(Integer id) {
return new User(id,"@遗失的风",18);
}
3、pojo传参 :@RequestBody
Feign_consumer:
@RequestMapping("/addUser")//pojo对象传参
public User addUser(User user){
return userFeign.addUser(user);
}
feign接口:
@RequestMapping("/addUser")
User addUser(@RequestBody User user);
Feign_provider:
@Override
public User addUser(User user) {
user.setName(user.getName() + "@遗失的风添加了123");
return user;
}