本章主要内容
之前我们介绍了通过服务网关来调用注册中心的微服务,但是各微服务之间怎样优雅简洁的相互调用呢?下面我们又引入一个新的组件:Feign https://github.com/OpenFeign/feign
Feign是什么?
(使用上注解是@Feign)
Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
OpenFeign又是什么?
(使用上注解是@FeignClient)
OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,
并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
Nacos中心里微服务用OpenFeign进行相互调用
首先我们复制以前的 combat-provider 工程,重命名为 combat-provider-feign
maven依赖中需要新增一个openfeign,pom.xml如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
写一个接口,作为原 combat-provider 中的服务代理!完成后 我们调用 combat-provider-feign中的服务,然后combat-provider-feign请求原先 combat-provider接口进行返回。
package com.zjf.combat.api.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "nacos-provider")
public interface FeignService {
@GetMapping("/config/version")
String version();
}
其中,我们用到了 @FeignClient 注解,说明此接口是需要用Feign组件去调用远程的服务接口。而其中的 name=nacos-provider 则是指向 注册中心中对应服务的名称 (即combat-provider中的application.name)
接着我们在 combat-provider-feign中再写一个控制器,便于外部调用
package com.zjf.combat.api.feign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableFeignClients
public class FeignApi {
@Autowired
private FeignService feignService;
@GetMapping(value = "/config/version")
public String version() {
return feignService.version();
}
}
其中 @EnableFeignClients 表示启用Feign功能,GetMapping中的路径和实际目标微服务combat-provider的接口路径
我们相继启动
注册中心 Nacos(端口8848)、
微服务1 combat-provider(端口9999)、
网关 combat-gateway(端口9000)、
微服务2 combat-provider-feign(端口9997)
Nacos注册中心看到上述服务已上线
测试 微服务2 中通过feign 调用 微服务1
测试 通过网关--->调用微服务2--->调用微服务1