博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
服务消费者(Feign-下)
阅读量:4670 次
发布时间:2019-06-09

本文共 8752 字,大约阅读时间需要 29 分钟。

上一篇文章中已经讲述 ,本章主要概述 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
org.springframework.cloud
spring-cloud-starter-consul-discovery
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-test
test

- 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; //...get set @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)) { // TODO:不做具体代码实现,只打印Log 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) { // TODO:不做具体代码实现,只打印Log 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) { // TODO:不做具体代码实现,只打印Log 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) { // TODO:不做具体代码实现,只打印Log 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

- 测试

访问:

显示:{"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
io.github.openfeign
feign-okhttp
org.springframework.cloud
spring-cloud-starter-feign
org.springframework.cloud
spring-cloud-starter-consul-discovery
org.springframework.boot
spring-boot-starter-actuator
com.battcn
battcn-starter-swagger
1.0.1
org.springframework.boot
spring-boot-starter-test
test

- 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) { // TODO:只是演示Feign调用的方法 LOGGER.info("[Token] - [{}]",token); return helloClient.findStudentByName(name,token); } @ResponseStatus(HttpStatus.CREATED) @PostMapping public Student add(@RequestBody Student student) { // TODO:只是演示Feign调用的方法 return helloClient.addStudent(student); } @ResponseStatus(HttpStatus.CREATED) @PutMapping("/{studentId}") public Student edit(@RequestBody Student student, @PathVariable("studentId") Long studentId) { // TODO:只是演示Feign调用的方法 return helloClient.editStudent(student, studentId); } @ResponseStatus(HttpStatus.NO_CONTENT) @DeleteMapping("/{studentId}") public void delete(@PathVariable("studentId") Long studentId) { // TODO:只是演示Feign调用的方法 helloClient.deleteStudent(studentId); } }

- MyFeignInterceptor.java

1 2 3 4 5 6 7 8 9 10 11 12
/**  * 传递Token * @author Levin * @date 2017-07-29. */ @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.*; /** * 模拟完整的CRUD操作 */ @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 #Hystrix支持,如果为true,hystrix库必须在classpath中 feign: okhttp: enabled: true #开启OKHTTP支持,依赖 (feign-okhttp)默认HttpClient #请求和响应GZIP压缩支持 compression: request: enabled: true #支持压缩的mime types 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 #以下就是需要写的配置,注意base-package就可以了 swagger: enable: true #是否开启Swagger 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 #扫描路径,建议以Controller的父包为主 group-name: ${spring.application.name}

- 测试

访问:

使用Swagger做测试

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.cnblogs.com/lywJ/p/10715506.html

你可能感兴趣的文章
JavaScript作用域
查看>>
瞎说一波3种基本背包问题【希望巨巨们指出错误】
查看>>
MySQL安装与操作总结
查看>>
python 中time, datetime的用法
查看>>
python中将函数赋值给变量时需要注意的一些问题
查看>>
SAS数据挖掘实战篇【五】
查看>>
如何成为合格的数据分析师
查看>>
ArcGIS10.5资源分享
查看>>
理解http幂等性
查看>>
grep运用
查看>>
logstash收集syslog日志
查看>>
jenkins修改数据存放路径
查看>>
poj2481树状数组解二维偏序
查看>>
软件工程网络15个人阅读作业1(201521123062 杨钧宇)
查看>>
根据控制点坐标对完成坐标转换
查看>>
Boost.ASIO简要分析-4 多线程
查看>>
java调用支付宝接口代码介绍
查看>>
安装apache 后,找不到服务,解决办法
查看>>
【洛谷 T47488】 D:希望 (点分治)
查看>>
spring-MVC访问静态资源
查看>>