Springboot + SpringCloud + Nacos + OpenFeign + Gateway

本文介绍了如何在Springboot应用中整合SpringCloud、Nacos服务发现、OpenFeign进行服务间通信以及使用Gateway作为微服务网关。详细讲解了Nacos的安装与配置,服务的注册与发现,OpenFeign的优势和配置优化,以及Gateway的配置与路由规则设定,包括断言工厂和过滤器的应用。

Springboot + SpringCloud + Nacos + OpenFeign + Gateway

根节点相关依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.8</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2021.0.4.0</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>2021.0.5</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
  1. Nacos下载和安装

官网:https://nacos.io/zh-cn/

从GitHub下载对应版本nacos,版本对应关系:

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

cmd进入nacos/bin/目录

windows启动指令(单机模式):

startup.cmd -m standalone

以集群模式启动:

startup.cmd

停止运行:


下面是一个完整的 **Spring Boot + Spring Cloud + MyBatis + MySQL + Nacos + Redis + Spring Security + Seata** 的微服务部署和调用示例。我们将构建一个包含多个服务的微服务系统,演示服务注册发现、配置中心、数据库访问、服务间调用、事务一致性、安全认证等核心功能。 --- ## 🧱 项目结构(多模块) ``` microservice-seata-demo/ ├── nacos-server/ # Nacos 服务(注册中心 + 配置中心) ├── user-service/ # 用户服务(MyBatis + MySQL + Redis) ├── order-service/ # 订单服务(Feign + Redis + Seata 分布式事务) ├── account-service/ # 账户服务(MySQL + Seata) ├── gateway-service/ # 网关服务(Spring Cloud Gateway) ├── auth-service/ # 认证服务(Spring Security + OAuth2) ``` --- ## ✅ 第一步:搭建 Nacos Server(注册中心 + 配置中心) ### 下载并启动 Nacos ```bash # 下载 Nacos wget https://github.com/alibaba/nacos/releases/download/2.2.3/nacos-server-2.2.3.tar.gz # 解压并启动 tar -zxvf nacos-server-2.2.3.tar.gz cd nacos/bin sh startup.sh -m standalone ``` 访问 Nacos 控制台: ``` http://localhost:8848/nacos 账号密码:nacos/nacos ``` --- ## ✅ 第二步:搭建 Seata Server(分布式事务) ### 下载并启动 Seata ```bash wget https://github.com/seata/seata/releases/download/v1.6.1/seata-server-1.6.1.zip unzip seata-server-1.6.1.zip cd seata/bin sh seata-server.sh -p 8091 -m db ``` ### 配置 Seata 数据库(MySQL) 创建 `seata` 数据库,并导入 SQL 脚本: ```sql -- 创建 seata 数据库 CREATE DATABASE seata; -- 导入建表脚本(来自 seata/conf/db_store.sql) ``` --- ## ✅ 第三步:搭建 user-service(用户服务) ### `pom.xml` ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-j</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>io.lettuce.core</groupId> <artifactId>lettuce-core</artifactId> </dependency> </dependencies> ``` ### `application.yml` ```yaml server: port: 8081 spring: application: name: user-service cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml datasource: url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver redis: host: localhost port: 6379 ``` ### 数据库表 ```sql CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL, `email` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) ); ``` ### `UserController.java` ```java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { return userService.getUserById(id); } } ``` --- ## ✅ 第四步:搭建 order-service(订单服务) ### `pom.xml` ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> </dependencies> ``` ### `application.yml` ```yaml server: port: 8082 spring: application: name: order-service cloud: nacos: discovery: server-addr: localhost:8848 alibaba: seata: tx-service-group: my_tx_group seata: enabled: true registry: type: nacos nacos: server-addr: localhost:8848 application: seata-server service: vgroup-mapping: my_tx_group: default grouplist: default: 127.0.0.1:8091 ``` ### `OrderController.java` ```java @RestController @RequestMapping("/orders") public class OrderController { @Autowired private OrderService orderService; @GetMapping("/create") @GlobalTransactional public String createOrder() { orderService.createOrder(); return "Order created with transaction"; } } ``` --- ## ✅ 第五步:搭建 account-service(账户服务) 与 `order-service` 类似,用于模拟 Seata 的事务参与方。 --- ## ✅ 第六步:搭建 gateway-service(网关服务) ### `pom.xml` ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> ``` ### `application.yml` ```yaml server: port: 8080 spring: application: name: gateway-service cloud: gateway: discovery: locator: enabled: true nacos: discovery: server-addr: localhost:8848 ``` --- ## ✅ 第七步:搭建 auth-service(认证服务) 使用 Spring Security + OAuth2 实现认证授权。 ### `pom.xml` ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-resource-server</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-client</artifactId> </dependency> ``` ### `SecurityConfig.java` ```java @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .oauth2Login(); return http.build(); } } ``` --- ## 🚀 启动顺序 1. 启动 `nacos-server` 2. 启动 `seata-server` 3. 启动 `user-service` 4. 启动 `account-service` 5. 启动 `order-service` 6. 启动 `gateway-service` 7. 启动 `auth-service` --- ## 📡 测试服务调用 - **访问用户服务**(通过网关): ``` GET http://localhost:8080/user-service/users/1 ``` - **创建订单(带分布式事务)**: ``` GET http://localhost:8080/order-service/orders/create ``` --- ## ✅ 示例 Dockerfile(适用于任意服务) ```Dockerfile FROM openjdk:17-jdk-slim COPY target/*.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"] ``` --- ## ✅ 示例 docker-compose.yml ```yaml version: '3.8' services: nacos: image: nacos/nacos-server:v2.2.3 container_name: nacos ports: - "8848:8848" environment: MODE: standalone seata: image: seataio/seata-server:1.6.1 container_name: seata ports: - "8091:8091" environment: SEATA_PORT: 8091 user-service: build: ./user-service ports: - "8081:8081" order-service: build: ./order-service ports: - "8082:8082" gateway-service: build: ./gateway-service ports: - "8080:8080" ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值