Feign流程图 一. OpenFiegn基本搭建(无参数传递) 1. 创建user-provider模块Feign本身不支持Spring MVC的注解,它有一套自己的注解
OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,
并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
-
导包:eureka-client,spring-web
-
yml配置:
server: port: 8700 eureka: client: service-url: defaultZone: http://127.0.0.1:8888/eureka/ spring: application: name: user-provider -
controller:
@RestController public class ProviderController { @GetMapping("/alive") public String alive(){ return "success"; } }
-
导包:eureka-client,spring-web,openFiegn
-
yml配置:
server: port: 90 eureka: client: service-url: defaultZone: http://127.0.0.1:8888/eureka/ -
Feign配置
// user-provider的spring.application.name @FeignClient(name = "user-provider") public interface ConsumerFeign { @GetMapping("/alive") public String alive(); } -
controller
@RestController public class ConsumerController { @Autowired ConsumerFeign consumerFeign; @GetMapping("/alive") public String alive(){ return consumerFeign.alive(); } } -
启动器上添加**@EnableFeignClients**
若未配置user-provider的yml中spring.application.name则会出现下面异常:
二. OpenFeign有参数传递Feign默认所有带参数的请求都是Post,想要使用指定的提交方式需引入依赖
io.github.openfeign feign-httpclient
否则会出现下面的坑(get请求变为post请求):
1. user-provider
- controller
@GetMapping("/alive2")
public String alive2(Integer num){
System.out.println(num);
return "success";
}
2. user-consumer
-
Feign接口
Feign通过读取接口上的注解,SpringMvc的注解,重新组装真正的Url
- 参数必须与provider参数名一致
- 需添加@RequstParam(Hoxton.SR9的版本不需要添加)
@GetMapping("/alive2") public String alive2(@RequestParam Integer num); -
Controller
@GetMapping("/alive2") public String alive2(Integer num){ return consumerFeign.alive2(num); }
-
map类型:需要添加@RequestParam,否则传入空值
@GetMapping("/map") public String map2(@RequestParam Mapmap) { System.out.println(map); System.out.println(map.get("num")); System.out.println(map.get("name")); return "success"; } -
对象:
需用post请求,用@RequestBody接收
不用get请求的原因:1.ie对url有长度限制 2.数据暴露,不安全
@PostMapping("/person") public String map2(@RequestBody Person person) { System.out.println(person); return "success"; }
-
导包: spring-web
-
api接口:
@RequestMapping("/user") public interface UserApi { @GetMapping("/userapi") public String userApi(); @GetMapping("/parameter") public String parameter(Integer num); }
-
导包:
com.zhanghp user 0.0.1-SNAPSHOT -
controller实现api接口
-
实现UserApi接口后,Feign会把接口UserApi上方的**@RequestMapping("/user")**继承过来,就相当于在该controller上方添加了一个@RequestMapping,所以单独访问的话需要添加user路径
如:{ip}:{port}/user/alive
-
如果在controller上方已经声明@RequestMapping("/uuuu")
则实现的接口的@RequqestMapping失效了,如:{ip}:{port}/uuuu/alive。
但不推荐第二种做法,原因如下:
- 公共api的服务接口,就是要定义这些的。
- Feign接口就不继承userapi接口了,否则user-consumer的访问路径会出错,user-consumer继承后会把接口UserApi上方的**@RequestMapping("/user")**继承过来,自动在url添加上该路径
@RestController @RequestMapping("/uuuu") public class ProviderController implements UserApi { @Override public String userApi() { System.out.println("UserAPi"); return "userApi"; } @Override public String parameter(Integer num) { System.out.println(num); return "success_num"; } } -
-
导包:
com.zhanghp user 0.0.1-SNAPSHOT -
Feign接口继承该接口
继承后会把接口UserApi上方的**@RequestMapping("/user")**继承过来,自动在url添加上该路径
所以Feign接口里的方法只写对应的user-provider方法上方的@RequestMapping就行@FeignClient(name = "user-provider") public interface ConsumerFeign extends UserApi { @GetMapping("/userapi") String userApi(); @GetMapping("/parameter") String parameter(@RequestParam Integer num); }
- 可直接进行对user-provider轮询的负载均衡
- yml负载均很的相关配置
#连接超时时间(ms) ribbon.ConnectTimeout=1000 #业务逻辑超时时间(ms)(可通过让provider睡,测试超出时间) ribbon.ReadTimeout=2000 #同一台实例最大重试次数,不包括首次调用 ribbon.MaxAutoRetries=3 #重试负载均衡其他的实例最大重试次数,不包括首次调用 ribbon.MaxAutoRetriesNextServer=3 #是否所有操作都重试 ribbon.OkToRetryonAllOperations=false
er轮询的负载均衡
- yml负载均很的相关配置
#连接超时时间(ms) ribbon.ConnectTimeout=1000 #业务逻辑超时时间(ms)(可通过让provider睡,测试超出时间) ribbon.ReadTimeout=2000 #同一台实例最大重试次数,不包括首次调用 ribbon.MaxAutoRetries=3 #重试负载均衡其他的实例最大重试次数,不包括首次调用 ribbon.MaxAutoRetriesNextServer=3 #是否所有操作都重试 ribbon.OkToRetryonAllOperations=false



