一:Feign解决的问题
一:Feign解决什么问题
Feign旨在是编写Java Http 客户端变得更加容易,Feign简化了RestTemplate代码,实现了Ribbon负载均衡,使代码变得更加简洁,也少了客户端调用的代码,使用Feign实现负载均衡是首选的方案,只需要你创建一个接口,然后在上面添加注解即可。
Feign是申明式服务调用组件,其核心就是:像调用本地方法一样调用远程方法,无感知远程Http请求。
它解决了让开发者调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个Http请求,无需关注与远程的交互细节,更无需关注分布式环境开发。
它像Dubbo一样,Consumer直接调用Provider接口方法,而不需要通过常规的HttpClient构造请求再解析返回数据。
二:Feign vs OpenFeign
OpenFeign是spring Cloud 在Feign的基础上支持了Spring MVC 的注解,如@RequestMapping, @PathVariable等等,OpengFeign的@FeignClient可以解析SpringMVC 的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用服务。
三:Feign的入门案例
①引入Feign的依赖,给服务消费者
②:写接口,并且接口上面写好调用的服务名称,并且接口里面写好方法就,
创建业务层接口,添加@FeignClient注解声明需要调用的服务:这个接口我写在了service-provider的服务里面了
③业务层抽象方法使用SpringMVC 注解配置服务地址及参数(springmvc注解这里是@GetMapping)
这个接口就是要写到我们的service-consumer服务中去,方便我们的consumer去调用这个service-provider服务中的方法
④启动类添加@EnableFeignClient注解激活Feign组件:这个@EnableFeignClient必须写在service-consumer的启动类上面,不然是没法找到的我们调用的接口(自己踩的坑)
测试开始:
四:Feign负载均衡
Feign封装了Ribbon自然也就集成了负载均衡的功能,默认采用轮询策略,如何修改负载均衡策略呢?与我们之前学过的Ribbon时候配置是一置的
①全局:
在启动类或配置类中注入负载均衡策略对象,所有服务请求均使用该策略(这里是随
②局部的:
五:Feign请求参数
注意这个路径的参数书写方式:
①Get 使用@PathVariable 注解或者@RequestParma注解接收请求参数
@RequestParam 和 @PathVariable 注解是用于从request中接收请求的,两个都可以接收参数,关键点不同的是@RequestParam 是从request里面拿取值,而 @PathVariable 是从一个URI模板里面来填充
@RequestParam 支持下面四种参数
defaultValue 如果本次请求没有携带这个参数,或者参数为空,那么就会启用默认值
name 绑定本次参数的名称,要跟URL上面的一样
required 这个参数是不是必须的
value 跟name一样的作用,是name属性的一个别名
@PathVariable
这个注解能够识别URL里面的一个模板,我们看下面的一个URL
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
1
上面的一个url你可以这样写:
@RequestMapping("/hello/{id}") 这里的id就是上面路径的101
public String getDetails(@PathVariable(value="id") String id,
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
}
----------------------------------------------------
②:Post 记住测试post请求的时候我们要用postman进行,因为网页默认是get请求
使用@RequestBody注解接收请求参数
当传入一个参数的时候:
当传入多个参数的时候,用实体接:
②Post请求---只有post请求才会有@requestBody,我们接收的是json数据,可以用json接收,也可以用实体类来接收
@ResponseBody
responseBody表示服务器返回的时候以一种什么样的方式进行返回, 将内容或对象作为 HTTP 响应正文返回,值有很多,一般设定为json
@RequestBody
一般是post请求的时候才会使用这个请求,把参数丢在requestbody里面
@responsebody表示该方法的返回结果直接写入HTTP response body中
*一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response *body中。
*比如异步获取json数据,加上@responsebody后,会直接返回json数据。*