Feign的使用步骤
Feign只需要创建一个接口,然后在上面添加注解即可;
新建microservicecloud-consumer-dept-feign
microservicecloud-consumer-dept-feign工程的pom.xml,主要添加对feign的支持
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.yt.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-consumer-dept-feign</artifactId>
<dependencies>
<dependency><!-- 自己定义的api -->
<groupId>com.yt.springcloud</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency><!-- springboot-web -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 (一修改,自动发布,自动构建)-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- Ribbon相关 (eureka后面没有server的就是客户端,ribbon要跟eureka整合,类似于mysql和java的驱动包)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- feign的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
</project>
修改microservicecloud-api工程的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent><!-- 子类里面显示声明才能有明确的继承表现,无意外就是父类的默认版本否则自己定义 -->
<groupId>com.yt.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-api</artifactId><!-- 当前Module我自己叫什么名字 -->
<dependencies><!-- 当前Module需要用到的jar包,按照自己的需求添加,如果父类已经包含了,可以不用写版本号 -->
<!-- 实体类的自动生成set,get,全参构造方法,toString等等 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- feign的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
</project>
microservicecloud-api工程添加一个DeptClientService接口并新增注解@FeignClient
package com.yt.springcloud.service;
import java.util.List;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.yt.springcloud.entity.Dept;
/**
*
* @Description: 修改microservicecloud-api工程,根据已经有的DeptClientService接口
* 一个实现了FallbackFactory接口的类DeptClientServiceFallbackFactory
* @author zzyy
* @date 2018年4月21日
*/
@FeignClient(value = "MICROSERVICECLOUD-DEPT")//针对于更细粒化的控制,针对哪一个微服务进行面向接口的feign的
//@FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)
public interface DeptClientService
{
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
public Dept get(@PathVariable("id") long id);
@RequestMapping(value = "/dept/list", method = RequestMethod.GET)
public List<Dept> list();
@RequestMapping(value = "/dept/add", method = RequestMethod.POST)
public boolean add(Dept dept);
}
对api公共项目工程maven clean–>maven install
microservicecloud-consumer-dept-feign工程修改Controller,
添加上一步新建的DeptClientService
package com.yt.springcloud.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.yt.springcloud.entity.Dept;
import com.yt.springcloud.service.DeptClientService;
@RestController
public class DeptController_consumer {
@Autowired
private DeptClientService service;
@RequestMapping(value = "/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id)
{
return this.service.get(id);
}
@RequestMapping(value = "/consumer/dept/list")
public List<Dept> list()
{
return this.service.list();
}
@RequestMapping(value = "/consumer/dept/add")
public Object add(Dept dept)
{
return this.service.add(dept);
}
}
microservicecloud-consumer-dept-feign工程修改主启动类
package com.yt.springcloud;
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;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages= {"com.yt.springcloud"})
@ComponentScan("com.yt.springcloud")
public class DeptConsumer80_Feign_App {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer80_Feign_App.class, args);
}
}
测试
先启动3个rureka项目工程,再驱动8001,8002,8003,和feign项目工程
测试路径:http://localhost/consumer/dept/list
如果控制台报了这个异常的话
去feign项目工程的配置类里面加上一个方法
package com.yt.springcloud.cfgbeans;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
@Configuration//其实就是ApplicationContext.xml
public class ConfigBean {
/**
* 注册一个objectMapper覆盖掉默认的,这样就不用在每个类上面使用@jsonIgnoreProperties
* @return
*/
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
}
/**
* RestTemplate提供了多种便捷访问远程Http服务的方法
* 是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集
* @return
*/
@Bean
@LoadBalanced//ribbon是客户端的负载均衡工具,所以在rest去访问微服务的时候,自带负载均衡,这个注解是开启负载均衡的
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
/**
* 自定义负载均衡算法(有7种负载均衡算法)
* 有显示的声明算法,就覆盖默认的轮询算法
* @return
*/
@Bean
public IRule myRule() {
//return new RoundRobinRule();//轮询算法
return new RandomRule();//随机算法
}
}
Feign集成了Ribbon
利用Ribbon维护了microservicecloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用
Feign通过接口的方法,调用Rest服务(之前是Ribbon+RestTemplate)
该请求发送给Eureka服务器(http://MICROSERVICECLOUD-DEPT/dept/list),通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用;
总结
翻译于尚硅谷周阳老师:https://www.bilibili.com/video/av22613028?from=search&seid=11377756339718254280