news 2026/7/15 21:11:03

关于微服务基本框架搭建--fegin最小使用demo

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关于微服务基本框架搭建--fegin最小使用demo

1. 整体目录结构

microservice-demo(父工程) ├── pom.xml(父POM,管理版本) ├── common(公共模块) │ ├── pom.xml │ └── src/main/java/com/demo/common/ │ ├── dto/User.java │ └── api/UserApi.java ├── service-b(服务提供方,端口8081) │ ├── pom.xml │ ├── src/main/java/com/demo/serviceb/ │ │ ├── ServiceBApplication.java │ │ └── controller/UserController.java │ └── src/main/resources/application.yml └── service-a(服务调用方,端口8080) ├── pom.xml ├── src/main/java/com/demo/servicea/ │ ├── ServiceAApplication.java │ └── controller/OrderController.java └── src/main/resources/application.yml

2. 父工程 pom.xml(根目录)

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.demo</groupId><artifactId>microservice-demo</artifactId><version>1.0.0</version><packaging>pom</packaging><!-- 引入 Spring Boot 父依赖,统一版本 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.14</version><relativePath/></parent><!-- 管理 Spring Cloud 版本 --><properties><java.version>8</java.version><spring-cloud.version>2021.0.8</spring-cloud.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><modules><module>common</module><module>service-b</module><module>service-a</module></modules></project>

3. common 模块(定义 API 契约)

common/pom.xml

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>microservice-demo</artifactId><groupId>com.demo</groupId><version>1.0.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>common</artifactId><dependencies><!-- 必备:包含 @FeignClient 注解 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- 必备:包含 @GetMapping, @PathVariable 等注解 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 为了少写 getter/setter,引入 Lombok(可选) --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies></project>

common/src/main/java/com/demo/common/dto/User.java

packagecom.demo.common.dto;importlombok.Data;@Data// 自动生成 getter/setter/toStringpublicclassUser{privateLongid;privateStringname;privateStringemail;}

common/src/main/java/com/demo/common/api/UserApi.java

packagecom.demo.common.api;importcom.demo.common.dto.User;importorg.springframework.cloud.openfeign.FeignClient;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;// name = "service-b" 对应 B 服务的 spring.application.name// path = "/api" 统一前缀,方便 B 服务统一管理// 这里暂时写死 url,方便不接注册中心直接运行(接入注册中心时删掉 url 即可)@FeignClient(name="service-b",url="http://localhost:8081",path="/api")publicinterfaceUserApi{@GetMapping("/users/{id}")UsergetUserById(@PathVariable("id")Longid);}

4. service-b 模块(服务提供方,实现接口)

service-b/pom.xml

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>microservice-demo</artifactId><groupId>com.demo</groupId><version>1.0.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>service-b</artifactId><dependencies><!-- 依赖 common 模块 --><dependency><groupId>com.demo</groupId><artifactId>common</artifactId><version>1.0.0</version></dependency><!-- web 容器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>

service-b/src/main/resources/application.yml

server:port:8081spring:application:name:service-b# 必须和 @FeignClient(name = "service-b") 保持一致

service-b/src/main/java/com/demo/serviceb/ServiceBApplication.java

packagecom.demo.serviceb;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication// 重点注意:B 服务是提供方,这里绝对不能加 @EnableFeignClientspublicclassServiceBApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ServiceBApplication.class,args);}}

service-b/src/main/java/com/demo/serviceb/controller/UserController.java

packagecom.demo.serviceb.controller;importcom.demo.common.api.UserApi;importcom.demo.common.dto.User;importorg.springframework.web.bind.annotation.RestController;@RestController// 关键点:实现 common 中定义的接口,自动继承 @GetMapping 路径publicclassUserControllerimplementsUserApi{@OverridepublicUsergetUserById(Longid){// 模拟数据库查询,返回假数据Useruser=newUser();user.setId(id);user.setName("张三(来自B服务)");user.setEmail("zhangsan@service-b.com");returnuser;}}

5. service-a 模块(服务调用方,使用 Feign)

service-a/pom.xml

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>microservice-demo</artifactId><groupId>com.demo</groupId><version>1.0.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>service-a</artifactId><dependencies><!-- 依赖 common 模块 --><dependency><groupId>com.demo</groupId><artifactId>common</artifactId><version>1.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>

service-a/src/main/resources/application.yml

server:port:8080spring:application:name:service-a

service-a/src/main/java/com/demo/servicea/ServiceAApplication.java

packagecom.demo.servicea;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication// 必须加此注解,并指定扫描 common 模块中 Feign 接口所在的包@EnableFeignClients(basePackages="com.demo.common.api")publicclassServiceAApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ServiceAApplication.class,args);}}

