Spring Cloud(五)Feign声明服务调用

版权声明:From Lay https://blog.csdn.net/Sadlay/article/details/84789233

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的使用,提供了接口声明式的调用,使得程序可读性更高,同时在多次调用中更为方便。

猜你喜欢

转载自blog.csdn.net/Sadlay/article/details/84789233