返回

本地微服务之间互相调用,使用feign注解快速搞定

后端

使用 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. 调用微服务

现在,就可以在本地直接调用其他微服务的接口了。

注意事项

  • 确保项目名和项目地址正确。
  • 确保微服务名称正确。

结语

使用自定义注解来实现本地微服务调用,可以有效避免将请求发送到线上环境或其他开发者的机器上,从而提高开发效率和避免错误。

常见问题解答

  1. 为什么需要使用自定义注解?

    自定义注解可以更加灵活地控制本地调用的配置,并避免与线上环境混淆。

  2. 如何设置多个本地调用的微服务?

    在 @EnableLocalHostFeign 注解中,可以通过分号分隔多个配置,例如:

    @EnableLocalHostFeign(value = "user-service=http://localhost:8081;product-service=http://localhost:8082")
    
  3. 如何指定本地调用的端口?

    在项目地址中指定端口,例如:

    @EnableLocalHostFeign(value = "user-service=http://localhost:8081")
    
  4. 本地调用时,是否需要网络连接?

    本地调用仅在微服务所在机器上进行,无需网络连接。

  5. 是否可以自定义 FeignClient 的配置?

    可以,在 @FeignClient 注解中指定自定义的配置类。