service-a/src/main/java/com/demo/servicea/controller/OrderController.java

packagecom.demo.servicea.controller;importcom.demo.common.api.UserApi;importcom.demo.common.dto.User;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassOrderController{@AutowiredprivateUserApiuserApi;// 直接注入 common 里的接口@GetMapping("/order/{id}/user")publicUsergetOrderUser(@PathVariable("id")Longid){// 看上去像本地调用,实际上发起了 HTTP 请求给 service-breturnuserApi.getUserById(id);}}

6. 运行测试

  1. 先启动 service-b(右键运行ServiceBApplication.main),控制台看到Started ServiceBApplication on port 8081
  2. 再启动 service-a(右键运行ServiceAApplication.main),控制台看到Started ServiceAApplication on port 8080
  3. 打开浏览器或 Postman,访问:http://localhost:8080/order/123/user

返回结果(JSON):

{"id":123,"name":"张三(来自B服务)","email":"zhangsan@service-b.com"}

7. 特别提示(再强调一遍)

检查项说明
B 服务启动类绝对不要@EnableFeignClients,否则它会尝试把自己注册成 Feign 客户端而报错。
A 服务启动类必须@EnableFeignClients(basePackages = "com.demo.common.api"),否则UserApi无法被注入(报NoSuchBeanDefinitionException)。
common 依赖如果common模块打包报错,记得先mvn clean install安装到本地仓库,再启动 A 和 B。
路径一致性B 服务的UserController由于实现了接口,不要再写@RequestMapping在类上,否则路径会变成双份(如/api/api/users)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 21:10:50

AI 辅助设计规范检查:自动验证间距、字号与颜色的一致性

AI 辅助设计规范检查&#xff1a;自动验证间距、字号与颜色的一致性 一、那个用 13px 字号的表单和用 14px 的侧边栏——没人注意到&#xff0c;直到审计那天 一个后台管理系统的"设计一致性审计"发现了一个让人脸红的数字&#xff1a;全站 270 个页面中&#xff0c;…

作者头像 李华
网站建设 2026/7/15 21:08:20

Mac Mini部署多AI智能体:模型选择与资源分配实战指南

如果你也想过用一台入门级设备跑起多个 AI 智能体&#xff0c;让它们帮你自动处理任务&#xff0c;那 Mac Mini 确实是个不错的选择。它功耗低、体积小&#xff0c;适合 7x24 小时开机&#xff0c;但能不能稳定跑起 4 个 AI 员工&#xff0c;关键不在硬件本身&#xff0c;而在你…

作者头像 李华
网站建设 2026/7/15 21:07:32

现代C++ TOML解析器toml++:从使用到贡献代码的完整指南

1. 项目概述&#xff1a;为什么我们需要一个现代的C TOML解析器&#xff1f;如果你最近在折腾C项目&#xff0c;尤其是那些需要配置文件的项目&#xff0c;大概率已经对INI、JSON、XML这些格式感到厌倦了。INI太简单&#xff0c;缺乏层次和类型&#xff1b;JSON虽然流行&#x…

作者头像 李华
网站建设 2026/7/15 21:04:55

RTX5090 32G 八卡算力集群技术特性与全行业落地应用场景详解

在当前AI大模型与多模态技术高速迭代的背景下&#xff0c;中端旗舰多卡算力集群凭借高性价比、高并行算力、灵活部署的优势&#xff0c;成为科研与企业研发的核心算力选型方案。RTX5090-32G作为新一代消费级旗舰算力卡&#xff0c;单卡超大显存、强劲CUDA算力适配绝大多数中小规…

作者头像 李华
网站建设 2026/7/15 21:03:10

盘锦瑜伽馆报名,先看课程和老师

盘锦瑜伽馆报名前&#xff0c;先看课程和老师&#xff0c;比单纯看价格、装修更重要。因为真正影响你能不能坚持、练得是否舒服、动作是否安全的&#xff0c;不是“课表看起来多”&#xff0c;而是课程强度是否适合你&#xff0c;老师能不能观察动作细节&#xff0c;课堂人数会…

作者头像 李华
网站建设 2026/7/15 21:01:53

龙卷风EF等级系统详解:从EF0到EF5的破坏特征与风速范围

这次我们来快速了解龙卷风的强度等级系统。龙卷风作为自然界最具破坏力的天气现象之一&#xff0c;其强度分级直接关系到预警发布、灾害评估和防护措施。掌握这套分级标准&#xff0c;不仅能帮助我们在面对极端天气时做出正确判断&#xff0c;还能更好地理解气象部门的预警信息…

作者头像 李华