上期回顾
上期我们讲了SpringCloud中Ribbon负载均衡.学会了现实中一个非常实用的技能.有兴趣的同学可以看一下.
SpringCloud 连载(四) : Ribbon负载均衡与自定义算法
本期内容
Feign:
1:Feign是什么?
2:如何使用?
Feign是什么
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配置;
<!--Feign 开始-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!--Feign 结束-->
第二步:在msc-api的pom.xml中加入对feign的支持
因为有可能其他模块也要调用,所以我们把这个类放在一个公共的模块中.
在msc-api的pom.xml中加入对feign的支持
<!--Feign 开始-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!--Feign 结束-->
第三步:在msc-api模块中创建一个接口类;
注意:
1:里面的方法和Server端Controller里面方法相同.(可不同)
2:每个方法的RequestMapping一定要与Server端Controller里面的注解相同(路径保持一致)
3:添加注解@FeignClient(value = "MSC-DEPARTMENT")参数就是Eureka中注册部门Server的实例名称
** 这个类可以看作是Server端Controller类的一个接口。
请输入标题
package com.xiaobaibi.webservice;
import com.xiaobaibi.bean.Department;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.*;
import java.util.List;
// 开启Feign,并告诉服务我指向的是Eureka中的哪个微服务
@FeignClient(value = "MSC-DEPARTMENT")
public interface DeparmentWebService {
/**
* 新增部门
* @param department
* @return
*/
@PostMapping(value = "/department/insert")
public boolean insertDept(Department department);
/**
* 根据 ID 查询
* @return
*/
@GetMapping(value = "/department/get/{dId}")
public Department getDepartmentById(@PathVariable("dId") Long dId);
/**
* 全查
* @return
*/
@GetMapping(value = "/department/list")
public List<Department> list();
}
第五步:在客户端的主启动类中加入注解,参数传入第四步接口的包名;
@EnableFeignClients(basePackages = {"com.xiaobaibi.webservice"})
该注解用于让Spring将这个类注入到容器中.
注意:这个一定要在客户端,就是启用Rest API的模块;
package com.xiaobaibi.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
@SpringBootApplication
@EnableEurekaClient
// 对部门微服务加负载均衡自定义算法
@EnableFeignClients(basePackages = {"com.xiaobaibi.webservice"})
public class MscConsumerApplication_Feign {
public static void main(String[] args) {
SpringApplication.run(MscConsumerApplication_Feign.class,args);
}
}
第六步:客户端Controller调用;
之前我们是通过RestTemplete输入Rest地址,现在我们把第四步创建的接口当做一个Service直接声明调用就可以了,同其他的Service一样直接Autowired即可。
/**
* Feign方式的 Service
*/
@Autowired
private DeparmentWebService deparmentWebService;
@RestController
@RequestMapping(value = "/consumer")
public class DepartConsumerController {
/**
* Feign方式的 Service
*/
@Autowired
private DeparmentWebService deparmentWebService;
/**
* 新增部门
* @param department
* @return
*/
@RequestMapping(value = "/insert")
public boolean insertDept(Department department){
return deparmentWebService.insertDept(department);
}
/**
* 根据 ID 查询
* @return
*/
@RequestMapping(value = "/get/{dId}")
public Department getDepartmentById(@PathVariable("dId") Long dId){
return deparmentWebService.getDepartmentById(dId);
}
/**
* 全查
* @return
*/
@RequestMapping(value = "/list")
public List<Department> list(){
return deparmentWebService.list();
}
}
总结
如此即可,我们相当于创建一个接口,这个接口可以看作是Server端Controller的接口,之后加入Feign的注解后,在调用的地方直接创建一个service进行调用,非常的方便,另外,该技术自带Ribbon负载均衡功能(默认轮询)