说明
非SpringCloud的Feign。
小白学习中。
Feign是一种远程调用解决方案,因此我区分了 “服务提供者”和“服务调用者” 。二者分离独立。
服务提供者
- 创建一个普通的spring boot项目。
引入依赖
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.3.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-core</artifactId>
<version>8.18.0</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-jackson</artifactId>
<version>8.18.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
-
新建一个Provider模块
-
编写一个普通的web服务接口
-
application.yml 配置一下端口,这里配置为 8801
server:
port: 8802
- 实体类 User
/**
* @author WillingWay619
*/
@Data
@ToString
public class User implements Serializable {
private String name;
private Integer age;
}
- 控制器 UserController
import org.example.domain.User;
import org.springframework.web.bind.annotation.*;
/**
* @author WillingWay619
*/
@RestController
@RequestMapping("user")
public class UserController {
@RequestMapping(value = "/list", method = {RequestMethod.POST, RequestMethod.GET})
// @PostMapping("/list")
public User list(@RequestBody User user) throws Exception {
System.out.println("----user: " + user);
user.setAge(user.getAge()==null?20:user.getAge());
user.setName(user.getName()==null?"Scott":user.getName());
return user;
}
}
- 然后启动,最好测试一下
- 测试成功,则一个 等待被feign调用的服务 就做好了!
服务调用者
-
新建一个Consumer模块
-
配置文件中配置好feign的目标url及端口(8802调用8801)
server:
port: 8802
feign:
service:
provider:
url: http://127.0.0.1
port: 8801
- 实体类User同上
- FeignInit 初始化类
import example.client.FeignClient;
import feign.Feign;
import feign.Request;
import feign.Retryer;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author WillingWay619
*/
@Configuration
public class FeignInit {
@Value("${feign.service.provider.url}")
private String serviceProviderUrl;
@Value("${feign.service.provider.port}")
private String serviceProviderPort;
@Bean
public FeignClient initClient() {
System.out.println("----serviceProviderUrl: " + serviceProviderUrl);
System.out.println("----serviceProviderPort: " + serviceProviderPort);
return Feign.builder()
.options(new Request.Options(3000, 3000))
.encoder(new JacksonEncoder())
.decoder(new JacksonDecoder())
.retryer(new Retryer.Default(5000, 5000, 3))
.target(FeignClient.class, serviceProviderUrl + ":" + serviceProviderPort);
}
}
- FeignClient 客户端类
import example.domain.User;
import feign.Headers;
import feign.RequestLine;
/**
* @author WillingWay619
*/
@Headers({"Content-Type: application/json", "accept: application/json"})
public interface FeignClient {
@RequestLine("POST /user/list")
public User getOwner(User user);
}
- TestController测试接口
import example.client.FeignClient;
import example.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author WillingWay619
*/
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
private FeignClient feignClient;
@RequestMapping("/1")
public Object test1(String name, Integer age) throws Exception {
System.out.println("----name: " + name);
System.out.println("----age: " + age);
User user = new User();
user.setName(name);
user.setAge(age);
return feignClient.getOwner(user);
}
}
- 启动、测试
- 测试成功,则一个 feign简单Demo 就做好了!
效果
-
浏览器
-
调用者的控制台
-
Provider的控制台