IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 搭建SpringClouldAlibaba微服务项目 -> 正文阅读

[Java知识库]搭建SpringClouldAlibaba微服务项目

1、需求

当前的需求是有一个微服务架构的后端提供接口,模拟数据返回给前端,后端暂不需要实现业务逻辑。
由此需求为:可创建微服务,有配置中心,有服务注册,有统一网关,支持服务间调用,可生成API文档。
微服务我们选用当前较火的SpringClouldAlibaba。
注册与配置中心使用nacos。
负载均衡使用ribbon。
网关使用SpringClould gateway。
服务调用使用SpringClould openfegin。
接口文档使用smart-doc+torna。

往下看的前提是nacos已经安装完毕,如果没有,请看我的:安装配置nacos

2、创建父项目

1、创建一个普通的spring boot项目作为父项目。
在这里插入图片描述
2、填写项目基本信息,注意此处打包类型需要是pom。
在这里插入图片描述3、选择依赖,什么都不选择。
在这里插入图片描述4、完成项目创建
在这里插入图片描述5、配置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 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <!-- 此处为所有微服务的父依赖 -->
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.3.2.RELEASE</version>
    </parent>

    <!-- 基础信息 -->
    <groupId>com.bteam</groupId>
    <artifactId>bt-erp-server</artifactId>
    <version>0.0.1</version>
    <name>bt-erp-server</name>
    <description>this is erp project of bteam</description>

    <!-- 打包方式为pom -->
    <packaging>pom</packaging>

    <!--统一管理版本号-->
    <properties>
        <!-- 统一Java版本为11-->
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <java.version>11</java.version>
        <!--依赖版本号-->
        <alibaba.cloud>2.2.6.RELEASE</alibaba.cloud>
        <spring.boot>2.3.2.RELEASE</spring.boot>
        <spring.cloud>Hoxton.SR9</spring.cloud>
        <mysql.version>8.0.22</mysql.version>
        <mybatisPlus.version>3.3.2</mybatisPlus.version>
        <log4j.version>1.2.17</log4j.version>
        <druid.version>1.1.22</druid.version>
    </properties>

    <dependencies>
        <!-- ============ 以下为所有子模块共用依赖 =========== -->

        <!-- springboot web依赖 -->
        <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.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <!-- 本身不引入jar包 ,子模块继承之后:锁定版本+子模块不用写groupId和version  -->
    <dependencyManagement>
        <dependencies>

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

            <!--spring cloud 依赖,即使用了alibaba,我们仍可能会用到spring cloud里的东西-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

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

            <!--mysql连接驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <!--druid数据源-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <!-- 日志 -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>

            <!-- mybatis-plus -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatisPlus.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>

            <!-- smart-doc api文档插件-->
            <plugin>
                <groupId>com.github.shalousun</groupId>
                <artifactId>smart-doc-maven-plugin</artifactId>
                <version>2.2.8</version>
                <configuration>

                    <!--指定生成文档的使用的配置文件-->
                    <configFile>./src/main/resources/smart-doc.json</configFile>

                    <!--指定项目名称-->
                    <projectName>B-TEAM-ERP</projectName>

                    <includes>
                        <!--格式为:groupId:artifactId;-->
                        <include>com.alibaba:fastjson</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

父项目就算是配置好了。

3、创建微服务项目

在这里我创建一个微服务名为:sale-service的微服务。
使用maven创建即可
在这里插入图片描述
在这里插入图片描述
创建完毕后在resource下创建application.ymlbootstrap.yml文件方便后续配置。
mian/java下创建包com.bteam
在包下创建启动类:SaleServiceApplication

在这里插入图片描述
完毕后你的结构应该和上面的一致。接下来编写配置文件
bootstrap.yml中配置应用名与nacos连接信息

spring:
  application:
    name: sale-service
  cloud:
    nacos:
      discovery:
        server-addr: 102.108.333.222:111
      config:
        server-addr: 102.108.333.222:111
        username: bteam
        password: bteam
        namespace: public

application.yml中修改端口号

server:
  port: 8801

创建一个controller包,在其中创建一个OrderController测试这个微服务运行是否正常。

package com.bteam.controller;

/**
 * @author 谭熙
 * @date 2021/10/26 12:11
 * @description 测试模块
 * @version 1.0
 */
@RestController
@RequestMapping("/sale/order")
public class OrderController {

    // 基本操作获取配置信息
    @Value("${server.port}")
    String port;

    @Value("${spring.application.name}")
    String serverName;

