上期我们讲了SpringCloud中Ribbon负载均衡.学会了现实中一个非常实用的技能.有兴趣的同学可以看一下.
SpringCloud 连载(四) : Ribbon负载均衡与自定义算法
Feign:
1:Feign是什么?
2:如何使用?
Feign主要用于客户端调用WebService接口,让调用接口变的像调用对象的方法一样简单。
比如:
创建一个公共的common组件,在里面写一个接口,声明几个方法,然后让服务端去实现这个接口,同时把这个接口打成的jar丢给客户端的工程师调用,工程师通过Spring Autowired去把这个对象取出来,就可以直接调用服务端实现的方法,有点像gRpc技术.
通过SpringCoud的封装使其支持springMVC注解与
HttpMessageConerters,他可以与Eureka和Ribbon配合使用以支持负载均衡.
通俗的说:
Fegin是一个声明式的Web服务客户端,使得开发web客户端变的更加简单.
使用:只需要创建一个接口,然后在上面添加注解就可以了。
以往使用调用Rest Api:
之前我们使用Ribbon+RestTemlate对Http进行请求封装访问,我们需要写入服务的地址等信息,实际开发中会有很多微服务接口,我们就得定义好多微服务的地址.Fegin在这些的基础上做了一些优化,使得我们在使用的时候,像声明一个 Service一样直接调用接口的方法.
第一步:新创建一个模块;
名称:msc-consumer-department-80-feign
内容与msc-consumer-department-80相同;
pom档加入fegin的GAV配置;
12<dependency>3 <groupId>org.springframework.cloudgroupId>4 <artifactId>spring-cloud-starter-feignartifactId>5dependency>6
第二步:在msc-api的pom.xml中加入对feign的支持
因为有可能其他模块也要调用,所以我们把这个类放在一个公共的模块中.
在msc-api的pom.xml中加入对feign的支持
第三步:在msc-api模块中创建一个接口类;
注意:
1:里面的方法和Server端Controller里面方法相同.(可不同)
2:每个方法的RequestMapping一定要与Server端Controller里面的注解相同(路径保持一致)
3:添加注解@FeignClient(value = "MSC-DEPARTMENT")参数就是Eureka中注册部门Server的实例名称
** 这个类可以看作是Server端Controller类的一个接口。
1package com.xiaobaibi.webservice; 2 3import com.xiaobaibi.bean.Department; 4import org.springframework.cloud.netflix.feign.FeignClient; 5import org.springframework.web.bind.annotation.PathVariable; 6import org.springframework.web.bind.annotation.*; 7 8import java.util.List; 910// 开启Feign,并告诉服务我指向的是Eureka中的哪个微服务11@FeignClient(value = "MSC-DEPARTMENT")12public interface DeparmentWebService {1314 /**15 * 新增部门16 * @param department17 * @return18 */19 @PostMapping(value = "/department/insert")20 public boolean insertDept(Department department);21 /**22 * 根据 ID 查询23 * @return24 */25 @GetMapping(value = "/department/get/{dId}")26 public Department getDepartmentById(@PathVariable("dId") Long dId);2728 /**29 * 全查30 * @return31 */32 @GetMapping(value = "/department/list")33 public List list();34}
第五步:在客户端的主启动类中加入注解,参数传入第四步接口的包名;
1@EnableFeignClients(basePackages = {"com.xiaobaibi.webservice"})
该注解用于让Spring将这个类注入到容器中.
注意:这个一定要在客户端,就是启用Rest API的模块;
1package com.xiaobaibi.consumer; 2 3import org.springframework.boot.SpringApplication; 4import org.springframework.boot.autoconfigure.SpringBootApplication; 5import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 6import org.springframework.cloud.netflix.feign.EnableFeignClients; 7 8@SpringBootApplication 9@EnableEurekaClient10// 对部门微服务加负载均衡自定义算法11@EnableFeignClients(basePackages = {"com.xiaobaibi.webservice"})12public class MscConsumerApplication_Feign {1314 public static void main(String[] args) {15 SpringApplication.run(MscConsumerApplication_Feign.class,args);16 }17}
第六步:客户端Controller调用;
之前我们是通过RestTemplete输入Rest地址,现在我们把第四步创建的接口当做一个Service直接声明调用就可以了,同其他的Service一样直接Autowired即可。
1/**2 * Feign方式的 Service3 */4@Autowired5private DeparmentWebService deparmentWebService;
1@RestController 2@RequestMapping(value = "/consumer") 3public class DepartConsumerController { 4 /** 5 * Feign方式的 Service 6 */ 7 @Autowired 8 private DeparmentWebService deparmentWebService; 910 /**11 * 新增部门12 * @param department13 * @return14 */15 @RequestMapping(value = "/insert")16 public boolean insertDept(Department department){17 return deparmentWebService.insertDept(department);18 }19 /**20 * 根据 ID 查询21 * @return22 */23 @RequestMapping(value = "/get/{dId}")24 public Department getDepartmentById(@PathVariable("dId") Long dId){25 return deparmentWebService.getDepartmentById(dId);26 }2728 /**29 * 全查30 * @return31 */32 @RequestMapping(value = "/list")33 public List list(){34 return deparmentWebService.list();35 }36}
如此即可,我们相当于创建一个接口,这个接口可以看作是Server端Controller的接口,之后加入Feign的注解后,在调用的地方直接创建一个service进行调用,非常的方便,另外,该技术自带Ribbon负载均衡功能(默认轮洵)
公众号回复
[ scdemo] : 本期Demo程式;
[ 2021] : SpringCloud视频地址.
[sbsw] :小编所用的JDK,Maven,IDEA.
[mysql] 或 [mysql.exe]获取mysql的安装包与安装教程.
原创不易,点个赞分享出去吧.感谢支持.