模拟实现openFeign: https://www.yuque.com/miaochangke/itmck/syveu2
1.什么是openfeign ?
openfeign 声明式http客户端.使得我们调用远程API变得简单,只需简单的创建一个interface标注注解就能完成远程调用.默认整合ribbon实现负载均衡.
2.Openfeign使用
2.1.引入pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2.创建Fegin客户端
@Component
@FeignClient(name = "micro-icr-risk")
public interface MicroFeginClient {
@GetMapping(value = "mck/hello")
String hello();
@GetMapping(value = "mck/hello2")
@ResponseBody
Student hello2(@RequestParam("name") String name);
}
Tips:
- @FeignClient(value = “fw-register-eureka-client”)里面配置的value 就是服务的名称
- 如果你在项目里面设置了同意的请求路径(server.servlet.context-path),需要将@FeignClient注解调整@FeignClient(value = “fw-register-eureka-client”,path = “xxx”)
Feign 里面定义的接口,有多个@RequestParam,但只能有不超过一个@RequestBody
在定义接口的时候,如果返回的是用户自定义的实体,建议抽取出来,在Controller中实现接口,将抽取出来的接口单独打包,需要调用的项目依赖此包即可,每个项目不用重新定义一遍2.3.启动类 新增@EnableFeignClients(“com.itmck.microicrconsumer.fegin”)
```java @EnableDiscoveryClient @SpringBootApplication @EnableFeignClients(“com.itmck.microicrconsumer.fegin”) public class MicroIcrConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(MicroIcrConsumerApplication.class, args);
}
}
<a name="oZVp4"></a>
## 2.4.使用
```java
@Slf4j
@Api(value = "ConsumerController", tags = "控制器作用")
@RestController
public class ConsumerController {
@Resource
private MicroFeginClient microFeginClient;
@ApiOperation(value = "hello2", notes = "演示2")
@GetMapping("/hello2")
public Student fec(@RequestParam String name) {
return microFeginClient.hello2(name);
}
}
总结:在我们是一个feigin的时候是要保证服务都是在一个注册中心.fegin就是对http的封装方便我们去使用.其实还有个开源的http封装的框架使用也很灵活,可以参考http://forest.dtflyx.com/docs/
3.Fegin进阶
在我们使用Fegin的时候并不是简单的集成,还有一些特殊的需求,如,日志打印,Fegin接口密码认证等
3.1 Feign 自定义日志
我们在开发时候一般出现问题,需要将出错信息、异常信息以及正常的输入输出打印出来,以供我们更好的排查和解决问题,比如想看到接口的性能,就需要看Feign 的日志,那么如何让Feign 的日志展示出来呢?
3.1.1 添加日志的配置信
新建FeignConfig类,并设置日志级别的输出信息
其中:日志等级:
- NONE: 不输出日志
- BASIC: 只输出请求方法的URL 和响应状态码以及接口的请求时间
- HEADERS :将 BASIC信息和请求头信息输出
FULL :输出完 的请求信息 ```java public class FeignConfig {
/**
- 输出的日志级别
- @return */ @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
<a name="iSDUv"></a>
### 3.1.2 @FeignClient的配置修改
<a name="VkXXN"></a>
###### 将配置信息添加到Feign 的接口配置上面 configuration = FeignConfig.class
```java
@FeignClient(name = "micro-icr-risk",configuration = FeignConfig.class)
public interface MicroFeginClient {
}
3.1.3 application.yml中设置日志级别
com.yisu是设置包路径,在这个路径里面的debug信息都会被捕获到
logging:
level:
com.yisu: debug
3.2 Fegin的Basic认证
接口上都会设置需要的权限信息,而一般的权限认证有通过token校验的、也有通过用户名密码校验的等方式。比如我们在Feign 请求中我们可以配置Basic 认证,如下
/**
* 设置Spring Security Basic认证的用户名密码
* @return
*/
@Bean
public BasicAuthRequestInterceptor basicAuthRequestInterceptor(){
return new BasicAuthRequestInterceptor("user","123456");
}
3.3 Fegin 自定义认证配置
@NoArgsConstructor
public class FeignAuthRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
//编写自己的业务逻辑
}
}
然后在FeignConfig配置中添加Bean
@Bean
public FeignAuthRequestInterceptor basicAuthRequestInterceptor(){
return new FeignAuthRequestInterceptor();
}