Feign
OpenFeign是Netflix 开发的声明式、模板化的HTTP请求客户端。可以更加便捷、优雅地调用http api。
OpenFeign会根据带有注解的函数信息构建出网络请求的模板-在发送网络请求之前-OpenFeign会将函数的参数值设置到这些请求模板中。
feign主要是构建微服务消费端。只要使用OpenFeign提供的注解修饰定义网络请求的接口类-就可以使用该接口的实例发送RESTful的网络请求。还可以集成Ribbon和Hystrix-提供负载均衡和断路器。
英文表意为“假装-伪装-变形”- 是一个 Http 请求调用的轻量级框架-可以以 Java 接口注解的方式调用 Http 请求-而不用像 Java 中通过封装 HTTP 请求报文的方式直接调用。通过处理注解-将请求模板化-当实际调用的时候-传入参数-根据参数再应用到请求上-进而转化成真正的请求-这种请求相对而言比较直观。Feign 封装 了HTTP 调用流程-面向接口编程-回想第一节课的SOP。
Feign和OpenFeign的关系
Feign本身不支持Spring MVC的注解-它有一套自己的注解
OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解-如@RequesMapping等等。
OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口-
并通过动态代理的方式产生实现类-实现类中做负载均衡并调用其他服务。
声明式服务调用
provider方提供公用API包-Feign通过SpringMVC的注解来加载URI
1.创建项目User-Provider

#### 选择依赖

2.创建项目User-API
依赖 spring-boot-starter-web
#### 创建一个接口 RegisterApi
``java
package com.mashibing.UserAPI;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;/** * 用户操作相关接口 * @author 一明哥 * */@RequestMapping("/User")public interface RegisterApi { @GetMapping("/isAlive") public String isAlive();}
`
3.User-Provider 实现API
#### 配置文件
`properties
eureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/server.port=81spring.application.name=user-provider
`
#### 引入API
1.maven install User-Api项目
2.User-Provider的Pom.xml添加依赖
`xml
com.mashibing.User-API User-API 0.0.1-SNAPSHOT
`
#### 创建UserController
实现Api的接口
`java
package com.mashibing.UserProvider;import com.mashibing.UserAPI.RegisterApi;@RestControllerpublic class UserController implements RegisterApi { @Override public String isAlive() { // TODO Auto-generated method stub return "ok"; }}
`
4.Consumer调用
#### 创建项目User-Consumer

#### 依赖

#### 引入API
Pom.xml添加依赖
`xml
com.mashibing.User-API User-API 0.0.1-SNAPSHOT
`
#### 配置文件
`properties
eureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/server.port=90spring.application.name=consumer
`
#### 创建Service接口
`java
package com.mashibing.UserConsumer;import org.springframework.cloud.openfeign.FeignClient;import com.mashibing.UserAPI.RegisterApi;@FeignClient(name = "user-provider")public interface UserConsumerService extends RegisterApi {}
`
#### 创建Controller
`plain
package com.mashibing.UserConsumer;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ConsumerController { @Autowired UserConsumerService consumerSrv; @GetMapping("/alive") public String alive() { return consumerSrv.isAlive(); } }
`
#### 修改启动类
`plain
package com.mashibing.UserConsumer;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication@EnableFeignClientspublic class UserConsumerApplication { public static void main(String[] args) { SpringApplication.run(UserConsumerApplication.class, args); }}
`
5.测试
访问 http://localhost:90/alive 即可完成声明式远程服务调用
Get和Post
Feign默认所有带参数的请求都是Post-想要使用指定的提交方式需引入依赖
`plain
io.github.openfeign feign-httpclient
`
并指明提交方式
`plain
@RequestMapping(value = "/alived", method = RequestMethod.POST)@GetMapping("/findById")
`
带参请求
`plain
@GetMapping("/findById")public Map findById(@RequestParam("id") Integer id);@PostMapping("/register")public Map reg(@RequestBody User user);
`
权限
feign的默认配置类是:org.springframework.cloud.openfeign.FeignClientsConfiguration。默认定义了feign使用的编码器-解码器等。
允许使用@FeignClient的configuration的属性自定义Feign配置。自定义的配置优先级高于上面的FeignClientsConfiguration。
通过权限的例子-学习feign的自定义配置。
服务提供者。上述例子开放service-valuation的权限 后-访问。
`sh
开放权限: org.springframework.boot spring-boot-starter-security@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends