Feign
一: 在spring cloud 中使用Feign
Feign 采用的是基于接口的注解
Feign 整合了ribbon,具有负载均衡的能力
整合了Hystrix,具有熔断的能力
Spring cloud中对Feign进行了封装,测试案例三个
- spring -feign-server:Eureka服务器项目,8761
- spring-feign-provider:服务提供者,需要将服务注册到8761上,提供两个端口号8080、8081
- “/person/{personId}”
- “/hello”服务
- spring-feign-invoker:服务调用者,9000.。调用上面的服务
1.1 服务调用者(spring-feign-invoker)
1.1.1 添加依赖项(invoker项目)
<!-- SpringCloud 整合 Feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
1.1.2 启动类添加feign(invoker项目)
利用@EnableFeignClients//调用者启动时,打开Feign开关
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients//调用者启动时,打开Feign开关
public class MySpringFeignInvoker {
public static void main(String[] args) {
SpringApplication.run(MySpringFeignInvoker.class, args);
}
}
1.1.3 编写客户端接口(invoker项目)
/**
* 客户端服务接口
*
* 与单独使用Feign不同:
* 1.接口需要使用@FeignClient注解修饰
* 2.声明需要调用的服务名称
*/
@FeignClient("atm-spring-feign-provider")
public interface PersonClient {
/**
* 之前得知:
* 通过编写"翻译器"(Contract),可以让Feign知道第三方注解的含义
* 同样,SpringCloud也提供了翻译器,会将注解告诉Feign
* 因此,接口可以直接使用该注解
* 默认支持注解:@RequestMapping、@RequestParam、@RequestParam、@PathVariable
* 【注意】使用了SpringCloud的翻译器后,将不能再使用Feign的默认注解
*/
@GetMapping("/hello")
//@RequestMapping(method=RequestMethod.GET,value="/hello")
String sayHello();
@RequestMapping(method=RequestMethod.GET,value="/hello/{name}")
String hello(@PathVariable("name") String name);
}
与单独使用Feign不同之处:
- 使用@FeignClient注解,指定访问的服务端(服务提供者spring -feign-provider)
- 使用第三方注解,spring cloud的内置“翻译器”(Contract)翻译成Feign能理解的含义
* @RequestMapping
* @PathVariable
* @RequestParam
* @RequestParam
1.1.4 控制器测试类(invoker项目)
@RestController
@Configuration
public class MyInvokerController {
//在控制器中调用接口方法 ---start
@Autowired
private PersonClient personClient;
@RequestMapping(value="/invokeHello",method=RequestMethod.GET)
public String invokeHello(){
return personClient.sayHello();
}
//在控制器中调用接口方法 ---end
}
- 启动spring_feign_server(8761端口)
- 启动spring_feign_provider(8080端口、8081端口)
- 启动spring_feign_invoker(9000端口)
浏览器访问http://localhost:9000/invokerHello可以发现:服务提供者的“/hello”被调用
按顺序依次启动三个项目,在浏览器中输入:http://localhost:9000/invokerHello,可以看到服务被调用。
1.2 Feign负载均衡
- spring cloud实现的Feign客户端,类名为LoadBalanceFeignClient,
- 在该类中,维护着与SpringClientFactoey相关的实例,通过SpringClientFactory可以获得负载均衡器
- Feign 采用的是基于接口的注解
- Feign 整合了ribbon,具有负载均衡的能力
- 整合了Hystrix,具有熔断的能力
项目背景:
- 一个Eureka服务端
- 两个服务提供者,名称一致(spring-feign-provider)
* 端口号不一致 8080/8011 - 一个服务调用者,spring -feign-invoker
1.2.1 服务调用端接口
/**
* 客户端服务接口
*
* 与单独使用Feign不同:
* 1.接口需要使用@FeignClient注解修饰
* 2.声明需要调用的服务名称
*/
@FeignClient("spring-feign-provider")
public interface PersonClient {
@RequestMapping(method = RequestMethod.GET, value = "/person/{personId}")
Person getPerson(@PathVariable("personId") Integer personId);
}
1.2.2 控制端测试
@RestController
@Configuration
public class MyInvokerController {
@RequestMapping(value = "/router", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public String router() {
// 调用服务提供者的接口
Person p = personClient.getPerson(2);
return p.getName();
}
}
运行的结果,将循环访问8080和8081,实现负载均衡的功能。