从零开始学习Spring Cloud Alibaba (二)

构建项目工程 添加公共核心模块 配置nacos完成注册中心和配置中心,添加网关聚合文档,内容有点多但都是粘贴复制

我们做一个在线客服系统项目就叫im-parent
  1. 构建项目父工程,我先先添加网关和用户服务和公共类这三个服务添加子项目最终的结构如:

    image-20250625213447882

  2. 在父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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.aihe.im</groupId>
    <artifactId>im-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>im-gateway</module>
        <module>im-user</module>
        <module>im-common</module>
    </modules>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.boot.version>3.3.4</spring.boot.version>
        <spring.cloud.version>2023.0.3</spring.cloud.version>
        <spring.cloud.alibaba.version>2023.0.3.2</spring.cloud.alibaba.version>
        <netty.version>4.1.95.Final</netty.version>
        <lombok.version>1.18.30</lombok.version>
        <knife4j.version>4.5.0</knife4j.version>
        <mybatis.version>3.5.12</mybatis.version>
        <mysql.version>8.0.32</mysql.version>
        <mapstruct.version>1.5.5.Final</mapstruct.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>

            <!-- Spring Cloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Spring Cloud Alibaba -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Knife4j -->
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
                <version>${knife4j.version}</version>
            </dependency>


            <!-- mysql驱动 -->
            <dependency>
                <groupId>com.mysql</groupId>
                <artifactId>mysql-connector-j</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <!-- MyBatis Plus -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-jsqlparser</artifactId>
                <version>${mybatis.version}</version>
            </dependency>

            <!-- org.mapstruct -->
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct</artifactId>
                <version>${mapstruct.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${mapstruct.version}</version>
                <scope>provided</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>
  1. 添加网关模块编写nacos配置中心和完成服务发现,对于application.yml 和bootstrap.yml 这些就不过多的告诉大家了,你只要知道bootstrap.yml比application.yml先执行就好了如下:

  • 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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.aihe.im</groupId>
        <artifactId>im-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>im-gateway</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!-- Spring Cloud Gateway -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!-- Spring Cloud Alibaba Nacos Discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- Spring Cloud Alibaba Nacos Config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!-- Spring Cloud LoadBalancer -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

        <!-- Spring Cloud Bootstrap  在某些 Spring Boot 2.4+Spring Boot 3.x 项目中,默认不再自动引入 bootstrap 上下文。-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <!-- Spring Boot WebFlux 网关使用 webflux模式不是传统的mvc模式-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <!-- Knife4j OpenAPI3 聚合文档支持 -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-gateway-spring-boot-starter</artifactId>
            <version>${knife4j.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  • 启动类

    package com.aihe.im.gateway;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    
    /**
     * @author 在下陈某
     * @package com.aihe.im.gateway
     * @description TODO
     * @date 2025/6/25 21:42
     */
    @SpringBootApplication
    @EnableDiscoveryClient
    @RefreshScope
    public class GatewayApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(GatewayApplication.class, args);
        }
    }
    
    
  • 配置文件信息

    spring:
      application:
        name: im-gateway
      config:
        import: nacos:im-gateway.yaml  #3.0后必需这样写从 Nacos 加载动态配置
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true
              lower-case-service-id: true
        nacos:
          server-addr: 127.0.0.1:8848
          namespace: 96d76d76-684e-497f-83d3-57ed01d80ac5  #命令空间ID
          username: nacos
          password: 123456
          discovery:
            enabled: true
          config:
            enabled: true
    
    
  • 登录nacos控制台新建一个命令空间

  • 在配置管理里面点击自定义的命令空间新建一个im-gateway.yaml配置文件

    image-20250625223043226

  • 配置内容如下:

    server:
      port: 10000 # 定义网关端口为10000
    spring:
      cloud:
        gateway:  # 网关路由 现在我们只有一个所以先加上user服务
          routes:
            - id: im-user
              uri: lb://user-service
              predicates:
                - Path=/user/**
              filters:
                - RewritePath=/api/user/(?<segment>.*), /$\{segment}
    
    # 开启网关聚合文档可以看到pom文件的坐标是:knife4j-gateway-spring-boot-starter 而不是 knife4j-openapi3-jakarta-spring-boot-starter
    knife4j:
      gateway:
        enabled: true
        strategy: discover
        discover:
          enabled: true
          version: openapi3
    
    
  • 这样就大功告成了 启动网关服务如下图表示就成功了:

    • 至此,网关我们就已经构建完成了
  1. 构建common通用模块,引入其它模块所需要的依赖, 定义全局异常,枚举,封装返回体,redis连接池,mybatis-plus等
  • 修改pom.xml,将cloud的这些依赖全部放到common中 然后其它的服务直接引用common模块即可
<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.aihe.im</groupId>
        <artifactId>im-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>im-common</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


    <dependencies>
        <!-- Knife4j Spring Boot Starter -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
        </dependency>

        <!-- Spring Cloud Alibaba Nacos Discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- Spring Cloud Alibaba Nacos Config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>


        <!-- LoadBalancer 支持(Feign 必须) -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

        <!-- Spring Cloud OpenFeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!-- Spring Cloud Alibaba Sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

        <!-- Spring Web (如果还没有) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Bootstrap(如果还没有) -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <!-- mysql -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>
        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
        </dependency>

        <!-- mybatis-plus 分页-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-jsqlparser</artifactId>
        </dependency>

        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- validation -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

        <!-- jwt -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.11.5</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.11.5</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.11.5</version>
        </dependency>
        <!-- Lombok(可选) -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
  • common 最终如下图:

  • 下面是每个文件的代码:

    1. errorEnum 失败枚举

      @Getter
      @AllArgsConstructor
      public enum ErrorEnum {
      
          /**
           * 全局错误定义
           */
          ERROR_TOKEN(10000, "无效的TOKEN"),
          EXP_TOKEN(10001, "TOKEN已过期"),
          ERROR(-1, "失败"),
          INTERNAL_SERVER_ERROR(500, "开小差了!请稍后尝试"),
          ;
      
          private final Integer code;
      
          private final String msg;
      }
      
      
    2. successEnum 全局成功枚举

      @Getter
      @AllArgsConstructor
      public enum SuccessEnum {
      
          /**
           * 全局成功返回
           */
          SUCCESS(200, "成功"),
          ;
      
          private final Integer code;
      
          private final String msg;
      }
      
    3. BusinessException 异常

      @Getter
      public class BusinessException extends RuntimeException implements Serializable {
      
          @Serial
          private static final long serialVersionUID = 1L;
      
          public Integer code;
      
          public String msg;
      
          public BusinessException(String errorMsg) {
              this.code = ErrorEnum.ERROR.getCode();
              this.msg = errorMsg;
          }
      
          public BusinessException(Integer errorCode, String errorMsg) {
              this.code = errorCode;
              this.msg = errorMsg;
          }
      
          public BusinessException(String msg, Throwable e) {
              super(msg, e);
              this.code = ErrorEnum.INTERNAL_SERVER_ERROR.getCode();
              this.msg = msg;
          }
      }
      
    4. GlobalExceptionHandler 异常

      @Slf4j
      @RestControllerAdvice
      public class GlobalExceptionHandler implements Serializable {
      
          @Serial
          private static final long serialVersionUID = 1L;
      
          /**
           * 自定义处理异常
           */
          @ExceptionHandler(value = BusinessException.class)
          public Result<Object> businessException(BusinessException e) {
              log.error(e.getMsg());
              return Result.error(e.getCode(), e.getMsg());
          }
      
          /**
           * 参数校验异常
           *
           */
          @ExceptionHandler(MethodArgumentNotValidException.class)
          public Result<Object> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
              // 从异常对象中拿到ObjectError对象
              ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
              String field = Objects.requireNonNull(e.getBindingResult().getFieldError()).getField();
              log.error(objectError.getDefaultMessage());
              return Result.error(objectError.getDefaultMessage());
          }
      
          /**
           * 请求方式异常
           */
          @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
          public Result<Object> httpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
              log.error(e.getMessage());
              return Result.error("非法的请求");
          }
      }
      
    5. BaseQuery 分页公共查询

      @Data
      @Schema # 使用新版的接口文档
      public class BaseQuery implements Serializable {
      
          @Serial
          private static final long serialVersionUID = 1L;
      
          @Schema(description = "当前页码")
          Integer pageNum = PagesConstant.DEFAULT_PAGE;
      
          @Range(min = 1, max = 200, message = "每页条数,取值范围 1-200")
          @Schema(description = "每页条数")
          Integer pageSize = PagesConstant.DEFAULT_PAGE_SIZE;
      
          @Schema(description = "排序字段")
          String order;
      
          @Schema(description = "是否升序")
          boolean asc;
      }
      
      
    6. MybatisPlusConfig 目前就一个分页

      Configuration
      @MapperScan("com.aihe.im.*")
      public class MybatisPlusConfig {
      
          @Bean
          public MybatisPlusInterceptor mybatisPlusInterceptor() {
              MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
              // 如果配置多个插件, 切记分页最后添加
              interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
              // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
              return interceptor;
          }
      }
      
      
    7. PagesConstant 分页常量

      public interface PagesConstant {
      
          /**
           * 默认页码
           */
          Integer DEFAULT_PAGE = 1;
      
          /**
           * 默认每页记录数
           */
          Integer DEFAULT_PAGE_SIZE = 20;
      }
      
      
    8. RedisConfig redis配置

      @Configuration
      public class RedisConfig {
      
          @Bean
          public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
              RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
              RedisSerializer<String> redisSerializer = new StringRedisSerializer();
              redisTemplate.setConnectionFactory(factory);
              //key序列化
              redisTemplate.setKeySerializer(redisSerializer);
              //value序列化
              redisTemplate.setValueSerializer(redisSerializer);
              //value hashmap序列化
              redisTemplate.setHashKeySerializer(redisSerializer);
              //key hashmap序列化
              redisTemplate.setHashValueSerializer(redisSerializer);
              return redisTemplate;
          }
      }
      
    9. RedisUtils redis封装

      @Component
      public class RedisUtils {
      
          private static RedisTemplate<String, Object> redisTemplate;
      
          public RedisUtils(RedisTemplate<String, Object> redisTemplate) {
              RedisUtils.redisTemplate = redisTemplate;
          }
      
          /**
           * 判断缓存是否存在
           * @param key 缓存key
           * @return 缓存是否存在
           */
          public static Boolean hasKey(String key){
              return redisTemplate.hasKey(key);
          }
      
          /**
           * 缓存数据
           * @param key 缓存key
           * @param value 缓存值
           */
          public static void put(String key, Object value){
              redisTemplate.opsForValue().set(key, value);
          }
          /**
           * 缓存数据
           * @param key 缓存key
           * @param value 缓存值
           * @param timeout 缓存失效时间,单位:秒
           */
          public static void put(String key, Object value, Long timeout){
              put(key, value, Duration.ofSeconds(timeout));
          }
      
          /**
           * 缓存数据
           * @param key 缓存key
           * @param value 缓存值
           * @param day 缓存失效时间,单位:天
           */
          public static void putDays(String key, Object value, Long day){
              put(key, value, Duration.ofDays(day));
          }
          /**
           * 缓存数据
           * @param key 缓存key
           * @param value 缓存值
           * @param timeout 缓存失效时间,单位:秒
           */
          public static void put(String key, Object value, Duration timeout){
              redisTemplate.opsForValue().set(key, value, timeout);
          }
      
          /**
           * 获取缓存
           * @param key 缓存key
           * @return 缓存值
           */
          public static Object get(String key) {
              return redisTemplate.opsForValue().get(key);
          }
      
          /**
           * 删除缓存
           * @param key 缓存key
           * @return 是否删除成功
           */
          public static Boolean delete(String key) {
              return redisTemplate.delete(key);
          }
      
          /**
           * 计数器加1
           * @param key
           * @return
           */
          public static Long increment(String key) {
              return redisTemplate.opsForValue().increment(key);
          }
      }
      
    10. PageResult 分页返回

      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class PageResult<T> implements Serializable {
      
          @Serial
          private static final long serialVersionUID = 1L;
      
          private Integer page;
      
          private Long total;
      
          private List<T> list;
      }
      
    11. PageUtils 分页查询封装 为以后简化查询代码

      public class PageUtils {
      
          /**
           * 分页类型封装
           * @param query 条件
           * @param clazz 类型
           * @return
           * @param <T>
           */
          public static <T> IPage<T> getPage(BaseQuery query, Class<T> clazz) {
              Page<T> page = new Page<>(query.getPageNum(), query.getPageSize());
              if (StringUtils.isNotBlank(query.getOrder())) {
                  if (query.isAsc()) {
                      page.addOrder(OrderItem.asc(query.getOrder()));
                  } else {
                      page.addOrder(OrderItem.desc(query.getOrder()));
                  }
              }
              return page;
          }
      }
      
    12. Result 全局返回封装

      @Data
      public class Result<T> implements Serializable {
      
          @Serial
          private static final long serialVersionUID = 1L;
      
          /**
           * 正常响应码
           */
          private static final int SUCCESS_CODE = SuccessEnum.SUCCESS.getCode();
      
          /**
           * 正常响应消息
           */
          private static final String SUCCESS_MSG = "success";
      
          /**
           * 错误码
           */
          private int code = SUCCESS_CODE;
      
          /**
           * 错误信息
           */
          private String msg = SUCCESS_MSG;
      
          /**
           * 响应内容,默认为null
           */
          private T data = null;
      
          public Result() {}
      
          @JsonIgnore
          public boolean isOK() {
              return code == SUCCESS_CODE;
          }
      
          /**
           * 无data的正常返回
           */
          public static Result success() {
              return new Result();
          }
      
      
          /**
           * 有data的正常返回
           *
           * @param data data内容
           * @param <T>  data类型
           */
          public static <T> Result<T> success(T data) {
              Result<T> response = new Result<>();
              response.setData(data);
              return response;
          }
      
          /**
           * @param errorCode
           * @param <T>
           * @return
           */
          public static <T> Result<T> error(Integer errorCode, String msg) {
              Result<T> response = new Result<>();
              response.setCode(errorCode);
              response.setMsg(msg);
              return response;
          }
      
          /**
           * 无data的失败返回
           *
           * @param msg 错误信息
           */
          public static <T> Result<T> error(String msg) {
              Result<T> response = new Result<>();
              response.setCode(ErrorEnum.ERROR.getCode());
              response.setMsg(msg);
              return response;
          }
      
          /**
           * 有data的失败返回
           * <br>
           * 失败返回的场景不多,所以没有严格要求T泛型
           *
           * @param msg 错误信息
           */
          public static <T> Result<T> error(String msg, T data) {
              Result<T> response = new Result<>();
              response.setCode(ErrorEnum.ERROR.getCode());
              response.setMsg(msg);
              response.setData(data);
              return response;
          }
      }
      

      至此我们就将基本的核心做好了

    13. 构建用户微服务

      • 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">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>com.aihe.im</groupId>
                <artifactId>im-parent</artifactId>
                <version>1.0-SNAPSHOT</version>
            </parent>
        
            <artifactId>im-user</artifactId>
        
            <properties>
                <maven.compiler.source>17</maven.compiler.source>
                <maven.compiler.target>17</maven.compiler.target>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            </properties>
        
            <dependencies>
                <dependency>
                    <groupId>com.aihe.im</groupId>
                    <artifactId>im-common</artifactId>
                    <version>1.0-SNAPSHOT</version>
                </dependency>
                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>org.mapstruct</groupId>
                    <artifactId>mapstruct</artifactId>
                </dependency>
                <dependency>
                    <groupId>org.mapstruct</groupId>
                    <artifactId>mapstruct-processor</artifactId>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
        
            <build>
                <plugins>
                    <!-- MapStruct 注解处理插件 -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <annotationProcessorPaths>
                                <path>
                                    <groupId>org.mapstruct</groupId>
                                    <artifactId>mapstruct-processor</artifactId>
                                    <version>${mapstruct.version}</version>
                                </path>
                                <path>
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok</artifactId>
                                    <version>${lombok.version}</version>
                                </path>
                            </annotationProcessorPaths>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </project>
        
      • 新建nacos配置文件信息同添加网关配置信息一样编写bootstrap和nacos

        1.boosstrap

        spring:
          application:
            name: im-user
          config:
            import: nacos:im-user.yaml
          cloud:
            gateway:
              discovery:
                locator:
                  enabled: true
                  lower-case-service-id: true
            nacos:
              server-addr: 127.0.0.1:8848
              namespace: 96d76d76-684e-497f-83d3-57ed01d80ac5
              username: nacos
              password: 123456
              discovery:
                enabled: true
              config:
                enabled: true
        
        1. Nacos 配置中心

          内容如下:

          server:
            port: 10001
          spring:
            datasource:
              driver-class-name: com.mysql.cj.jdbc.Driver
              username: mzjmc
              password: 123456
              url: jdbc:mysql://127.0.0.1:3306/customer-user?rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
          
      • 启动类如下:

        package com.aihe.im.user;
        
        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
        import org.springframework.cloud.context.config.annotation.RefreshScope;
        import org.springframework.cloud.openfeign.EnableFeignClients;
        import org.springframework.context.annotation.ComponentScan;
        
        /**
         * @author 在下陈某
         * @package com.aihe.im.user
         * @description TODO
         * @date 2025/6/25 23:21
         */
        @SpringBootApplication
        @EnableDiscoveryClient
        @EnableFeignClients
        @RefreshScope
        @ComponentScan(basePackages = {"com.aihe.im.*"})
        public class UserApplication {
        
            public static void main(String[] args) {
                SpringApplication.run(UserApplication.class, args);
            }
        }
        
        
      • 为了查看接口文档是否 我们建一个测试的controller 分别访问通过访问user服务和通过网关访问验证API接口文档是否接入成功

        package com.aihe.im.user.controller;
        
        import com.aihe.im.common.result.Result;
        import io.swagger.v3.oas.annotations.Operation;
        import io.swagger.v3.oas.annotations.tags.Tag;
        import lombok.RequiredArgsConstructor;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.web.bind.annotation.GetMapping;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RestController;
        
        /**
         * @author 在下陈某
         * @package com.aihe.im.user.controller
         * @description TODO
         * @date 2025/6/25 23:22
         */
        @RestController
        @RequestMapping("/api/user")
        @Tag(name = "用户服务", description = "用户信息相关接口")
        @RequiredArgsConstructor
        @Slf4j
        public class HelloController {
        
            @GetMapping("/hello")
            @Operation(summary = "测试接口", description = "返回用户服务问候语")
            public Result<String> sayHello() {
               String text = "Hello from user service!";
                return Result.success(text);
            }
        }
        
        
      • 访问用户微服务 127.0.0.1:10001/doc.html

      • 通过网关访问 127.0.0.1:10000/doc.html

    基础的框框已经搞定,完成了前期的准备工作,好困
    上一篇:从零开始学习Spring Cloud Alibaba (一)
    下一篇: 没有了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值