    /**
     * 测试接口2.0
     * @return 测试结果
     */
    @GetMapping("/test")
    public String getTestMsg(){
        return "恭喜您请求 http://"+serverName+":"+port+"/test 成功!";
    }

如此我们就完成第一个微服务的搭建。

4、服务间调用

为了演示服务间的调用,再创建一个common-api的微服务。
配置文件和上面的一致,只是需要修改服务名与端口号即可。
创建主启动类和一个CommonController
在这里插入图片描述

/**
 * @author 谭熙
 * @date 2021/10/26 13:28
 * @description 演示,后续删除
 * @version 1.0
 */
@RestController
public class CommonController {
    /**
     * 假设此接口为公共接口,提供给其他服务调用,
     * 你可以在sale-service中的fegin包下看到它的调用
     * @return 通用信息
     */
    @GetMapping("/common")
    public Map<String,Object> getCommon(){
        Map<String,Object> common = new HashMap<String, Object>();
        common.put("msg","你好,我从common-api服务中过来的哦");
        common.put("time", new Date());
        return common;
    }
}

OK,再sale-service这个服务中的pom.xml文件中,引入openfegin的依赖

<!-- openfeign服务调用 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- openfeign需要负载均衡,根据控制台提示,需配合ribbon使用 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

然后在主启动类上加@EnableFeignClients注解开启fegin。
在这里插入图片描述
创建一个包fegin,在其中创建一个接口

package com.bteam.fegin;

/**
 * @Author 谭熙
 * @Date 2021/10/26 13:58
 * @Description 这里定义fegin接口,接口的内容需要和你调用的服务对应接口的方法保持一致
 *  例如我这里调用了commons-api服务中的/current/user接口,而这个接口对用的方法是Map< String,Object > getCurrentUser()
 *  不信你看0.0
 * @Version 1.0
 */
@FeignClient(name = "commons-api")
public interface CommonsApiFegin {
    @GetMapping("/common")
    Map<String,Object> getCommon();
}

然后我们在OrderController中再编写一个接口测试

/*  注入这个fegin,我们就可以不必理会服务名和接口了,
    就像调用自己的方法调用别人的方法,简直不要太爽 */
@Autowired
CommonsApiUserFegin commonsApiFegin;

/**
 * 测试请求通用接口
 * @return common-api中过来的数据
 */
@GetMapping("/from_common_api")
public String getCurrentUserInfo(){
    return commonsApiUserFegin.getCommon().toString();
}

实测请求成功,这里就不演示了。

5、添加网关

网关是一个单独的微服务,所有请求都将被这个网关拦截,并由这个网关决定路由到哪个服务。
那么,先创建一个微服务叫gateway-security,因为后面的安全权限认证啥的也是在这里做的。
依然按照上面编写配置文件,修改服务名和端口号,创建主启动类。
在这里插入图片描述

由于是使用spring cloud gateway我们需要引入对用的依赖

<!-- gateway网关依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!-- 注意gateway与springboot的web组件冲突,需要排除,可将作用域设为test,打包后便不会冲突-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <scope>test</scope>
</dependency>

然后在application.yml文件中编写gateway配置

server:
  port: 8802
spring:
  cloud:
    gateway:
      # 开启网关拦截所有请求
      enabled: true
      # 配置路由,注意有s,说明可以配置多个路由
      routes:
        - id: sale-service # 路由的名字,是不是服务名不重要,但要求全局唯一,建议配合服务名
          uri: lb://sale-service # 要路由到的服务 格式为: lb:// + 服务名
          predicates: # 断言,也就是判断路径,要路由到哪个服务
            - Path=/sale/order/** # 如果以/sale/order/开头的请求,就全部打到sale-service服务上

然后我们就可以通过这个统一端口:8802去访问sale-service中所有以/sale/order开头的接口了。

6、接口文档配置

这里选用了smart-doc+torna,具体的介绍这里不在介绍,使用的原因是,受够swagger了,我有代码洁癖。
torna官网:http://torna.cn/
smart-doc仓库:https://gitee.com/smart-doc-team/smart-doc
注意,在此之前你需要先安装torna在本地或远程,安装其实就是下载就能用,官网安装说明解释得很好。
在这里插入图片描述

在创建父项目的时候我已经把smart-doc的插件引入了,可以回头看看,是的,我是创建完项目才写的笔记。
然后再每个微服务的resources下面创建stmart-doc.json文件进行配置就可以了

{
  "isStrict": false,
  "allInOne": true,
  "outPath": "D://bt-api",
  "coverOld": true,
  "createDebugPage": true,
  "projectName": "BT-ERP-API-DOC",
  "sortByTitle":true,
  "showAuthor":true,
  "requestFieldToUnderline":true,
  "responseFieldToUnderline":true,
  "inlineEnum":true,
  "allInOneDocFileName":"index.html",
  "requestExample":"true",
  "responseExample":"true",
  "displayActualType":true,
  "appToken": "f7261cb475504xxxxxx5a05bd4ba96bc", // 这里对应一个接口文档的一个api的token
  "appKey": "2021102xxxxxxx444032", // 这里对应空间管理生成的key
  "secret": "q5NZR31y8xxxxxxxxxx0K5td1XM<", // 这里对应空间管理生成的密匙
  "openUrl": "http://xx.1xx.xx5.2xx:7700/api" // 你torna的访问地址
}

生成接口文档需要执行插件,在idea中打开maven,选择你要生成文档的对应的微服务,点击图中的插件执行就可以了。
在这里插入图片描述
注意,smart-doc要求我们注释要编写规范,关于注释该怎么写,请详细阅读帮助文档

顺便一提,torna真香,结束。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-27 12:42:26  更:2021-10-27 12:43:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:00:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码