信息发布→ 登录 注册 退出

教你创建springcloud微服务的基础子服务的超详细过程

发布时间:2026-01-11

点击量:
目录
  • 一、创建父项目
    • 1. 选择Spring Initializr
    • 2. Type选择为Maven POM,Java Version选择为8
    • 3. 勾选一些基本的依赖,如lombok和spring-boot-starter-web
    • 4. 创建好了的父项目结构如下:
  • 二、创建二级项目
    • 1. 选择新建Module
    • 2. 选择Maven
    • 3. 填写Name
    • 4. 修改openfeign pom.xml文件,并删除掉该项目下的src文件
    • 5. 创建完成的项目结构如下
  • 三、创建子项目feign-provider、feign-consumer、feign-api
    • 1. 在feign-provider项目上新建模块
    • 2. 选择Parent为openfeign-stu
    • 3. 同上步骤创建feign-consumer、feign-api,创建完成后的整体项目结构如下:
  • 四、完善feign-api、feign-provider、feign-consumer项目
    • 1. springcloud-stu pom.xml中去掉spring-boot-maven-plugin
    • 2. openfeign-stu pom.xml中修改为如下:
    • 3. feign-api 完善
    • 4. feign-provider 完善
      • 4.1 pom.xml添加feign-api依赖,及增加spring-boot-maven-plugin插件
      • 4.2 ProductController.java
      • 4.3 ProductMapper.xml
      • 4.4 Product.java
      • 4.5 ProductServiceImpl.java
      • 4.6 ProductService.java
      • 4.7 ProviderApplication.java
      • 4.8 ProductMapper.xml
      • 4.9 application.yml
      • 4.10 sql脚本
    • 5. feign-consumer 完善
      • 5.1 pom.xml添加feign-api依赖,及增加spring-boot-maven-plugin插件
      • 5.2 RestConfig.java
      • 5.3 ProductConsumerController.java
      • 5.4 ConsumerApplication.java
      • 5.5 application.yml
  • 五、测试项目
    • 六 总结

      本文主要是创建两个springboot服务,以在该系列后面的教程中增添springcloud相关组件

      一、创建父项目

      1. 选择Spring Initializr

      2. Type选择为Maven POM,Java Version选择为8

      3. 勾选一些基本的依赖,如lombok和spring-boot-starter-web

      4. 创建好了的父项目结构如下:

      二、创建二级项目

      1. 选择新建Module

      2. 选择Maven

      3. 填写Name

      4. 修改openfeign pom.xml文件,并删除掉该项目下的src文件

      5. 创建完成的项目结构如下

      三、创建子项目feign-provider、feign-consumer、feign-api

      1. 在feign-provider项目上新建模块

      2. 选择Parent为openfeign-stu

      3. 同上步骤创建feign-consumer、feign-api,创建完成后的整体项目结构如下:

      四、完善feign-api、feign-provider、feign-consumer项目

      1. springcloud-stu pom.xml中去掉spring-boot-maven-plugin

      修改为如下:

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <packaging>pom</packaging>
          <modules>
              <module>openfeign-stu</module>
          </modules>
          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.6.6</version>
              <relativePath/> <!-- lookup parent from repository -->
          </parent>
          <groupId>com.wq</groupId>
          <artifactId>springcloud-stu</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <name>springcloud-stu</name>
          <description>Demo project for Spring Boot</description>
          <properties>
              <java.version>1.8</java.version>
          </properties>
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
              </dependency>
      
              <dependency>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
                  <optional>true</optional>
              </dependency>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>
                  <scope>test</scope>
              </dependency>
          </dependencies>
          
      </project>
      
      

      2. openfeign-stu pom.xml中修改为如下:

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="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>springcloud-stu</artifactId>
              <groupId>com.wq</groupId>
              <version>0.0.1-SNAPSHOT</version>
          </parent>
          <modelVersion>4.0.0</modelVersion>
          <artifactId>openfeign-stu</artifactId>
          <packaging>pom</packaging>
          <modules>
              <module>feign-provider</module>
              <module>feign-consumer</module>
              <module>feign-api</module>
          </modules>
          <dependencies>
              <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
              </dependency>
                  <groupId>org.mybatis.spring.boot</groupId>
                  <artifactId>mybatis-spring-boot-starter</artifactId>
                  <version>2.2.2</version>
          </dependencies>
      </project>
      

      3. feign-api 完善

      feign-api的项目清单如下:

      Result的内容如下:

      package com.wq.feign.api.domain;
      import lombok.AllArgsConstructor;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      @Data
      @NoArgsConstructor
      @AllArgsConstructor
      public class Result {
          private int code;
          private String msg;
          private Object data;
      }
      

      pom.xml内容就是创建时的内容,不做改动

      4. feign-provider 完善

      完善后的项目结构如下:

      4.1 pom.xml添加feign-api依赖,及增加spring-boot-maven-plugin插件

      修改为如下:

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="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>openfeign-stu</artifactId>
              <groupId>com.wq</groupId>
              <version>0.0.1-SNAPSHOT</version>
          </parent>
          <modelVersion>4.0.0</modelVersion>
          <artifactId>feign-provider</artifactId>
          
          <dependencies>
              <dependency>
                  <groupId>com.wq</groupId>
                  <artifactId>feign-api</artifactId>
                  <version>0.0.1-SNAPSHOT</version>
              </dependency>
          </dependencies>
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                      <configuration>
                          <excludes>
                              <exclude>
                                  <groupId>org.projectlombok</groupId>
                                  <artifactId>lombok</artifactId>
                              </exclude>
                          </excludes>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
      </project>
      

      4.2 ProductController.java

      package com.wq.feign.provider.controller;
      import com.wq.feign.api.domain.Result;
      import com.wq.feign.provider.domain.entity.Product;
      import com.wq.feign.provider.service.ProductService;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.web.bind.annotation.*;
      import javax.annotation.Resource;
      @RestController
      @Slf4j
      @RequestMapping("/")
      public class ProductController {
          @Resource
          private ProductService productService;
          /**
           * 查询
           * @param id
           * @return
           */
          @GetMapping("product/provider/get/{id}")
          public Result selectById(@PathVariable("id") Long id){
              return new Result(200, "查询成功", productService.selectById(id));
          }
           * 删除
          @GetMapping("product/provider/delete/{id}")
          public Result deleteById(@PathVariable("id") Long id){
              return new Result(200, "删除成功", productService.deleteById(id));
           * 修改
           * @param product
          @PostMapping("product/provider/update")
          public Result updateById(@RequestBody Product product){
              return new Result(200, "修改成功", productService.updateById(product.getId(), product.getName()));
           * 新增
          @PutMapping( "product/provider/add")
          public Result insertById(@RequestBody Product product){
              return new Result(200, "修改成功", productService.insertOne(product));
      }
      

      4.3 ProductMapper.xml

      package com.wq.feign.provider.dao;
      import com.wq.feign.provider.domain.entity.Product;
      import org.apache.ibatis.annotations.Param;
      import org.springframework.stereotype.Repository;
      @Repository
      public interface ProductMapper {
          /**
           * 查询
           * @param id
           * @return
           */
          public Product selectById(@Param("id") Long id);
           * 删除
          public int deleteById(@Param("id") Long id);
           * 修改
           * @param name
          public int updateById(@Param("id") Long id, @Param("name") String name);
           * 新增
           * @param product
          public int insertOne(Product product);
      }
      

      4.4 Product.java

      package com.wq.feign.provider.domain.entity;
      import lombok.Data;
      @Data
      public class Product {
          private Long id;
          private String name;
          private int stock;
      }
      

      4.5 ProductServiceImpl.java

      package com.wq.feign.provider.service.impl;
      import com.wq.feign.provider.dao.ProductMapper;
      import com.wq.feign.provider.domain.entity.Product;
      import com.wq.feign.provider.service.ProductService;
      import org.springframework.stereotype.Service;
      import javax.annotation.Resource;
      @Service
      public class ProductServiceImpl implements ProductService {
          @Resource
          private ProductMapper productMapper;
          public Product selectById(Long id) {
              return productMapper.selectById(id);
          }
          public int deleteById(Long id) {
              return productMapper.deleteById(id);
          public int updateById(Long id, String name) {
              return productMapper.updateById(id, name);
          public int insertOne(Product product) {
              return productMapper.insertOne(product);
      }
      

      4.6 ProductService.java

      package com.wq.feign.provider.service;
      import com.wq.feign.provider.domain.entity.Product;
      /**
       * 商品服务类
       */
      public interface ProductService {
          /**
           * 查询
           * @param id
           * @return
           */
          public Product selectById(Long id);
           * 删除
          public int deleteById(Long id);
           * 修改
           * @param name
          public int updateById(Long id, String name);
           * 新增
           * @param product
          public int insertOne(Product product);
      }
      

      4.7 ProviderApplication.java

      package com.wq.feign.provider;
      import org.mybatis.spring.annotation.MapperScan;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      @SpringBootApplication
      @MapperScan("com.wq.feign.provider.dao")
      public class ProviderApplication {
          public static void main(String[] args) {
              SpringApplication.run(ProviderApplication.class, args);
          }
      }
      

      4.8 ProductMapper.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="com.wq.feign.provider.dao.ProductMapper">
          <resultMap id="BaseResultMap" type="com.wq.feign.provider.domain.entity.Product">
              <result column="id" jdbcType="BIGINT" property="id" />
              <result column="name" jdbcType="VARCHAR" property="name" />
              <result column="stock" jdbcType="INTEGER" property="stock" />
          </resultMap>
          <!--查询-->
          <select id="selectById" resultType="com.wq.feign.provider.domain.entity.Product">
              select * from product where id = #{id}
          </select>
          <!--删除-->
          <delete id="deleteById" parameterType="java.lang.Long">
              delete from product where id = #{id}
          </delete>
          <!--修改-->
          <update id="updateById" parameterType="com.wq.feign.provider.domain.entity.Product">
              update product set name = #{name} where id = #{id}
          </update>
          <!--新增-->
          <insert id="insertOne" parameterType="com.wq.feign.provider.domain.entity.Product">
             insert into product(name, stock) values (#{name}, #{stock})
          </insert>
      </mapper>
      

      4.9 application.yml

      server:
        port: 8081
      spring:
        application:
          name: feign-provider-8081
        datasource:
          url: jdbc:mysql://localhost:3306/springcloud-stu?useUnicode=true&characterEncoding=utf8&userSSL=false
          driverClassName: com.mysql.cj.jdbc.Driver
          username: root
          password: 123456
      mybatis:
        mapper-locations: classpath:mapper/*Mapper.xml # Mybatis 映射文件位置
        type-aliases-package: com.wq.feign.provider.domain.entity  # 表对应的实体类包
      

      4.10 sql脚本

      DROP TABLE IF EXISTS `product`;
      CREATE TABLE `product`  (
        `id` bigint(20) NOT NULL AUTO_INCREMENT,
        `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
        `stock` int(10) UNSIGNED NULL DEFAULT NULL,
        PRIMARY KEY (`id`) USING BTREE
      ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
      
      -- ----------------------------
      -- Records of product
      INSERT INTO `product` VALUES (1, '华为 mate10', 10);
      INSERT INTO `product` VALUES (2, '华为 mate20', 20);
      INSERT INTO `product` VALUES (3, '华为 mate30', 30);
      

      5. feign-consumer 完善

      完善后的项目结构如下

      5.1 pom.xml添加feign-api依赖,及增加spring-boot-maven-plugin插件

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="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>openfeign-stu</artifactId>
              <groupId>com.wq</groupId>
              <version>0.0.1-SNAPSHOT</version>
          </parent>
          <modelVersion>4.0.0</modelVersion>
          <artifactId>feign-consumer</artifactId>
          <dependencies>
              <dependency>
                  <groupId>com.wq</groupId>
                  <artifactId>feign-api</artifactId>
                  <version>0.0.1-SNAPSHOT</version>
              </dependency>
          </dependencies>
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                      <configuration>
                          <excludes>
                              <exclude>
                                  <groupId>org.projectlombok</groupId>
                                  <artifactId>lombok</artifactId>
                              </exclude>
                          </excludes>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
      </project>
      

      5.2 RestConfig.java

      package com.wq.feign.consumer.config;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.web.client.RestTemplate;
      @Configuration
      public class RestConfig {
          @Bean
          public RestTemplate getRestTemplate(){
              return new RestTemplate();
          }
      }
      

      5.3 ProductConsumerController.java

      package com.wq.feign.consumer.controller;
      import com.wq.feign.api.domain.Result;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.PathVariable;
      import org.springframework.web.bind.annotation.RestController;
      import org.springframework.web.client.RestTemplate;
      import javax.annotation.Resource;
      @RestController
      public class ProductConsumerController {
          @Resource
          RestTemplate restTemplate;
          public static String url = "http://localhost:8081/";
          /**
           * 查询
           * @param id
           * @return
           */
          @GetMapping("product/consumer/get/{id}")
          public Result selectById(@PathVariable("id") Long id){
              return restTemplate.getForObject(url+"product/provider/get/"+id, Result.class);
          }
      }
      

      5.4 ConsumerApplication.java

      package com.wq.feign.consumer;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
      @SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
      public class ConsumerApplication {
          public static void main(String[] args) {
              SpringApplication.run(ConsumerApplication.class, args);
          }
      }
      

      5.5 application.yml

      server:
        port: 8082
      spring:
        application:
          name: feign-consumer-8082

      五、测试项目

      启动ProviderApplication和ConsumerApplication

      使用浏览器访问,得到结果如下:

      六 总结

      我们至此创建了一个多模块的项目,然后有一个商品服务提供者feign-provider-8081 和一个商品服务消费者feign-consumer-8082 。

      然后这就是最简单的两个微服务了,实现了功能的解耦。

      但是这个简单的微服务存在着很多问题:

      比如都用公共的实体类Result,还有提供者地址在消费者里面写死了等等,这些问题,我们接下来会一一解决。

      在线客服
      服务热线

      服务热线

      4008888355

      微信咨询
      二维码
      返回顶部
      ×二维码

      截屏,微信识别二维码

      打开微信

      微信号已复制,请打开微信添加咨询详情!