创建工程之前,先了解下版本对应关系
下面事例用的是
spring Cloud Goxton.SR9
ALibaba 2.2.6.RELEASE
SpringBoot 2.3.2.RELEASE
Spring脚手架创建
构建项目:约定 > 配置 > 编码
父工程
- 在IDEA中新建父工程(父工程用于约定整个SpringCloud项目的版本)
- Spring Boot版本(随便选择,后面需要修改)
- 删掉src文件目录并引入依赖:
- 依赖
<?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-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-alibaba</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.3.2.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR9</spring.cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
common
然后新建一个Module:common,以后主要是放置公共实体类以及公共工具类以及公共依赖,所以不需要启动类,以及test
插入一个知识点
maven-archetype-quickstart 默认的Archetype,基本内容包括:
1.一个包含junit依赖声明的pom.xml
2.src/main/java主代码目录及一个名为App的类
3.src/test/java测试代码目录及一个名为AppTest的测试用例
service
用上面的方法继续新建一个Module:service 用来放各种服务
entity
用上面的方法继续新建一个Module:entity 用来放实体对象
创建springBoot服务
在service 模块下新建springboot 服务项目 user
同理再创建一个exam 服务
目前的工程目录是这样的
引入依赖
公共common引入Nacos注册发现依赖 以及 springboot的web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos client-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
两个新建的module引入commons
<dependency>
<groupId>com.example</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
启动Nacos 并将服务注册上去
如何启动Nacos参考我之前的博文 Nacos2.0.3 Windows下的启动与配置
启动user,exam两个服务后查看Nacos 控制台
可以看到已经成功注册到Nacos服务中心
引入openfeign实现服务调用(服务可以互相调用,所以依赖可以加在公共服务里)
在common 的pom 中加入
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
然后在服务入口类加入@EnableFeignClients注解
exam服务写个接口:
user服务添加新建个feign包,用来存放服务调用接口
然后写user服务接口调用exam服务的接口:
访问
说明实现了实现负载均衡
实现流量卫兵的监控
公共引入依赖
<!--sentinel依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
然后配置user,exam服务的配置文件
sentinel:
enabled: true
transport:
dashboard: 127.0.0.1:8080 #sentinel 控制台地址
port: 8719 #这是固定的
先看下sentinel控制台,暂时没有对应的服务 sentinel控制台获取
访问接口后出现了如下内容
流量卫兵的监控完成了
管理配置文件(统一配置管理中心)
common引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
然后nacos新建一个生产命名空间:
然后去生产环境中配置:
然后修改user服务的application.yml文件为bootstrap.yml
如放在application.yml会导致项目启动报找不到配置属性错误,原因:application.yml与bootstrap.yml加载顺序优先级问题
bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等
application.yml(application.properties)
应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。加载顺序:bootstrap.yml > application.yml > application-dev(prod).yml > …
运行
说明启动成功
gateway
新建一个module 【gateway】并引入依赖 (mvc的web依赖跟gateway依赖冲突并且后续common还会引入很多jar包 网关这也用不到 所以gateway依赖自己单独引入)
配置文件
server:
port: 3333
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: 192.168.31.108:8848
password: nacos
# sentinel:
# enabled: true
# transport:
# dashboard: 127.0.0.1:8080 #sentinel 控制台地址
# port: 8719 #这是固定的
gateway:
globalcors:
discovery:
locator:
enabled: true
default-filters: #全局用于配置所有路由共享过滤器
- StripPrefix=1 #去掉- Path=/user 前缀
- PreserveHostHeader #发送原主机头
routes:
- id: user #指定唯一标识
uri: lb://user
predicates:
- Path=/user/** #指定路由规则
- id: exam #指定唯一标识
uri: lb://exam
predicates:
- Path=/exam/** #指定路由规则
management:
endpoints:
web:
exposure:
include: "*" #暴露路由的规则端点 /actuator/gateway/routes
StripPrefix是个什么东东?可以参考我的另一个博文 springCloud Gateway StripPrefix和PrefixPath过滤器的区别
启动
成功了
通过访问网关都能跳转到相应的服务接口上
负载均衡
通过gateway访问user服务,user服务调用的exam服务
到这里呢 一个简单springcloudAibaba 工程就算搭建完成了 后期继续加入 redis rocketMQ mysql MyBatis-Plus jwt 等 就是一个可以用于实际开发工程了