Feign是springcloud里面的一个功能组件,那么它是实现一个什么功能呢?
首先我们可以先从字面意思上去理解一下它,Feign,英文翻译过来就是伪装的意思,实际上它的功能也是和伪装相关的,在我们之前在客户端配置的时候,不知道大家还记不记得我们是用RestTemplate去配置的,但是配置这个RestTemplate的时候,我们是调用了它里面的一个方法,并且把url,id还有class传进去的,但是这样做是不是太麻烦了,而且还会暴露地址,所以我们就可以使用Feign这个功能来帮助我们,Feign是可以对我们的RestTemplate里面的url地址进行伪装,
那我们该如何配置这个Feign呢?
首先老样子,我们在配置springcloud任何一个组件的时候,不要忘了三个步骤:
1.配置启动器
2.覆盖配置
3.添加到引导类
这三个步骤是无论你在springcloud里面配置哪个配置都是需要这三个步骤的
首先我们需要在客户端配置上下面的依赖:
为什么要在客户端配置呢,因为RestTemplate在客户端进行配置的,我们的目的是隐藏RestTemplate的配置并且隐藏其url地址。
配置完启动类,我们就可以来看看第二步了,添加配置,可是配置Feign并不需要在yml里面添加一些配置,所以第二步我们可以直接省略了
然后我们来看看第三步,也就是在引导类中加上配置
这里有两点需要注意的地方,第一点就是在引导类最外层方法中添加注解@EnableFeignClients,这个注解的作用就是启动Feign客户端组件的意思,也就是配置上后,就可以启动Feign,而且在Fegin这个注解里面,包含了RestTemplate方法,因此在下面红框圈住的RestTemplate方法我们也不需要配置了,它会自动生成的。
因此,在controller里面封装的RestTemplate方法也是不需要了,可以去掉了
然而,相当于全部方法都要注释掉
这些全部都可以注释掉了,为什么要把这些注释掉呢,等会我们再来说说
我们需要另外添加一个接口,是Feign的接口,这个接口可以随时被调用,我们建立了这个接口后,还需要打上注解
注解里面的括号写的是服务端的微服务id,也就是他们的程序名,为什么要写这个呢,因为Feign的功能就是取代RestTemplate的功能的,所以Feign可以通过这种方式去获取服务端的地址信息之类的一切信息,那我们应该在Feign的这个接口里面调用什么方法呢?
我们应该调用服务端的controller的方法:
但是我们调用的话又不能直接整个复制过去,因为我们的Feign是一个接口类,接口类是不可以写方法的,只能写方法名和传入参数,因此我们只能这么写
要注意的是,服务端那边不是有个RequestMapping的全局方法路径吗,也就是服务端的controller方法的最外层有个RequestMapping的全局路径地址,我们也需要在Feign的方法里面写上这个地址,但是我们不可以在Feign的这个接口的最外层方法上加上RequestMapping的注解,因为这个毕竟是个接口又不是controller,所以我们只能在它里面的方法上加上GetMapping然后把传入地址user和占位符{id}用斜号隔开
这里还是注意上面的细节,就是这个接口里面的方法是没有执行方法的。
最后,我们把它注入进来客户端的controller里面就可以使用了
你在外面写好的方法,最终还是要加回到controller这里来,因为客户端在网页上输入的网址是直接访问到你的controller的,只要你把相关方法都写到controller里面去,客户一通过网页去访问你的RequestMapping地址,就可以实现你的方法了,所以你的方法一定要放在controller里面去。
因此,下面我们的方法是可以写了
这里是我们客户端的controller方法,我们可以直接返回this.userClient里面写好的方法,也就是我们刚刚写好的方法,并且传入id,但是为什么最后我们要写一个toString方法,因为我们的UserClient接口类里面的那个queryUserById方法的返回值类型是User,然后这个客户端里面的controller方法也就上图的这个方法返回值是String,如果想要完成返回值,我们要把这个return的方法值改成toString的,这样就可以顺利被返回了。
重启一下客户端,并且访问后,我们可以得到这个
访问成功
然后我们来说一下上面说到了为什么要把Ribbon这个注释去掉的问题是吧?(Ribbon的注释就是LoadBalenced)因为我们的Feign的包里面就包含了Ribbon的包
但是为什么是灰色的呢,因为我们在eureka的包里面是已经有包含了ribbon的包,两个包造成了重复,所以显示是灰色的。
然后上面还有我们把Hystrix也注释掉了,是因为Feign对Hystrix也集成了,在包里面有引入,但是需要注意的一点就是,Feign引入Hystrix后默认是不会自动熔断的,需要你去开启它才会自动去熔断,这就需要你自己去yml文件里面去配置。
我们开启熔断方法,不仅仅是导入包和在yml文件中配置,而且还有个关键步骤要去做,就是指定一个熔断类方法并且告诉这个方法哪些方法需要熔断,因此我们就要进行配置这个方法:
因此,我们要在同样的包里面建立一个实现类,然后点击实现它的方法,但是为什么我们的返回值要是User呢,因为接口里面的方法返回值就是User,之前我们也说过,你要熔断的方法的返回值是什么,我们就需要和它一样,所以我们可以new一个User对象(方便返回),然后通过setUserName把服务降级的语句传进去,再返回出来
我们写完了这个实现类后,是不是需要告诉那个接口我们这个实现类方法是一个熔断方法,让他们两个方法之间产生联系呀,所以,我们需要在接口方法那里配置上注解,让它知道这个是个熔断方法
又回过头来看看这个实现类方法,是不是没有注入Spring容器里面呀,如果没有注入到容器里面的话,你这个方法还是用不了的,所以需要加上这个注解
制造一个异常,然后运行
服务降级成功