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>
<packaging>pom</packaging>
<properties>
<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>
<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>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${alibaba.cloud}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<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>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatisPlus.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<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>
<include>com.alibaba:fastjson</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
</project>
父项目就算是配置好了。
3、创建微服务项目
在这里我创建一个微服务名为:sale-service 的微服务。 使用maven创建即可 创建完毕后在resource下创建application.yml 和bootstrap.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;
@RestController
@RequestMapping("/sale/order")
public class OrderController {
@Value("${server.port}")
String port;
@Value("${spring.application.name}")
String serverName;
@GetMapping("/test")
public String getTestMsg(){
return "恭喜您请求 http://"+serverName+":"+port+"/test 成功!";
}
如此我们就完成第一个微服务的搭建。
4、服务间调用
为了演示服务间的调用,再创建一个common-api 的微服务。 配置文件和上面的一致,只是需要修改服务名与端口号即可。 创建主启动类和一个CommonController
@RestController
public class CommonController {
@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的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
然后在主启动类上加@EnableFeignClients 注解开启fegin。 创建一个包fegin,在其中创建一个接口
package com.bteam.fegin;
@FeignClient(name = "commons-api")
public interface CommonsApiFegin {
@GetMapping("/common")
Map<String,Object> getCommon();
}
然后我们在OrderController 中再编写一个接口测试
@Autowired
CommonsApiUserFegin commonsApiFegin;
@GetMapping("/from_common_api")
public String getCurrentUserInfo(){
return commonsApiUserFegin.getCommon().toString();
}
实测请求成功,这里就不演示了。
5、添加网关
网关是一个单独的微服务,所有请求都将被这个网关拦截,并由这个网关决定路由到哪个服务。 那么,先创建一个微服务叫gateway-security ,因为后面的安全权限认证啥的也是在这里做的。 依然按照上面编写配置文件,修改服务名和端口号,创建主启动类。
由于是使用spring cloud gateway 我们需要引入对用的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<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
routes:
- id: sale-service
uri: lb://sale-service
predicates:
- Path=/sale/order/**
然后我们就可以通过这个统一端口: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",
"appKey": "2021102xxxxxxx444032",
"secret": "q5NZR31y8xxxxxxxxxx0K5td1XM<",
"openUrl": "http://xx.1xx.xx5.2xx:7700/api"
}
生成接口文档需要执行插件,在idea中打开maven,选择你要生成文档的对应的微服务,点击图中的插件执行就可以了。 注意,smart-doc要求我们注释要编写规范,关于注释该怎么写,请详细阅读帮助文档
顺便一提,torna真香,结束。
|