一 Feign介绍
Feign是Netflix开发的声明式、模板化的的http客户端,它可以帮助我们更快捷、优雅地调用HTTP API。
Feign集成了Ribbon,利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
二 FeignClient注解
我们要使用Feign进行远程调用,那就离不开FeignClient注解,我们查看这个注解的源码如下。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface FeignClient {
@AliasFor("name")
String value() default "";
String contextId() default "";
@AliasFor("value")
String name() default "";
/** @deprecated */
@Deprecated
String qualifier() default "";
String[] qualifiers() default {};
String url() default "";
boolean decode404() default false;
Class<?>[] configuration() default {};
Class<?> fallback() default void.class;
Class<?> fallbackFactory() default void.class;
String path() default "";
boolean primary() default true;
}
这里我们就不详细描述这个注解的原理,有需要的小伙伴可以去了解一下,在这里我仅将它的一些基本属性列出,方便大家简单的了解以及使用。
三 搭建service-feign工程
在原先的项目上创建一个新的service-feign工程。
相关文章: SpringCloud(一):Eureka服务注册与发现
SpringCloud(二):Ribbon负载均衡
选中Feign相关组件
创建完成后修改pom文件和配置文件
<!--eureka节点依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--web项目依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
server.port=8064
spring.application.name=service-feign
#使用health端点来代替心跳表明服务是否可用,反应到eureka server ui上服务的UP还是DOWN
eureka.client.healthcheck.enable=true
eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/
启动类上加上@EnableDiscoveryClient
以及@EnableFeignClients
两个注解
四 服务调用
在启动类根目录上创建service包和controller包 如图。
然后我们在service包中创建FeignService接口,并在该接口上加上@FeignClient
的注解,配置value属性对应我们需要调用的服务名称。然后在该接口中添加一个方法,配置@RequstMapping属性,指向我们需要调用的服务中的方法,代码如下。
/**
* @Author: Wxy
* @Description:调用eureka-client服务的接口
* @Date created in 11:57 2021/4/30
*/
@Component
@FeignClient(value = "eureka-client")
public interface FeignService {
/**
* 调用 eureka-client服务的 /sayHello方法
* @param name
* @return
*/
@RequestMapping(value = "/sayHello", method = RequestMethod.GET)
String sayHeiFromClient(@RequestParam("name") String name);
}
简单来说这个sayHeiFromClient方法呢就是调用的eureka-client服务Controller层的/sayHello方法
接口写好后再创建Controller层,代码如下
/**
* @Author: Wxy
* @Description:
* @Date created in 11:45 2021/4/30
*/
@RestController
public class HelloController {
@RequestMapping("/sayHello")
public String hello(@RequestParam String name){
return "hello"+name+":8080";
}
}
代码编写完后进行测试,依次启动eureka-server、eureka-client、eureka-client2、eureka-feign
打开浏览器输入http://localhost:8761/进入注册中心,如图。
启动成功后,打开浏览器输入http://localhost:8064/feignSayHello?name=wxy
执行结果第一次
执行结果第二次
达到此效果,代表我们使用feign进行远程调用并实现负载均衡成功。
过程中如果有小伙伴遇到问题或者有好的见解可以及时联系