上一篇文章中已经讲述 Feign的基本用法,本章主要概述 FeignClient
GET/POST/PUT/DELETE restful写法以及 Feign 拦截器,与配置优化方案,关闭HttpClient开启OKHTTP…
- 准备工作
1.启动Consul,所有文章都将以Consul作为服务注册中心
2.创建 battcn-feign-hello,battcn-feign-hi(本文代码基于上篇改造)
3.服务(Hi)-> FeignClient -> 服务(Hello),通过实现 RequestInterceptor 传递 header 信息
- battcn-feign-hello
- pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
|
- BattcnFeignHelloApplication.java
1 2 3 4 5 6 7 8
| @SpringBootApplication @EnableDiscoveryClient public class BattcnFeignHelloApplication {
public static void main(String[] args) { SpringApplication.run(BattcnFeignHelloApplication.class, args); } }
|
- Student.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class Student {
private Long id; private String name; private String email;
@Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + '}'; } public Student(){} public Student(Long id, String name, String email) { this.id = id; this.name = name; this.email = email; } }
|
- HelloController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| @RestController @RequestMapping("/hello") public class HelloController {
@Autowired HttpServletRequest request;
static Logger LOGGER = LoggerFactory.getLogger(HelloController.class);
@ResponseStatus(HttpStatus.OK) @GetMapping public Student findStudentByName(@RequestParam("name") String name,@RequestHeader(name = "token",required = false)) { LOGGER.info("[查询参数] - [{}]", name); LOGGER.info("[Token] - [{}]",token); LOGGER.info("[Auth] - [{}]",request.getHeader("Auth")); return new Student(1L,"挽歌-GET","1837307557@qq.com"); }
@ResponseStatus(HttpStatus.CREATED) @PostMapping public Student addStudent(@RequestBody Student student) { LOGGER.info("[添加信息] - [{}]", student.toString()); return new Student(2L,"挽歌-SAVA","1837307557@qq.com"); }
@ResponseStatus(HttpStatus.CREATED) @PutMapping("/{studentId}") public Student editStudent(@RequestBody Student student, @PathVariable("studentId") Long studentId) { LOGGER.info("[修改信息] - [{}]", student.toString()); return new Student(3L,"挽歌-EDIT","1837307557@qq.com"); }
@ResponseStatus(HttpStatus.NO_CONTENT) @DeleteMapping("/{studentId}") public void deleteStudent(@PathVariable("studentId") Long studentId) { LOGGER.info("[根据编号删除学生] - [{}]", studentId); } }
|
- bootstrap.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| server: port: 8765
spring: application: name: battcn-feign-hello cloud: consul: host: localhost port: 8500 enabled: true discovery: enabled: true prefer-ip-address: true
|
- 测试
访问:http://localhost:8765/hello?name=Levin
显示:{"id":1,"name":"挽歌-GET","email":"1837307557@qq.com"}
代表我们服务启动成功
- battcn-feign-hi
- pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <dependencies> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>com.battcn</groupId> <artifactId>battcn-starter-swagger</artifactId> <version>1.0.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
|
- BattcnFeignHiApplication.java
1 2 3 4 5 6 7 8 9 10
| @EnableDiscoveryClient @EnableFeignClients @SpringBootApplication public class BattcnFeignHiApplication {
public static void main(String[] args) { SpringApplication.run(BattcnFeignHiApplication.class, args); } }
|
- HiController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| @RestController @RequestMapping("/hi") public class HiController {
static Logger LOGGER = LoggerFactory.getLogger(HiController.class);
@Autowired HelloClient helloClient;
@ResponseStatus(HttpStatus.OK) @GetMapping public Student find(@RequestParam("name") String name,@RequestHeader(name="token",required = false)String token) { LOGGER.info("[Token] - [{}]",token); return helloClient.findStudentByName(name,token); }
@ResponseStatus(HttpStatus.CREATED) @PostMapping public Student add(@RequestBody Student student) { return helloClient.addStudent(student); }
@ResponseStatus(HttpStatus.CREATED) @PutMapping("/{studentId}") public Student edit(@RequestBody Student student, @PathVariable("studentId") Long studentId) { return helloClient.editStudent(student, studentId); }
@ResponseStatus(HttpStatus.NO_CONTENT) @DeleteMapping("/{studentId}") public void delete(@PathVariable("studentId") Long studentId) { helloClient.deleteStudent(studentId); } }
|
- MyFeignInterceptor.java
1 2 3 4 5 6 7 8 9 10 11 12
|
@Configuration public class MyFeignInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { requestTemplate.header("Auth","My Name's request header Auth"); } }
|
- HelloClient.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| package com.battcn.client;
import com.battcn.pojo.Student; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*;
@FeignClient(name = "battcn-feign-hello") public interface HelloClient {
@ResponseStatus(HttpStatus.OK) @GetMapping("/hello") Student findStudentByName(@RequestParam("name") String name,@RequestHeader(name="token",required = false)String token);
@ResponseStatus(HttpStatus.CREATED) @PostMapping("/hello") Student addStudent(@RequestBody Student student);
@ResponseStatus(HttpStatus.CREATED) @PutMapping("/hello/{studentId}") Student editStudent(@RequestBody Student student, @PathVariable("studentId") Long studentId);
@ResponseStatus(HttpStatus.NO_CONTENT) @DeleteMapping("/hello/{studentId}") void deleteStudent(@PathVariable("studentId") Long studentId); }
|
- bootstrap.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| server: port: 8766
spring: application: name: battcn-feign-hi cloud: consul: host: localhost port: 8500 enabled: true discovery: enabled: true prefer-ip-address: true
feign: okhttp: enabled: true compression: request: enabled: true mime-types: text/xml,application/xml,application/json min-request-size: 2048 response: enabled: true hystrix: enabled=false
logging: level: project.com.battcn.UserClient: DEBUG
swagger: enable: true api-info: description: ${spring.application.name} license: ${spring.application.name} license-url: http://blog.battcn.com terms-of-service-url: http://blog.battcn.com title: 鏖战八方 version: "@project.version@" contact: email: 1837307557@qq.com name: 挽歌 url: http://blog.battcn.com docket: base-package: com.battcn.controller group-name: ${spring.application.name}
|
- 测试
访问:http://localhost:8766/swagger-ui.html
使用Swagger做测试
此处只演示GET,PUT,DELETE,POST 示例代码都包括,自行测试即可
日志:
1 2 3
| 2017-07-29 18:21:26.854 INFO 12620 --- [nio-8765-exec-2] com.battcn.controller.HelloController : [查询参数] - [Levin] 2017-07-29 18:21:26.854 INFO 12620 --- [nio-8765-exec-2] com.battcn.controller.HelloController : [Token] - [Token HA] 2017-07-29 18:21:26.854 INFO 12620 --- [nio-8765-exec-2] com.battcn.controller.HelloController : [Auth] - [My Name's request header Auth]
|
如果未实现 RequestInterceptor 那么 LOGGER.info("[Auth] - [{}]",request.getHeader("Auth"));
就无法获取到 request 中的信息
- 流程图
画图工具:https://www.processon.com/

- 说点什么
全文代码:http://git.oschina.net/battcn/battcn-cloud/tree/master/battcn-cloud-feign 本章代码,如有问题请及时与我联系
- 个人QQ:1837307557
- Spring Cloud中国社区①:415028731
- Spring For All 社区⑤:157525002
微信公众号:battcn
(欢迎调戏)