Spring Cloud(五)Feign声明服务调用
上节使用了RestTemplate,但是有时候某个微服务Rest风格请求需要多次调用,如类似上面的通过用户编号(id)查询用户信息的服务。如果多次调用,使用RestTemplate并非那么友好。因为除了要编写URL,还需要注意这些参数的组装和结果的返回等操作。为了克服这些不友好,除了Ribbon外,spring cloud还提供了声明式调用组件——Feign。
服务调用
1、pom包配置
和服务提供者一致
<!-- feign 声明过程调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、启动类
启动类添加@EnableDiscoveryClient
和@EnableFeignClients
注解。
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
@EnableDiscoveryClient
:启用服务注册与发现@EnableFeignClients
:启用feign进行远程调用
Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
4、feign调用实现
定义feign接口
@FeignClient(value = "user",fallback = UserServiceHystirx.class)
public interface UserService {
@GetMapping("/user/{id}")
public UserPo getUser(@PathVariable("id") Long id);
}
- value:远程服务名service id,及spring.application.name配置的名称,它指向了用户微服务,这样Feign就会知道用户微服务的请求,并会实现负载均衡。
此类中的方法和远程服务中contoller中的方法名和参数需保持一致。
5、web层调用远程服务
将HelloRemote注入到controller层,像普通方法一样去调用即可。
@RestController
public class ConsumerController {
@Autowired
HelloRemote HelloRemote;
@RequestMapping("/hello/{name}")
public String index(@PathVariable("name") String name) {
return HelloRemote.hello(name);
}
}
测试
简单调用
不断的进行测试下去会发现两种结果交替出现,说明两个服务中心自动提供了服务均衡负载的功能。如果我们将服务提供者的数量在提高为N个,测试结果一样,请求会自动轮询到每个服务端来处理。
总结
与Ribbon
相比Feign
屏蔽了掉了RestTemplate
的使用,提供了接口声明式的调用,使得程序可读性更高,同时在多次调用中更为方便。