spring-cloud微服务部署转单体部署-feign直连调用

场景

接前一篇《spring-cloud微服务部署-feign服务间调用》,有时候需要单体整包部署,新建一个模块mono,这里面只需要写一个启动类,然后service-a和service-b里面的bean都是一起扫描启动了,就是一个单体项目了,但是之前定义了feign接口,里面service-a调用了service-b的hello方法,这个时候需要做一些处理,否则feign调用不到方法,需要使用本地直连的方式改造,不改动项目之前的架构,只需通过application.yml里面的配置,就可以同时支持微服务单独部署或者单体整包部署。

单体模块

在pom.xml中引入依赖:

xml 复制代码
 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>com.smant.xhappy</groupId>
            <artifactId>service-a</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.smant.xhappy</groupId>
            <artifactId>service-b</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.smant.xhappy</groupId>
            <artifactId>service-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>
</dependencies>

写一个启动类,可以看到在@ComponentScan注解配置了excludeFilters,这里面配置了排除@MonoExclude这个注解标记的bean:

java 复制代码
@EnableFeignClients("com.smant.xhappy.api")
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, 
classes = MonoExclude.class))
@SpringBootApplication(scanBasePackages = "com.smant.xhappy")
public class MonoApp {

    public static void main(String[] args) {

        System.out.println("MonoApp.......................");

        SpringApplication.run(MonoApp.class, args);
    }
}

排除service-a和service-b里面的启动类(如果不排除,feign重复定义接口会报错),这里使用注解的方式排除:

在上一篇可能看到这个注解,加上这个注解以后,希望springboot在扫描的时候不要扫描进去。

java 复制代码
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MonoExclude {

    String value() default "";
}

修改feign接口定义,指定url,当url写了地址,则feign会直接请求这个地址,不会经过注册中心了;如果url没有配置,则会通过nacos注册中心查找服务的url。
这个时候原来feign的调用实际上就是本地接口调用本地的另一个接口,微服务部署时是一个地址的接口调用另一个地址的接口。虽然这种方式比纯单体项目多绕了一次,纯单体项目直接注入service,然后调用方法就可以了,但是为了兼容两种模式,总得有个取舍,本地发一次http调用几乎对性能没什么影响,想想微服务调用的时候,不同地址之间发请求都可以接受。

在application.yml加入配置:

bash 复制代码
server:
  port: 8888
spring:
  application:
    name: mono
  cloud:
    nacos:
      discovery:
        enabled: false
logging:
  level:
    root: INFO

serviceb:
  url: http://localhost:8888

总结

在单体部署的时候,由于之前是微服务的架构,为了不改变原来的微服务架构,引入一个新的单体模块用来单体部署。虽然这个时候所有的bean都在一起启动了,但是原来service-a里面通过feign调用service-b的接口的逻辑并没有修改,如果是纯单体项目,直接注入service-b里面写service就直接调用方法了,但是为了不破坏原来的微服务结构,不改动其他模块代码的情况下,就可以通过feign框架的调用逻辑来处理。
只需要在feign定义接口的时候,通过配置url参数,在单体的时候配置url,feign直连url发请求;微服务的时候不需要配置url,feign通过nacos获取url然后发请求。

相关推荐
MrSYJ2 分钟前
为什么HttpSecurity会初始化创建两次
java·后端·程序员
hinotoyk8 分钟前
TimeUnit源码分享
java
AAA修煤气灶刘哥1 小时前
Java+AI 驱动的体检报告智能解析:从 PDF 提取到数据落地全指南
java·人工智能·后端
wxy3191 小时前
嵌入式LINUX——————TCP并发服务器
java·linux·网络
★YUI★1 小时前
学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17
java·学习·游戏·unity·c#
微小的xx1 小时前
java + html 图片点击文字验证码
java·python·html
mask哥2 小时前
详解flink java基础(一)
java·大数据·微服务·flink·实时计算·领域驱动
克拉克盖博2 小时前
chapter03_Bean的实例化与策略模式
java·spring·策略模式
创码小奇客2 小时前
架构师私藏:SpringBoot 集成 Hera,让日志查看从 “找罪证” 变 “查答案”
spring boot·spring cloud·trae
DashVector2 小时前
如何通过Java SDK分组检索Doc
java·数据库·面试