返回
本地微服务之间互相调用,使用feign注解快速搞定
后端
2022-11-08 04:55:19
使用 Feign 实现本地微服务的高效调用
简介
在微服务架构中,各微服务之间的调用至关重要。然而,在本地开发环境中,如果不小心将请求发送到线上环境或其他开发者的机器上,可能会造成不必要的麻烦。为了解决这一问题,我们可以使用自定义注解来实现微服务本地之间的调用。
详细步骤
创建自定义注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnableLocalHostFeign {
String value();
}
这个注解用于标记需要进行本地调用的微服务。
创建规则配置类
@Configuration
public class LocalhostFeignAutoConfiguration {
@Bean
public FeignClientFactoryBean feignClientFactoryBean() {
return new LocalhostFeignClientFactoryBean();
}
private static class LocalhostFeignClientFactoryBean extends FeignClientFactoryBean {
@Override
public Object postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
Map<String, Object> targetMap = beanFactory.getBeansWithAnnotation(EnableLocalHostFeign.class);
for (Map.Entry<String, Object> entry : targetMap.entrySet()) {
Object bean = entry.getValue();
Class<?> beanClass = bean.getClass();
Annotation[] annotations = beanClass.getAnnotations();
for (Annotation annotation : annotations) {
if (annotation instanceof EnableLocalHostFeign) {
EnableLocalHostFeign enableLocalHostFeign = (EnableLocalHostFeign) annotation;
String value = enableLocalHostFeign.value();
String[] kv = value.split("=");
String feignClientName = kv[0];
String url = kv[1];
FeignClient feignClient = Feign.builder().target(Class.forName(feignClientName), url).build();
beanFactory.registerSingleton(feignClientName, feignClient);
}
}
}
return super.postProcessBeanFactory(beanFactory);
}
}
}
这个配置类负责根据自定义注解创建本地调用的 FeignClient Bean。
使用方法
1. 添加注解
在需要进行本地调用的微服务启动类上添加 @EnableLocalHostFeign 注解,并指定参数,格式为:项目名=项目地址。例如:
@SpringBootApplication
@EnableLocalHostFeign(value = "user-service=http://localhost:8081")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2. 使用 FeignClient
在需要调用的微服务接口上添加 @FeignClient 注解,并指定微服务名称。例如:
@FeignClient("user-service")
public interface UserService {
@GetMapping("/user/{id}")
User getUser(@PathVariable("id") Long id);
}
3. 调用微服务
现在,就可以在本地直接调用其他微服务的接口了。
注意事项
- 确保项目名和项目地址正确。
- 确保微服务名称正确。
结语
使用自定义注解来实现本地微服务调用,可以有效避免将请求发送到线上环境或其他开发者的机器上,从而提高开发效率和避免错误。
常见问题解答
-
为什么需要使用自定义注解?
自定义注解可以更加灵活地控制本地调用的配置,并避免与线上环境混淆。
-
如何设置多个本地调用的微服务?
在 @EnableLocalHostFeign 注解中,可以通过分号分隔多个配置,例如:
@EnableLocalHostFeign(value = "user-service=http://localhost:8081;product-service=http://localhost:8082")
-
如何指定本地调用的端口?
在项目地址中指定端口,例如:
@EnableLocalHostFeign(value = "user-service=http://localhost:8081")
-
本地调用时,是否需要网络连接?
本地调用仅在微服务所在机器上进行,无需网络连接。
-
是否可以自定义 FeignClient 的配置?
可以,在 @FeignClient 注解中指定自定义的配置类。